Commit 1adde16a authored by Stefan Metzmacher's avatar Stefan Metzmacher Committed by Steve French
Browse files

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: default avatarStefan Metzmacher <metze@samba.org>
Acked-by: default avatarNamjae Jeon <linkinjeon@kernel.org>
Signed-off-by: default avatarSteve French <stfrench@microsoft.com>
parent e4ce1fca
Loading
Loading
Loading
Loading
+9 −0
Original line number Diff line number Diff line
@@ -19,6 +19,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;
+72 −1
Original line number Diff line number Diff line
@@ -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");
}
+7 −2
Original line number Diff line number Diff line
@@ -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);