PostgreSQL Source Code git master
Functions
aio_init.c File Reference
#include "postgres.h"
#include "miscadmin.h"
#include "storage/aio.h"
#include "storage/aio_internal.h"
#include "storage/aio_subsys.h"
#include "storage/bufmgr.h"
#include "storage/io_worker.h"
#include "storage/ipc.h"
#include "storage/proc.h"
#include "storage/shmem.h"
#include "utils/guc.h"
Include dependency graph for aio_init.c:

Go to the source code of this file.

Functions

static Size  AioCtlShmemSize (void)
 
static uint32  AioProcs (void)
 
static Size  AioBackendShmemSize (void)
 
static Size  AioHandleShmemSize (void)
 
static Size  AioHandleIOVShmemSize (void)
 
static Size  AioHandleDataShmemSize (void)
 
static int  AioChooseMaxConcurrency (void)
 
Size  AioShmemSize (void)
 
void  AioShmemInit (void)
 
void  pgaio_init_backend (void)
 

Function Documentation

AioBackendShmemSize()

static Size AioBackendShmemSize ( void  )
static

Definition at line 49 of file aio_init.c.

50{
51 return mul_size(AioProcs(), sizeof(PgAioBackend));
52}
static uint32 AioProcs(void)
Definition: aio_init.c:38
Size mul_size(Size s1, Size s2)
Definition: shmem.c:510

References AioProcs(), and mul_size().

Referenced by AioShmemInit(), and AioShmemSize().

AioChooseMaxConcurrency()

static int AioChooseMaxConcurrency ( void  )
static

Definition at line 97 of file aio_init.c.

98{
99 uint32 max_backends;
100 int max_proportional_pins;
101
102 /* Similar logic to LimitAdditionalPins() */
103 max_backends = MaxBackends + NUM_AUXILIARY_PROCS;
104 max_proportional_pins = NBuffers / max_backends;
105
106 max_proportional_pins = Max(max_proportional_pins, 1);
107
108 /* apply upper limit */
109 return Min(max_proportional_pins, 64);
110}
#define Min(x, y)
Definition: c.h:1003
#define Max(x, y)
Definition: c.h:997
uint32_t uint32
Definition: c.h:538
int NBuffers
Definition: globals.c:142
int MaxBackends
Definition: globals.c:146
#define NUM_AUXILIARY_PROCS
Definition: proc.h:463

References Max, MaxBackends, Min, NBuffers, and NUM_AUXILIARY_PROCS.

Referenced by AioShmemSize().

AioCtlShmemSize()

static Size AioCtlShmemSize ( void  )
static

Definition at line 31 of file aio_init.c.

32{
33 /* pgaio_ctl itself */
34 return sizeof(PgAioCtl);
35}
struct PgAioCtl PgAioCtl

Referenced by AioShmemInit(), and AioShmemSize().

AioHandleDataShmemSize()

static Size AioHandleDataShmemSize ( void  )
static

Definition at line 79 of file aio_init.c.

