PostgreSQL Source Code git master
All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
aio_io.c File Reference
#include "postgres.h"
#include "miscadmin.h"
#include "storage/aio.h"
#include "storage/aio_internal.h"
#include "storage/fd.h"
#include "utils/wait_event.h"
Include dependency graph for aio_io.c:

Go to the source code of this file.

Functions

static void pgaio_io_before_prep (PgAioHandle *ioh)
 
int pgaio_io_get_iovec (PgAioHandle *ioh, struct iovec **iov)
 
PgAioOp pgaio_io_get_op (PgAioHandle *ioh)
 
PgAioOpDatapgaio_io_get_op_data (PgAioHandle *ioh)
 
void pgaio_io_prep_readv (PgAioHandle *ioh, int fd, int iovcnt, uint64 offset)
 
void pgaio_io_prep_writev (PgAioHandle *ioh, int fd, int iovcnt, uint64 offset)
 
void pgaio_io_perform_synchronously (PgAioHandle *ioh)
 
const char * pgaio_io_get_op_name (PgAioHandle *ioh)
 

Function Documentation

◆ pgaio_io_before_prep()

static void pgaio_io_before_prep ( PgAioHandle ioh)
static

Definition at line 156 of file aio_io.c.

157{
161 Assert(ioh->op == PGAIO_OP_INVALID);
162}
PgAioBackend * pgaio_my_backend
Definition: aio.c:79
@ PGAIO_OP_INVALID
Definition: aio.h:82
@ PGAIO_HS_HANDED_OUT
Definition: aio_internal.h:48
bool pgaio_io_has_target(PgAioHandle *ioh)
Definition: aio_target.c:38
Assert(PointerIsAligned(start, uint64))
PgAioHandle * handed_out_io
Definition: aio_internal.h:195
PgAioOp op
Definition: aio_internal.h:100
PgAioHandleState state
Definition: aio_internal.h:94

References Assert(), PgAioBackend::handed_out_io, PgAioHandle::op, PGAIO_HS_HANDED_OUT, pgaio_io_has_target(), pgaio_my_backend, PGAIO_OP_INVALID, and PgAioHandle::state.

Referenced by pgaio_io_prep_readv(), and pgaio_io_prep_writev().

◆ pgaio_io_get_iovec()

int pgaio_io_get_iovec ( PgAioHandle ioh,
struct iovec **  iov 
)

Definition at line 42 of file aio_io.c.

43{
45
46 *iov = &pgaio_ctl->iovecs[ioh->iovec_off];
47
48 return PG_IOV_MAX;
49}
PgAioCtl * pgaio_ctl
Definition: aio.c:76
#define PG_IOV_MAX
Definition: pg_iovec.h:41
struct iovec * iovecs
Definition: aio_internal.h:229
uint32 iovec_off
Definition: aio_internal.h:159

References Assert(), PgAioHandle::iovec_off, PgAioCtl::iovecs, PG_IOV_MAX, pgaio_ctl, PGAIO_HS_HANDED_OUT, and PgAioHandle::state.

◆ pgaio_io_get_op()

PgAioOp pgaio_io_get_op ( PgAioHandle ioh)

Definition at line 52 of file aio_io.c.

53{
54 return ioh->op;
55}

References PgAioHandle::op.

◆ pgaio_io_get_op_data()

PgAioOpData * pgaio_io_get_op_data ( PgAioHandle ioh)

Definition at line 58 of file aio_io.c.

59{
60 return &ioh->op_data;
61}
PgAioOpData op_data
Definition: aio_internal.h:169

References PgAioHandle::op_data.

◆ pgaio_io_get_op_name()

const char * pgaio_io_get_op_name ( PgAioHandle ioh)

Definition at line 169 of file aio_io.c.

170{
171 Assert(ioh->op >= 0 && ioh->op < PGAIO_OP_COUNT);
172
173 switch (ioh->op)
174 {
175 case PGAIO_OP_INVALID:
176 return "invalid";
177 case PGAIO_OP_READV:
178 return "read";
179 case PGAIO_OP_WRITEV:
180 return "write";
181 }
182
183 return NULL; /* silence compiler */
184}
#define PGAIO_OP_COUNT
Definition: aio.h:99
@ PGAIO_OP_WRITEV
Definition: aio.h:85
@ PGAIO_OP_READV
Definition: aio.h:84

