Skip to content

Commit 1adde16

Browse files
metze-sambasmfrench
authored andcommitted
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>
1 parent e4ce1fc commit 1adde16

3 files changed

Lines changed: 88 additions & 3 deletions

File tree

fs/smb/common/smbdirect/smbdirect_internal.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,15 @@
1919
struct smbdirect_module_state {
2020
struct mutex mutex;
2121

22+
struct {
23+
struct workqueue_struct *accept;
24+
struct workqueue_struct *connect;
25+
struct workqueue_struct *idle;
26+
struct workqueue_struct *refill;
27+
struct workqueue_struct *immediate;
28+
struct workqueue_struct *cleanup;
29+
} workqueues;
30+
2231
struct {
2332
rwlock_t lock;
2433
struct list_head list;

fs/smb/common/smbdirect/smbdirect_main.c

Lines changed: 72 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,63 @@ struct smbdirect_module_state smbdirect_globals = {
1212

1313
static __init int smbdirect_module_init(void)
1414
{
15-
int ret;
15+
int ret = -ENOMEM;
1616

1717
pr_notice("subsystem loading...\n");
1818
mutex_lock(&smbdirect_globals.mutex);
1919

20+
smbdirect_globals.workqueues.accept = alloc_workqueue("smbdirect-accept",
21+
WQ_SYSFS |
22+
WQ_PERCPU |
23+
WQ_POWER_EFFICIENT,
24+
0);
25+
if (smbdirect_globals.workqueues.accept == NULL)
26+
goto alloc_accept_wq_failed;
27+
28+
smbdirect_globals.workqueues.connect = alloc_workqueue("smbdirect-connect",
29+
WQ_SYSFS |
30+
WQ_PERCPU |
31+
WQ_POWER_EFFICIENT,
32+
0);
33+
if (smbdirect_globals.workqueues.connect == NULL)
34+
goto alloc_connect_wq_failed;
35+
36+
smbdirect_globals.workqueues.idle = alloc_workqueue("smbdirect-idle",
37+
WQ_SYSFS |
38+
WQ_PERCPU |
39+
WQ_POWER_EFFICIENT,
40+
0);
41+
if (smbdirect_globals.workqueues.idle == NULL)
42+
goto alloc_idle_wq_failed;
43+
44+
smbdirect_globals.workqueues.refill = alloc_workqueue("smbdirect-refill",
45+
WQ_HIGHPRI |
46+
WQ_SYSFS |
47+
WQ_PERCPU |
48+
WQ_POWER_EFFICIENT,
49+
0);
50+
if (smbdirect_globals.workqueues.refill == NULL)
51+
goto alloc_refill_wq_failed;
52+
53+
smbdirect_globals.workqueues.immediate = alloc_workqueue("smbdirect-immediate",
54+
WQ_HIGHPRI |
55+
WQ_SYSFS |
56+
WQ_PERCPU |
57+
WQ_POWER_EFFICIENT,
58+
0);
59+
if (smbdirect_globals.workqueues.immediate == NULL)
60+
goto alloc_immediate_wq_failed;
61+
62+
smbdirect_globals.workqueues.cleanup = alloc_workqueue("smbdirect-cleanup",
63+
WQ_MEM_RECLAIM |
64+
WQ_HIGHPRI |
65+
WQ_SYSFS |
66+
WQ_PERCPU |
67+
WQ_POWER_EFFICIENT,
68+
0);
69+
if (smbdirect_globals.workqueues.cleanup == NULL)
70+
goto alloc_cleanup_wq_failed;
71+
2072
ret = smbdirect_devices_init();
2173
if (ret)
2274
goto devices_init_failed;
@@ -26,6 +78,18 @@ static __init int smbdirect_module_init(void)
2678
return 0;
2779

2880
devices_init_failed:
81+
destroy_workqueue(smbdirect_globals.workqueues.cleanup);
82+
alloc_cleanup_wq_failed:
83+
destroy_workqueue(smbdirect_globals.workqueues.immediate);
84+
alloc_immediate_wq_failed:
85+
destroy_workqueue(smbdirect_globals.workqueues.refill);
86+
alloc_refill_wq_failed:
87+
destroy_workqueue(smbdirect_globals.workqueues.idle);
88+
alloc_idle_wq_failed:
89+
destroy_workqueue(smbdirect_globals.workqueues.connect);
90+
alloc_connect_wq_failed:
91+
destroy_workqueue(smbdirect_globals.workqueues.accept);
92+
alloc_accept_wq_failed:
2993
mutex_unlock(&smbdirect_globals.mutex);
3094
pr_crit("failed to loaded: %d (%1pe)\n",
3195
ret, SMBDIRECT_DEBUG_ERR_PTR(ret));
@@ -39,6 +103,13 @@ static __exit void smbdirect_module_exit(void)
39103

40104
smbdirect_devices_exit();
41105

106+
destroy_workqueue(smbdirect_globals.workqueues.accept);
107+
destroy_workqueue(smbdirect_globals.workqueues.connect);
108+
destroy_workqueue(smbdirect_globals.workqueues.idle);
109+
destroy_workqueue(smbdirect_globals.workqueues.refill);
110+
destroy_workqueue(smbdirect_globals.workqueues.immediate);
111+
destroy_workqueue(smbdirect_globals.workqueues.cleanup);
112+
42113
mutex_unlock(&smbdirect_globals.mutex);
43114
pr_notice("subsystem unloaded\n");
44115
}

fs/smb/common/smbdirect/smbdirect_socket.h

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -111,8 +111,6 @@ struct smbdirect_socket {
111111
/*
112112
* This points to the workqueues to
113113
* be used for this socket.
114-
* It can be per socket (on the client)
115-
* or point to a global workqueue (on the server)
116114
*/
117115
struct {
118116
struct workqueue_struct *accept;
@@ -572,6 +570,13 @@ static __always_inline void smbdirect_socket_init(struct smbdirect_socket *sc)
572570

573571
init_waitqueue_head(&sc->status_wait);
574572

573+
sc->workqueues.accept = smbdirect_globals.workqueues.accept;
574+
sc->workqueues.connect = smbdirect_globals.workqueues.connect;
575+
sc->workqueues.idle = smbdirect_globals.workqueues.idle;
576+
sc->workqueues.refill = smbdirect_globals.workqueues.refill;
577+
sc->workqueues.immediate = smbdirect_globals.workqueues.immediate;
578+
sc->workqueues.cleanup = smbdirect_globals.workqueues.cleanup;
579+
575580
INIT_WORK(&sc->disconnect_work, __smbdirect_socket_disabled_work);
576581
disable_work_sync(&sc->disconnect_work);
577582

0 commit comments

Comments
 (0)