PostgreSQL Source Code git master
Loading...
Searching...
No Matches
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 "storage/subsystems.h"
#include "utils/guc.h"
Include dependency graph for aio_init.c:

Go to the source code of this file.

Functions

static void AioShmemRequest (void *arg)
 
static void AioShmemInit (void *arg)
 
static void AioShmemAttach (void *arg)
 
static uint32 AioProcs (void)
 
static Size AioBackendShmemSize (void)
 
static Size AioHandleShmemSize (void)
 
static Size AioHandleIOVShmemSize (void)
 
static Size AioHandleDataShmemSize (void)
 
static int AioChooseMaxConcurrency (void)
 
void pgaio_init_backend (void)
 

Variables

const ShmemCallbacks AioShmemCallbacks
 
static PgAioBackendAioBackendShmemPtr
 
static PgAioHandleAioHandleShmemPtr
 
static struct iovecAioHandleIOVShmemPtr
 
static uint64AioHandleDataShmemPtr
 

Function Documentation

◆ AioBackendShmemSize()

static Size AioBackendShmemSize ( void  )
static

Definition at line 57 of file aio_init.c.

58{
59 return mul_size(AioProcs(), sizeof(PgAioBackend));
60}
static uint32 AioProcs(void)
Definition aio_init.c:46
Size mul_size(Size s1, Size s2)
Definition shmem.c:1063

References AioProcs(), and mul_size().

Referenced by AioShmemRequest().

◆ AioChooseMaxConcurrency()

static int AioChooseMaxConcurrency ( void  )
static

Definition at line 105 of file aio_init.c.

106{
109
110 /* Similar logic to LimitAdditionalPins() */
113
115
116 /* apply upper limit */
117 return Min(max_proportional_pins, 64);
118}
#define Min(x, y)
Definition c.h:1091
#define Max(x, y)
Definition c.h:1085
uint32_t uint32
Definition c.h:624
int NBuffers
Definition globals.c:144
int MaxBackends
Definition globals.c:149
static int fb(int x)
#define NUM_AUXILIARY_PROCS
Definition proc.h:527

References fb(), Max, MaxBackends, Min, NBuffers, and NUM_AUXILIARY_PROCS.

Referenced by AioShmemRequest().

◆ AioHandleDataShmemSize()

static Size AioHandleDataShmemSize ( void  )
static

Definition at line 87 of file aio_init.c.

