mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2026-05-22 18:40:43 +03:00
zvol: Enable zvol threading functionality on FreeBSD
Make zvol I/O requests processing asynchronous on FreeBSD side in some cases. Clone zvol threading logic and required module parameters from Linux side. Make zvol threadpool creation/destruction logic shared for both Linux and FreeBSD. The IO requests are processed asynchronously in next cases: - volmode=geom: if IO request thread is geom thread or cannot sleep. - volmode=cdev: if IO request passed thru struct cdevsw .d_strategy routine, mean is AIO request. In all other cases the IO requests are processed synchronously. The volthreading zvol property is ignored on FreeBSD side. Sponsored-by: vStack, Inc. Reviewed-by: Alexander Motin <mav@FreeBSD.org> Reviewed-by: Tony Hutter <hutter2@llnl.gov> Reviewed-by: @ImAwsumm Signed-off-by: Fedor Uporov <fuporov.vstack@gmail.com> Closes #17169
This commit is contained in:
@@ -60,6 +60,32 @@ typedef struct zvol_state {
|
||||
boolean_t zv_threading; /* volthreading property */
|
||||
} zvol_state_t;
|
||||
|
||||
/*
|
||||
* zvol taskqs
|
||||
*/
|
||||
typedef struct zv_taskq {
|
||||
uint_t tqs_cnt;
|
||||
taskq_t **tqs_taskq;
|
||||
} zv_taskq_t;
|
||||
|
||||
typedef struct zv_request_stack {
|
||||
zvol_state_t *zv;
|
||||
struct bio *bio;
|
||||
#ifdef __linux__
|
||||
struct request *rq;
|
||||
#endif
|
||||
} zv_request_t;
|
||||
|
||||
typedef struct zv_request_task {
|
||||
zv_request_t zvr;
|
||||
taskq_ent_t ent;
|
||||
} zv_request_task_t;
|
||||
|
||||
/*
|
||||
* Switch taskq at multiple of 512 MB offset. This can be set to a lower value
|
||||
* to utilize more threads for small files but may affect prefetch hits.
|
||||
*/
|
||||
#define ZVOL_TASKQ_OFFSET_SHIFT 29
|
||||
|
||||
extern krwlock_t zvol_state_lock;
|
||||
#define ZVOL_HT_SIZE 1024
|
||||
@@ -69,6 +95,10 @@ extern zil_replay_func_t *const zvol_replay_vector[TX_MAX_TYPE];
|
||||
|
||||
extern unsigned int zvol_volmode;
|
||||
extern unsigned int zvol_inhibit_dev;
|
||||
extern unsigned int zvol_threads;
|
||||
extern unsigned int zvol_num_taskqs;
|
||||
extern unsigned int zvol_request_sync;
|
||||
extern zv_taskq_t zvol_taskqs;
|
||||
|
||||
/*
|
||||
* platform independent functions exported to platform code
|
||||
@@ -94,6 +124,8 @@ int zvol_clone_range(zvol_state_handle_t *, uint64_t,
|
||||
void zvol_log_clone_range(zilog_t *zilog, dmu_tx_t *tx, int txtype,
|
||||
uint64_t off, uint64_t len, uint64_t blksz, const blkptr_t *bps,
|
||||
size_t nbps);
|
||||
zv_request_task_t *zv_request_task_create(zv_request_t zvr);
|
||||
void zv_request_task_free(zv_request_task_t *task);
|
||||
|
||||
/*
|
||||
* platform dependent functions exported to platform independent code
|
||||
|
||||
Reference in New Issue
Block a user