References Assert(), PgAioHandle::op, PGAIO_OP_COUNT, PGAIO_OP_INVALID, PGAIO_OP_READV, and PGAIO_OP_WRITEV.

◆ pgaio_io_perform_synchronously()

void pgaio_io_perform_synchronously ( PgAioHandle ioh)

Definition at line 116 of file aio_io.c.

117{
118 ssize_t result = 0;
119 struct iovec *iov = &pgaio_ctl->iovecs[ioh->iovec_off];
120
122
123 /* Perform IO. */
124 switch (ioh->op)
125 {
126 case PGAIO_OP_READV:
127 pgstat_report_wait_start(WAIT_EVENT_DATA_FILE_READ);
128 result = pg_preadv(ioh->op_data.read.fd, iov,
130 ioh->op_data.read.offset);
132 break;
133 case PGAIO_OP_WRITEV:
134 pgstat_report_wait_start(WAIT_EVENT_DATA_FILE_WRITE);
135 result = pg_pwritev(ioh->op_data.write.fd, iov,
137 ioh->op_data.write.offset);
139 break;
140 case PGAIO_OP_INVALID:
141 elog(ERROR, "trying to execute invalid IO operation");
142 }
143
144 ioh->result = result < 0 ? -errno : result;
145
147
149}
void pgaio_io_process_completion(PgAioHandle *ioh, int result)
Definition: aio.c:492
#define ERROR
Definition: elog.h:39
#define elog(elevel,...)
Definition: elog.h:225
#define START_CRIT_SECTION()
Definition: miscadmin.h:149
#define END_CRIT_SECTION()
Definition: miscadmin.h:151
static ssize_t pg_pwritev(int fd, const struct iovec *iov, int iovcnt, off_t offset)
Definition: pg_iovec.h:87
static ssize_t pg_preadv(int fd, const struct iovec *iov, int iovcnt, off_t offset)
Definition: pg_iovec.h:48
uint64 offset
Definition: aio.h:131
int fd
Definition: aio.h:129
uint16 iov_length
Definition: aio.h:130
struct PgAioOpData::@123 write
struct PgAioOpData::@122 read
static void pgstat_report_wait_start(uint32 wait_event_info)
Definition: wait_event.h:85
static void pgstat_report_wait_end(void)
Definition: wait_event.h:101

References elog, END_CRIT_SECTION, ERROR, PgAioOpData::fd, PgAioOpData::iov_length, PgAioHandle::iovec_off, PgAioCtl::iovecs, PgAioOpData::offset, PgAioHandle::op, PgAioHandle::op_data, pg_preadv(), pg_pwritev(), pgaio_ctl, pgaio_io_process_completion(), PGAIO_OP_INVALID, PGAIO_OP_READV, PGAIO_OP_WRITEV, pgstat_report_wait_end(), pgstat_report_wait_start(), PgAioOpData::read, PgAioHandle::result, START_CRIT_SECTION, and PgAioOpData::write.

Referenced by IoWorkerMain(), pgaio_io_stage(), and pgaio_worker_submit_internal().

◆ pgaio_io_prep_readv()

void pgaio_io_prep_readv ( PgAioHandle ioh,
int  fd,
int  iovcnt,
uint64  offset 
)

Definition at line 78 of file aio_io.c.

80{
82
83 ioh->op_data.read.fd = fd;
84 ioh->op_data.read.offset = offset;
85 ioh->op_data.read.iov_length = iovcnt;
86
88}
void pgaio_io_stage(PgAioHandle *ioh, PgAioOp op)
Definition: aio.c:397
static void pgaio_io_before_prep(PgAioHandle *ioh)
Definition: aio_io.c:156
static int fd(const char *x, int i)
Definition: preproc-init.c:105

References PgAioOpData::fd, fd(), PgAioOpData::iov_length, PgAioOpData::offset, PgAioHandle::op_data, pgaio_io_before_prep(), pgaio_io_stage(), PGAIO_OP_READV, and PgAioOpData::read.

◆ pgaio_io_prep_writev()

void pgaio_io_prep_writev ( PgAioHandle ioh,
int  fd,
int  iovcnt,
uint64  offset 
)