f30bd4d038
This patch removes some "cold" fields from `struct io_issue_def`. The plan is to keep only highly used fields into `struct io_issue_def`, so, it may be hot in the cache. The hot fields are basically all the bitfields and the callback functions for .issue and .prep. The other less frequently used fields are now located in a secondary and cold struct, called `io_cold_def`. This is the size for the structs: Before: io_issue_def = 56 bytes After: io_issue_def = 24 bytes; io_cold_def = 40 bytes Signed-off-by: Breno Leitao <leitao@debian.org> Reviewed-by: Pavel Begunkov <asml.silence@gmail.com> Link: https://lore.kernel.org/r/20230112144411.2624698-2-leitao@debian.org Signed-off-by: Jens Axboe <axboe@kernel.dk>
53 lines
1.4 KiB
C
53 lines
1.4 KiB
C
// SPDX-License-Identifier: GPL-2.0
|
|
#ifndef IOU_OP_DEF_H
|
|
#define IOU_OP_DEF_H
|
|
|
|
struct io_issue_def {
|
|
/* needs req->file assigned */
|
|
unsigned needs_file : 1;
|
|
/* should block plug */
|
|
unsigned plug : 1;
|
|
/* hash wq insertion if file is a regular file */
|
|
unsigned hash_reg_file : 1;
|
|
/* unbound wq insertion if file is a non-regular file */
|
|
unsigned unbound_nonreg_file : 1;
|
|
/* set if opcode supports polled "wait" */
|
|
unsigned pollin : 1;
|
|
unsigned pollout : 1;
|
|
unsigned poll_exclusive : 1;
|
|
/* op supports buffer selection */
|
|
unsigned buffer_select : 1;
|
|
/* opcode is not supported by this kernel */
|
|
unsigned not_supported : 1;
|
|
/* skip auditing */
|
|
unsigned audit_skip : 1;
|
|
/* supports ioprio */
|
|
unsigned ioprio : 1;
|
|
/* supports iopoll */
|
|
unsigned iopoll : 1;
|
|
/* have to be put into the iopoll list */
|
|
unsigned iopoll_queue : 1;
|
|
/* opcode specific path will handle ->async_data allocation if needed */
|
|
unsigned manual_alloc : 1;
|
|
|
|
int (*issue)(struct io_kiocb *, unsigned int);
|
|
int (*prep)(struct io_kiocb *, const struct io_uring_sqe *);
|
|
};
|
|
|
|
struct io_cold_def {
|
|
/* size of async data needed, if any */
|
|
unsigned short async_size;
|
|
|
|
const char *name;
|
|
|
|
int (*prep_async)(struct io_kiocb *);
|
|
void (*cleanup)(struct io_kiocb *);
|
|
void (*fail)(struct io_kiocb *);
|
|
};
|
|
|
|
extern const struct io_issue_def io_issue_defs[];
|
|
extern const struct io_cold_def io_cold_defs[];
|
|
|
|
void io_uring_optable_init(void);
|
|
#endif
|