diff options
| author | Stefan Metzmacher <metze@samba.org> | 2025-11-04 17:25:48 +0100 |
|---|---|---|
| committer | Steve French <stfrench@microsoft.com> | 2026-04-15 21:58:24 -0500 |
| commit | 1adde16a9e28446b5a73a8f0e05f6f977e520528 (patch) | |
| tree | 74b89241d6d889be6931d428953073565a618a00 /fs/smb/common | |
| parent | e4ce1fca0468eb4b6fc2f02667f599bb76df8848 (diff) | |
| download | linux-next-1adde16a9e28446b5a73a8f0e05f6f977e520528.tar.gz linux-next-1adde16a9e28446b5a73a8f0e05f6f977e520528.zip | |
smb: smbdirect: introduce global workqueues
These will be used in future and callers should no
longer use smbdirect_socket_set_custom_workqueue().
Cc: Steve French <smfrench@gmail.com>
Cc: Tom Talpey <tom@talpey.com>
Cc: Long Li <longli@microsoft.com>
Cc: Namjae Jeon <linkinjeon@kernel.org>
Cc: linux-cifs@vger.kernel.org
Cc: samba-technical@lists.samba.org
Signed-off-by: Stefan Metzmacher <metze@samba.org>
Acked-by: Namjae Jeon <linkinjeon@kernel.org>
Signed-off-by: Steve French <stfrench@microsoft.com>
Diffstat (limited to 'fs/smb/common')
| -rw-r--r-- | fs/smb/common/smbdirect/smbdirect_internal.h | 9 | ||||
| -rw-r--r-- | fs/smb/common/smbdirect/smbdirect_main.c | 73 | ||||
| -rw-r--r-- | fs/smb/common/smbdirect/smbdirect_socket.h | 9 |
3 files changed, 88 insertions, 3 deletions
diff --git a/fs/smb/common/smbdirect/smbdirect_internal.h b/fs/smb/common/smbdirect/smbdirect_internal.h index 03a01fb1ab1c..b5fe07b7c54d 100644 --- a/fs/smb/common/smbdirect/smbdirect_internal.h +++ b/fs/smb/common/smbdirect/smbdirect_internal.h @@ -20,6 +20,15 @@ struct smbdirect_module_state { struct mutex mutex; struct { + struct workqueue_struct *accept; + struct workqueue_struct *connect; + struct workqueue_struct *idle; + struct workqueue_struct *refill; + struct workqueue_struct *immediate; + struct workqueue_struct *cleanup; + } workqueues; + + struct { rwlock_t lock; struct list_head list; } devices; diff --git a/fs/smb/common/smbdirect/smbdirect_main.c b/fs/smb/common/smbdirect/smbdirect_main.c index 948964d3fa35..fe6e8d93c34c 100644 --- a/fs/smb/common/smbdirect/smbdirect_main.c +++ b/fs/smb/common/smbdirect/smbdirect_main.c @@ -12,11 +12,63 @@ struct smbdirect_module_state smbdirect_globals = { static __init int smbdirect_module_init(void) { - int ret; + int ret = -ENOMEM; pr_notice("subsystem loading...\n"); mutex_lock(&smbdirect_globals.mutex); + smbdirect_globals.workqueues.accept = alloc_workqueue("smbdirect-accept", + WQ_SYSFS | + WQ_PERCPU | + WQ_POWER_EFFICIENT, + 0); + if (smbdirect_globals.workqueues.accept == NULL) + goto alloc_accept_wq_failed; + + smbdirect_globals.workqueues.connect = alloc_workqueue("smbdirect-connect", + WQ_SYSFS | + WQ_PERCPU | + WQ_POWER_EFFICIENT, + 0); + if (smbdirect_globals.workqueues.connect == NULL) + goto alloc_connect_wq_failed; + + smbdirect_globals.workqueues.idle = alloc_workqueue("smbdirect-idle", + WQ_SYSFS | + WQ_PERCPU | + WQ_POWER_EFFICIENT, + 0); + if (smbdirect_globals.workqueues.idle == NULL) + goto alloc_idle_wq_failed; + + smbdirect_globals.workqueues.refill = alloc_workqueue("smbdirect-refill", + WQ_HIGHPRI | + WQ_SYSFS | + WQ_PERCPU | + WQ_POWER_EFFICIENT, + 0); + if (smbdirect_globals.workqueues.refill == NULL) + goto alloc_refill_wq_failed; + + smbdirect_globals.workqueues.immediate = alloc_workqueue("smbdirect-immediate", + WQ_HIGHPRI | + WQ_SYSFS | + WQ_PERCPU | + WQ_POWER_EFFICIENT, + 0); + if (smbdirect_globals.workqueues.immediate == NULL) + goto alloc_immediate_wq_failed; + + smbdirect_globals.workqueues.cleanup = alloc_workqueue("smbdirect-cleanup", + WQ_MEM_RECLAIM | + WQ_HIGHPRI | + WQ_SYSFS | + WQ_PERCPU | + WQ_POWER_EFFICIENT, + 0); + if (smbdirect_globals.workqueues.cleanup == NULL) + goto alloc_cleanup_wq_failed; + ret = smbdirect_devices_init(); if (ret) goto devices_init_failed; @@ -26,6 +78,18 @@ static __init int smbdirect_module_init(void) return 0; devices_init_failed: + destroy_workqueue(smbdirect_globals.workqueues.cleanup); +alloc_cleanup_wq_failed: + destroy_workqueue(smbdirect_globals.workqueues.immediate); +alloc_immediate_wq_failed: + destroy_workqueue(smbdirect_globals.workqueues.refill); +alloc_refill_wq_failed: + destroy_workqueue(smbdirect_globals.workqueues.idle); +alloc_idle_wq_failed: + destroy_workqueue(smbdirect_globals.workqueues.connect); +alloc_connect_wq_failed: + destroy_workqueue(smbdirect_globals.workqueues.accept); +alloc_accept_wq_failed: mutex_unlock(&smbdirect_globals.mutex); pr_crit("failed to loaded: %d (%1pe)\n", ret, SMBDIRECT_DEBUG_ERR_PTR(ret)); @@ -39,6 +103,13 @@ static __exit void smbdirect_module_exit(void) smbdirect_devices_exit(); + destroy_workqueue(smbdirect_globals.workqueues.accept); + destroy_workqueue(smbdirect_globals.workqueues.connect); + destroy_workqueue(smbdirect_globals.workqueues.idle); + destroy_workqueue(smbdirect_globals.workqueues.refill); + destroy_workqueue(smbdirect_globals.workqueues.immediate); + destroy_workqueue(smbdirect_globals.workqueues.cleanup); + mutex_unlock(&smbdirect_globals.mutex); pr_notice("subsystem unloaded\n"); } diff --git a/fs/smb/common/smbdirect/smbdirect_socket.h b/fs/smb/common/smbdirect/smbdirect_socket.h index 5a3b75c40728..f32fee3a6bd2 100644 --- a/fs/smb/common/smbdirect/smbdirect_socket.h +++ b/fs/smb/common/smbdirect/smbdirect_socket.h @@ -111,8 +111,6 @@ struct smbdirect_socket { /* * This points to the workqueues to * be used for this socket. - * It can be per socket (on the client) - * or point to a global workqueue (on the server) */ struct { struct workqueue_struct *accept; @@ -572,6 +570,13 @@ static __always_inline void smbdirect_socket_init(struct smbdirect_socket *sc) init_waitqueue_head(&sc->status_wait); + sc->workqueues.accept = smbdirect_globals.workqueues.accept; + sc->workqueues.connect = smbdirect_globals.workqueues.connect; + sc->workqueues.idle = smbdirect_globals.workqueues.idle; + sc->workqueues.refill = smbdirect_globals.workqueues.refill; + sc->workqueues.immediate = smbdirect_globals.workqueues.immediate; + sc->workqueues.cleanup = smbdirect_globals.workqueues.cleanup; + INIT_WORK(&sc->disconnect_work, __smbdirect_socket_disabled_work); disable_work_sync(&sc->disconnect_work); |