88{
89 /* each buffer referenced by an iovec can have associated data */
90 return mul_size(sizeof(uint64),
93}
int io_max_concurrency
Definition aio.c:75
int io_max_combine_limit
Definition bufmgr.c:217
uint64_t uint64
Definition c.h:625

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

Referenced by AioShmemRequest().

◆ AioHandleIOVShmemSize()

static Size AioHandleIOVShmemSize ( void  )
static

Definition at line 78 of file aio_init.c.

79{
80 /* each IO handle can have up to io_max_combine_limit iovec objects */
81 return mul_size(sizeof(struct iovec),
84}

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

Referenced by AioShmemRequest().

◆ AioHandleShmemSize()

static Size AioHandleShmemSize ( void  )
static

Definition at line 63 of file aio_init.c.

64{
65 Size sz;
66
67 /* verify AioChooseMaxConcurrency() did its thing */
69
70 /* io handles */
73
74 return sz;
75}
#define Assert(condition)
Definition c.h:943
size_t Size
Definition c.h:689

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

Referenced by AioShmemRequest().

◆ AioProcs()

static uint32 AioProcs ( void  )
static

Definition at line 46 of file aio_init.c.

47{
48 /*
49 * While AIO workers don't need their own AIO context, we can't currently
50 * guarantee that nothing gets assigned to an IO worker's ProcNumber if we
51 * just subtracted MAX_IO_WORKERS.
52 */
54}

References MaxBackends, and NUM_AUXILIARY_PROCS.

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

◆ AioShmemAttach()

static void AioShmemAttach ( void arg)
static

Definition at line 231 of file aio_init.c.

232{
235}
const IoMethodOps * pgaio_method_ops
Definition aio.c:96
ShmemCallbacks shmem_callbacks
void * opaque_arg
Definition shmem.h:153
ShmemAttachCallback attach_fn
Definition shmem.h:147

References ShmemCallbacks::attach_fn, ShmemCallbacks::opaque_arg, pgaio_method_ops, and IoMethodOps::shmem_callbacks.

◆ AioShmemInit()

static void AioShmemInit ( void arg)
static

Definition at line 179 of file aio_init.c.

180{
181 uint32 io_handle_off = 0;
182 uint32 iovec_off = 0;
184
187
192
193 for (int procno = 0; procno < AioProcs(); procno++)
194 {
196
197 bs->io_handle_off = io_handle_off;
198 io_handle_off += io_max_concurrency;
199
200 dclist_init(&bs->idle_ios);
201 memset(bs->staged_ios, 0, sizeof(PgAioHandle *) * PGAIO_SUBMIT_BATCH_SIZE);
202 dclist_init(&bs->in_flight_ios);
203
204 /* initialize per-backend IOs */
205 for (int i = 0; i < io_max_concurrency; i++)
206 {
207 PgAioHandle *ioh = &pgaio_ctl->io_handles[bs->io_handle_off + i];
208
209 ioh->generation = 1;
210 ioh->owner_procno = procno;
211 ioh->iovec_off = iovec_off;
212 ioh->handle_data_len = 0;
213 ioh->report_return = NULL;
214 ioh->resowner = NULL;
215 ioh->num_callbacks = 0;
216 ioh->distilled_result.status = PGAIO_RS_UNKNOWN;
217 ioh->flags = 0;
218
220
221 dclist_push_tail(&bs->idle_ios, &ioh->node);
222 iovec_off += io_max_combine_limit;
223 }
224 }
225
228}
PgAioCtl * pgaio_ctl
Definition aio.c:78
static PgAioHandle * AioHandleShmemPtr
Definition aio_init.c:41
static struct iovec * AioHandleIOVShmemPtr
Definition aio_init.c:42
static uint64 * AioHandleDataShmemPtr
Definition aio_init.c:43
static PgAioBackend * AioBackendShmemPtr
Definition aio_init.c:40
#define PGAIO_SUBMIT_BATCH_SIZE
@ 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
int i
Definition isn.c:77
uint32 io_handle_off
uint32 iovec_count
struct iovec * iovecs
PgAioHandle * io_handles
uint32 io_handle_count
uint64 * handle_data
PgAioBackend * backend_state
uint64 generation
ShmemInitCallback init_fn
Definition shmem.h:139

References AioBackendShmemPtr, AioHandleDataShmemPtr, AioHandleIOVShmemPtr, AioHandleShmemPtr, AioProcs(), PgAioCtl::backend_state, ConditionVariableInit(), dclist_init(), dclist_push_tail(), fb(), PgAioHandle::generation, PgAioCtl::handle_data, i, ShmemCallbacks::init_fn, PgAioCtl::io_handle_count, PgAioBackend::io_handle_off, PgAioCtl::io_handles, io_max_combine_limit, io_max_concurrency, PgAioCtl::iovec_count, PgAioCtl::iovecs, ShmemCallbacks::opaque_arg, pgaio_ctl, pgaio_method_ops, PGAIO_RS_UNKNOWN, PGAIO_SUBMIT_BATCH_SIZE, and IoMethodOps::shmem_callbacks.

◆ AioShmemRequest()

static void AioShmemRequest ( void arg)
static

Definition at line 124 of file aio_init.c.

125{
126 /*
127 * Resolve io_max_concurrency if not already done
128 *
129 * We prefer to report this value's source as PGC_S_DYNAMIC_DEFAULT.
130 * However, if the DBA explicitly set io_max_concurrency = -1 in the
131 * config file, then PGC_S_DYNAMIC_DEFAULT will fail to override that and
132 * we must force the matter with PGC_S_OVERRIDE.
133 */
134 if (io_max_concurrency == -1)
135 {
136 char buf[32];
137
138 snprintf(buf, sizeof(buf), "%d", AioChooseMaxConcurrency());
139 SetConfigOption("io_max_concurrency", buf, PGC_POSTMASTER,
141 if (io_max_concurrency == -1) /* failed to apply it? */
142 SetConfigOption("io_max_concurrency", buf, PGC_POSTMASTER,
144 }
145
146 ShmemRequestStruct(.name = "AioCtl",
147 .size = sizeof(PgAioCtl),
148 .ptr = (void **) &pgaio_ctl,
149 );
150
151 ShmemRequestStruct(.name = "AioBackend",
152 .size = AioBackendShmemSize(),
153 .ptr = (void **) &AioBackendShmemPtr,
154 );
155
156 ShmemRequestStruct(.name = "AioHandle",
157 .size = AioHandleShmemSize(),
158 .ptr = (void **) &AioHandleShmemPtr,
159 );
160
161 ShmemRequestStruct(.name = "AioHandleIOV",
162 .size = AioHandleIOVShmemSize(),
163 .ptr = (void **) &AioHandleIOVShmemPtr,
164 );
165
166 ShmemRequestStruct(.name = "AioHandleData",
167 .size = AioHandleDataShmemSize(),
168 .ptr = (void **) &AioHandleDataShmemPtr,
169 );
170
173}
static Size AioHandleIOVShmemSize(void)
Definition aio_init.c:78
static Size AioHandleDataShmemSize(void)
Definition aio_init.c:87
static Size AioHandleShmemSize(void)
Definition aio_init.c:63
static Size AioBackendShmemSize(void)
Definition aio_init.c:57
static int AioChooseMaxConcurrency(void)
Definition aio_init.c:105
void SetConfigOption(const char *name, const char *value, GucContext context, GucSource source)
Definition guc.c:4234
@ PGC_S_DYNAMIC_DEFAULT
Definition guc.h:114
@ PGC_S_OVERRIDE
Definition guc.h:123
@ PGC_POSTMASTER
Definition guc.h:74
static char buf[DEFAULT_XLOG_SEG_SIZE]
#define snprintf
Definition port.h:260
#define ShmemRequestStruct(...)
Definition shmem.h:176
ShmemRequestCallback request_fn
Definition shmem.h:133
const char * name

References AioBackendShmemPtr, AioBackendShmemSize(), AioChooseMaxConcurrency(), AioHandleDataShmemPtr, AioHandleDataShmemSize(), AioHandleIOVShmemPtr, AioHandleIOVShmemSize(), AioHandleShmemPtr, AioHandleShmemSize(), buf, io_max_concurrency, name, ShmemCallbacks::opaque_arg, pgaio_ctl, pgaio_method_ops, PGC_POSTMASTER, PGC_S_DYNAMIC_DEFAULT, PGC_S_OVERRIDE, ShmemCallbacks::request_fn, SetConfigOption(), IoMethodOps::shmem_callbacks, ShmemRequestStruct, and snprintf.

◆ pgaio_init_backend()

void pgaio_init_backend ( void  )

Definition at line 238 of file aio_init.c.

239{
240 /* shouldn't be initialized twice */
242
244 return;
245
246 if (MyProc == NULL || MyProcNumber >= AioProcs())
247 elog(ERROR, "aio requires a normal PGPROC");
248
250
253
255}
PgAioBackend * pgaio_my_backend
Definition aio.c:81
void pgaio_shutdown(int code, Datum arg)
Definition aio.c:1298
#define ERROR
Definition elog.h:40
#define elog(elevel,...)
Definition elog.h:228
ProcNumber MyProcNumber
Definition globals.c:92
void before_shmem_exit(pg_on_exit_callback function, Datum arg)
Definition ipc.c:344
@ B_IO_WORKER
Definition miscadmin.h:376
BackendType MyBackendType
Definition miscinit.c:65
PGPROC * MyProc
Definition proc.c:71
void(* init_backend)(void)

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

Referenced by BaseInit().

Variable Documentation

◆ AioBackendShmemPtr

PgAioBackend* AioBackendShmemPtr
static

Definition at line 40 of file aio_init.c.

Referenced by AioShmemInit(), and AioShmemRequest().

◆ AioHandleDataShmemPtr

uint64* AioHandleDataShmemPtr
static

Definition at line 43 of file aio_init.c.

Referenced by AioShmemInit(), and AioShmemRequest().

◆ AioHandleIOVShmemPtr

struct iovec* AioHandleIOVShmemPtr
static

Definition at line 42 of file aio_init.c.

Referenced by AioShmemInit(), and AioShmemRequest().

◆ AioHandleShmemPtr

PgAioHandle* AioHandleShmemPtr
static

Definition at line 41 of file aio_init.c.

Referenced by AioShmemInit(), and AioShmemRequest().

◆ AioShmemCallbacks

const ShmemCallbacks AioShmemCallbacks
Initial value:
= {
.request_fn = AioShmemRequest,
.init_fn = AioShmemInit,
.attach_fn = AioShmemAttach,
}
static void AioShmemAttach(void *arg)
Definition aio_init.c:231
static void AioShmemInit(void *arg)
Definition aio_init.c:179
static void AioShmemRequest(void *arg)
Definition aio_init.c:124

Definition at line 34 of file aio_init.c.

34 {
35 .request_fn = AioShmemRequest,
36 .init_fn = AioShmemInit,
37 .attach_fn = AioShmemAttach,
38};