80{
81 /* each buffer referenced by an iovec can have associated data */
82 return mul_size(sizeof(uint64),
85}
int io_max_concurrency
Definition: aio.c:75
int io_max_combine_limit
Definition: bufmgr.c:172
uint64_t uint64
Definition: c.h:539

References AioProcs(), io_max_combine_limit, io_max_concurrency, and mul_size().

Referenced by AioShmemInit(), and AioShmemSize().

AioHandleIOVShmemSize()

static Size AioHandleIOVShmemSize ( void  )
static

Definition at line 70 of file aio_init.c.

71{
72 /* each IO handle can have up to io_max_combine_limit iovec objects */
73 return mul_size(sizeof(struct iovec),
76}

References AioProcs(), io_max_combine_limit, io_max_concurrency, and mul_size().

Referenced by AioShmemInit(), and AioShmemSize().

AioHandleShmemSize()

static Size AioHandleShmemSize ( void  )
static

Definition at line 55 of file aio_init.c.

56{
57 Size sz;
58
59 /* verify AioChooseMaxConcurrency() did its thing */
61
62 /* io handles */
63 sz = mul_size(AioProcs(),
65
66 return sz;
67}
size_t Size
Definition: c.h:610
Assert(PointerIsAligned(start, uint64))

References AioProcs(), Assert(), io_max_concurrency, and mul_size().

Referenced by AioShmemInit(), and AioShmemSize().

AioProcs()

static uint32 AioProcs ( void  )
static

Definition at line 38 of file aio_init.c.

39{
40 /*
41 * While AIO workers don't need their own AIO context, we can't currently
42 * guarantee nothing gets assigned to the a ProcNumber for an IO worker if
43 * we just subtracted MAX_IO_WORKERS.
44 */
46}

References MaxBackends, and NUM_AUXILIARY_PROCS.

Referenced by AioBackendShmemSize(), AioHandleDataShmemSize(), AioHandleIOVShmemSize(), AioHandleShmemSize(), AioShmemInit(), and pgaio_init_backend().

AioShmemInit()

void AioShmemInit ( void  )

Definition at line 149 of file aio_init.c.

150{
151 bool found;
152 uint32 io_handle_off = 0;
153 uint32 iovec_off = 0;
154 uint32 per_backend_iovecs = io_max_concurrency * io_max_combine_limit;
155
156 pgaio_ctl = (PgAioCtl *)
157 ShmemInitStruct("AioCtl", AioCtlShmemSize(), &found);
158
159 if (found)
160 goto out;
161
162 memset(pgaio_ctl, 0, AioCtlShmemSize());
163
165 pgaio_ctl->iovec_count = AioProcs() * per_backend_iovecs;
166
168 ShmemInitStruct("AioBackend", AioBackendShmemSize(), &found);
169
171 ShmemInitStruct("AioHandle", AioHandleShmemSize(), &found);
172
173 pgaio_ctl->iovecs = (struct iovec *)
174 ShmemInitStruct("AioHandleIOV", AioHandleIOVShmemSize(), &found);
176 ShmemInitStruct("AioHandleData", AioHandleDataShmemSize(), &found);
177
178 for (int procno = 0; procno < AioProcs(); procno++)
179 {
180 PgAioBackend *bs = &pgaio_ctl->backend_state[procno];
181
182 bs->io_handle_off = io_handle_off;
183 io_handle_off += io_max_concurrency;
184
185 dclist_init(&bs->idle_ios);
186 memset(bs->staged_ios, 0, sizeof(PgAioHandle *) * PGAIO_SUBMIT_BATCH_SIZE);
188
189 /* initialize per-backend IOs */
190 for (int i = 0; i < io_max_concurrency; i++)
191 {
193
194 ioh->generation = 1;
195 ioh->owner_procno = procno;
196 ioh->iovec_off = iovec_off;
197 ioh->handle_data_len = 0;
198 ioh->report_return = NULL;
199 ioh->resowner = NULL;
200 ioh->num_callbacks = 0;
202 ioh->flags = 0;
203
205
206 dclist_push_tail(&bs->idle_ios, &ioh->node);
207 iovec_off += io_max_combine_limit;
208 }
209 }
210
211out:
212 /* Initialize IO method specific resources. */
215}
PgAioCtl * pgaio_ctl
Definition: aio.c:78
const IoMethodOps * pgaio_method_ops
Definition: aio.c:93
static Size AioHandleIOVShmemSize(void)
Definition: aio_init.c:70
static Size AioHandleDataShmemSize(void)
Definition: aio_init.c:79
static Size AioHandleShmemSize(void)
Definition: aio_init.c:55
static Size AioBackendShmemSize(void)
Definition: aio_init.c:49
static Size AioCtlShmemSize(void)
Definition: aio_init.c:31
#define PGAIO_SUBMIT_BATCH_SIZE
Definition: aio_internal.h:28
@ PGAIO_RS_UNKNOWN
Definition: aio_types.h:80
void ConditionVariableInit(ConditionVariable *cv)
static void dclist_push_tail(dclist_head *head, dlist_node *node)
Definition: ilist.h:709
static void dclist_init(dclist_head *head)
Definition: ilist.h:671
i
int i
Definition: isn.c:77
void * ShmemInitStruct(const char *name, Size size, bool *foundPtr)
Definition: shmem.c:387
void(* shmem_init)(bool first_time)
Definition: aio_internal.h:283
uint32 io_handle_off
Definition: aio_internal.h:194
dclist_head in_flight_ios
Definition: aio_internal.h:225
dclist_head idle_ios
Definition: aio_internal.h:197
PgAioHandle * staged_ios[PGAIO_SUBMIT_BATCH_SIZE]
Definition: aio_internal.h:215
uint32 iovec_count
Definition: aio_internal.h:239
struct iovec * iovecs
Definition: aio_internal.h:240
PgAioHandle * io_handles
Definition: aio_internal.h:252
uint32 io_handle_count
Definition: aio_internal.h:251
uint64 * handle_data
Definition: aio_internal.h:249
PgAioBackend * backend_state
Definition: aio_internal.h:232
struct ResourceOwnerData * resowner
Definition: aio_internal.h:148
int32 owner_procno
Definition: aio_internal.h:131
PgAioResult distilled_result
Definition: aio_internal.h:162
dlist_node node
Definition: aio_internal.h:146
uint8 handle_data_len
Definition: aio_internal.h:128
PgAioReturn * report_return
Definition: aio_internal.h:177
uint32 iovec_off
Definition: aio_internal.h:170
uint64 generation
Definition: aio_internal.h:152
uint8 flags
Definition: aio_internal.h:114
uint8 num_callbacks
Definition: aio_internal.h:116
ConditionVariable cv
Definition: aio_internal.h:159
uint32 status
Definition: aio_types.h:108

References AioBackendShmemSize(), AioCtlShmemSize(), AioHandleDataShmemSize(), AioHandleIOVShmemSize(), AioHandleShmemSize(), AioProcs(), PgAioCtl::backend_state, ConditionVariableInit(), PgAioHandle::cv, dclist_init(), dclist_push_tail(), PgAioHandle::distilled_result, PgAioHandle::flags, PgAioHandle::generation, PgAioCtl::handle_data, PgAioHandle::handle_data_len, i, PgAioBackend::idle_ios, PgAioBackend::in_flight_ios, PgAioCtl::io_handle_count, PgAioBackend::io_handle_off, PgAioCtl::io_handles, io_max_combine_limit, io_max_concurrency, PgAioCtl::iovec_count, PgAioHandle::iovec_off, PgAioCtl::iovecs, PgAioHandle::node, PgAioHandle::num_callbacks, PgAioHandle::owner_procno, pgaio_ctl, pgaio_method_ops, PGAIO_RS_UNKNOWN, PGAIO_SUBMIT_BATCH_SIZE, PgAioHandle::report_return, PgAioHandle::resowner, IoMethodOps::shmem_init, ShmemInitStruct(), PgAioBackend::staged_ios, and PgAioResult::status.

Referenced by CreateOrAttachShmemStructs().

AioShmemSize()

Size AioShmemSize ( void  )

Definition at line 113 of file aio_init.c.

114{
115 Size sz = 0;
116
117 /*
118 * We prefer to report this value's source as PGC_S_DYNAMIC_DEFAULT.
119 * However, if the DBA explicitly set io_max_concurrency = -1 in the
120 * config file, then PGC_S_DYNAMIC_DEFAULT will fail to override that and
121 * we must force the matter with PGC_S_OVERRIDE.
122 */
123 if (io_max_concurrency == -1)
124 {
125 char buf[32];
126
127 snprintf(buf, sizeof(buf), "%d", AioChooseMaxConcurrency());
128 SetConfigOption("io_max_concurrency", buf, PGC_POSTMASTER,
130 if (io_max_concurrency == -1) /* failed to apply it? */
131 SetConfigOption("io_max_concurrency", buf, PGC_POSTMASTER,
133 }
134
135 sz = add_size(sz, AioCtlShmemSize());
136 sz = add_size(sz, AioBackendShmemSize());
137 sz = add_size(sz, AioHandleShmemSize());
140
141 /* Reserve space for method specific resources. */
144
145 return sz;
146}
static int AioChooseMaxConcurrency(void)
Definition: aio_init.c:97
void SetConfigOption(const char *name, const char *value, GucContext context, GucSource source)
Definition: guc.c:4337
@ PGC_S_DYNAMIC_DEFAULT
Definition: guc.h:114
@ PGC_S_OVERRIDE
Definition: guc.h:123
@ PGC_POSTMASTER
Definition: guc.h:74
static char * buf
Definition: pg_test_fsync.c:72
#define snprintf
Definition: port.h:239
Size add_size(Size s1, Size s2)
Definition: shmem.c:493
size_t(* shmem_size)(void)
Definition: aio_internal.h:277

References add_size(), AioBackendShmemSize(), AioChooseMaxConcurrency(), AioCtlShmemSize(), AioHandleDataShmemSize(), AioHandleIOVShmemSize(), AioHandleShmemSize(), buf, io_max_concurrency, pgaio_method_ops, PGC_POSTMASTER, PGC_S_DYNAMIC_DEFAULT, PGC_S_OVERRIDE, SetConfigOption(), IoMethodOps::shmem_size, and snprintf.

Referenced by CalculateShmemSize().

pgaio_init_backend()

void pgaio_init_backend ( void  )

Definition at line 218 of file aio_init.c.

219{
220 /* shouldn't be initialized twice */
222
224 return;
225
226 if (MyProc == NULL || MyProcNumber >= AioProcs())
227 elog(ERROR, "aio requires a normal PGPROC");
228
230
233
235}
PgAioBackend * pgaio_my_backend
Definition: aio.c:81
void pgaio_shutdown(int code, Datum arg)
Definition: aio.c:1285
#define ERROR
Definition: elog.h:39
#define elog(elevel,...)
Definition: elog.h:226
ProcNumber MyProcNumber
Definition: globals.c:90
void before_shmem_exit(pg_on_exit_callback function, Datum arg)
Definition: ipc.c:337
@ B_IO_WORKER
Definition: miscadmin.h:363
BackendType MyBackendType
Definition: miscinit.c:64
PGPROC * MyProc
Definition: proc.c:66
void(* init_backend)(void)
Definition: aio_internal.h:288

References AioProcs(), Assert(), B_IO_WORKER, PgAioCtl::backend_state, before_shmem_exit(), elog, ERROR, IoMethodOps::init_backend, MyBackendType, MyProc, MyProcNumber, pgaio_ctl, pgaio_method_ops, pgaio_my_backend, and pgaio_shutdown().

Referenced by BaseInit().

AltStyle によって変換されたページ (->オリジナル) /