Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

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>

authored by

Stefan Metzmacher and committed by
Steve French
1adde16a e4ce1fca

+88 -3
+9
fs/smb/common/smbdirect/smbdirect_internal.h
··· 20 20 struct mutex mutex; 21 21 22 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 + 31 + struct { 23 32 rwlock_t lock; 24 33 struct list_head list; 25 34 } devices;
+72 -1
fs/smb/common/smbdirect/smbdirect_main.c
··· 12 12 13 13 static __init int smbdirect_module_init(void) 14 14 { 15 - int ret; 15 + int ret = -ENOMEM; 16 16 17 17 pr_notice("subsystem loading...\n"); 18 18 mutex_lock(&smbdirect_globals.mutex); 19 + 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; 19 71 20 72 ret = smbdirect_devices_init(); 21 73 if (ret) ··· 78 26 return 0; 79 27 80 28 devices_init_failed: 29 + destroy_workqueue(smbdirect_globals.workqueues.cleanup); 30 + alloc_cleanup_wq_failed: 31 + destroy_workqueue(smbdirect_globals.workqueues.immediate); 32 + alloc_immediate_wq_failed: 33 + destroy_workqueue(smbdirect_globals.workqueues.refill); 34 + alloc_refill_wq_failed: 35 + destroy_workqueue(smbdirect_globals.workqueues.idle); 36 + alloc_idle_wq_failed: 37 + destroy_workqueue(smbdirect_globals.workqueues.connect); 38 + alloc_connect_wq_failed: 39 + destroy_workqueue(smbdirect_globals.workqueues.accept); 40 + alloc_accept_wq_failed: 81 41 mutex_unlock(&smbdirect_globals.mutex); 82 42 pr_crit("failed to loaded: %d (%1pe)\n", 83 43 ret, SMBDIRECT_DEBUG_ERR_PTR(ret)); ··· 102 38 mutex_lock(&smbdirect_globals.mutex); 103 39 104 40 smbdirect_devices_exit(); 41 + 42 + destroy_workqueue(smbdirect_globals.workqueues.accept); 43 + destroy_workqueue(smbdirect_globals.workqueues.connect); 44 + destroy_workqueue(smbdirect_globals.workqueues.idle); 45 + destroy_workqueue(smbdirect_globals.workqueues.refill); 46 + destroy_workqueue(smbdirect_globals.workqueues.immediate); 47 + destroy_workqueue(smbdirect_globals.workqueues.cleanup); 105 48 106 49 mutex_unlock(&smbdirect_globals.mutex); 107 50 pr_notice("subsystem unloaded\n");
+7 -2
fs/smb/common/smbdirect/smbdirect_socket.h
··· 111 111 /* 112 112 * This points to the workqueues to 113 113 * be used for this socket. 114 - * It can be per socket (on the client) 115 - * or point to a global workqueue (on the server) 116 114 */ 117 115 struct { 118 116 struct workqueue_struct *accept; ··· 569 571 memset(sc, 0, sizeof(*sc)); 570 572 571 573 init_waitqueue_head(&sc->status_wait); 574 + 575 + sc->workqueues.accept = smbdirect_globals.workqueues.accept; 576 + sc->workqueues.connect = smbdirect_globals.workqueues.connect; 577 + sc->workqueues.idle = smbdirect_globals.workqueues.idle; 578 + sc->workqueues.refill = smbdirect_globals.workqueues.refill; 579 + sc->workqueues.immediate = smbdirect_globals.workqueues.immediate; 580 + sc->workqueues.cleanup = smbdirect_globals.workqueues.cleanup; 572 581 573 582 INIT_WORK(&sc->disconnect_work, __smbdirect_socket_disabled_work); 574 583 disable_work_sync(&sc->disconnect_work);