]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
smb: smbdirect: introduce global workqueues
authorStefan Metzmacher <metze@samba.org>
Tue, 4 Nov 2025 16:25:48 +0000 (17:25 +0100)
committerSteve French <stfrench@microsoft.com>
Thu, 16 Apr 2026 02:58:24 +0000 (21:58 -0500)
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>
fs/smb/common/smbdirect/smbdirect_internal.h
fs/smb/common/smbdirect/smbdirect_main.c
fs/smb/common/smbdirect/smbdirect_socket.h

index 03a01fb1ab1cac7ea8d892ceea09305dea8be186..b5fe07b7c54d2ce8907ddc46c0b5bd82d59751a1 100644 (file)
 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;
index 948964d3fa35c5940fdab31f00687f5535dec6bf..fe6e8d93c34c68388a6f5099d0524ed931a4746d 100644 (file)
@@ -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");
 }
index 5a3b75c40728634026142063604d5437df145003..f32fee3a6bd231be4e93ae4475ed8b025a363564 100644 (file)
@@ -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);