Line data Source code
1 : /*-------------------------------------------------------------------------
2 : *
3 : * checksum.c
4 : * Checksum implementation for data pages.
5 : *
6 : * Portions Copyright (c) 1996-2026, PostgreSQL Global Development Group
7 : * Portions Copyright (c) 1994, Regents of the University of California
8 : *
9 : * IDENTIFICATION
10 : * src/backend/storage/page/checksum.c
11 : *
12 : *-------------------------------------------------------------------------
13 : */
14 : #include "postgres.h"
15 :
16 : #include "port/pg_cpu.h"
17 : #include "storage/checksum.h"
18 : /*
19 : * The actual code is in storage/checksum_impl.h. This is done so that
20 : * external programs can incorporate the checksum code by #include'ing
21 : * that file from the exported Postgres headers. (Compare our legacy
22 : * CRC code in pg_crc.h.)
23 : * The PG_CHECKSUM_INTERNAL symbol allows core to use hardware-specific
24 : * coding without affecting external programs.
25 : */
26 : #define PG_CHECKSUM_INTERNAL
27 : #include "storage/checksum_impl.h" /* IWYU pragma: keep */
28 :
29 :
30 : static uint32
31 0 : pg_checksum_block_fallback(const PGChecksummablePage *page)
32 : {
33 : #include "storage/checksum_block_internal.h"
34 : }
35 :
36 : /*
37 : * AVX2-optimized block checksum algorithm.
38 : */
39 : #ifdef USE_AVX2_WITH_RUNTIME_CHECK
40 : pg_attribute_target("avx2")
41 : static uint32
42 2628547 : pg_checksum_block_avx2(const PGChecksummablePage *page)
43 : {
44 : #include "storage/checksum_block_internal.h"
45 : }
46 : #endif /* USE_AVX2_WITH_RUNTIME_CHECK */
47 :
48 : /*
49 : * Choose the best available checksum implementation.
50 : */
51 : static uint32
52 11127 : pg_checksum_choose(const PGChecksummablePage *page)
53 : {
54 11127 : pg_checksum_block = pg_checksum_block_fallback;
55 :
56 : #ifdef USE_AVX2_WITH_RUNTIME_CHECK
57 11127 : if (x86_feature_available(PG_AVX2))
58 11127 : pg_checksum_block = pg_checksum_block_avx2;
59 : #endif
60 :
61 11127 : return pg_checksum_block(page);
62 : }
63 :
64 : static uint32 (*pg_checksum_block) (const PGChecksummablePage *page) = pg_checksum_choose;
|