From: Mr NeilBrown Date: Thu, 1 Jul 2021 03:19:29 +0000 (+1000) Subject: LU-6142 lnet: convert kiblnd/ksocknal_thread_start to vararg X-Git-Tag: 2.14.53~34 X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=commitdiff_plain;h=9976d2c35d40a1709c3539aed76033124e88040e LU-6142 lnet: convert kiblnd/ksocknal_thread_start to vararg Rather than requiring the called to format a thread name into a temp buffer, change these thread_start function to accept a format and args, and to hand them directly to kthread_run(). This is done with a macro rather than a function as the functions are trivial and varargs is slightly easier with macros. Test-Parameters: trivial Signed-off-by: Mr NeilBrown Change-Id: I73926ef38a9e84061d1a3f9acf5c0be4a247f957 Reviewed-on: https://review.whamcloud.com/44122 Tested-by: jenkins Tested-by: Maloo Reviewed-by: James Simmons Reviewed-by: Chris Horn Reviewed-by: Oleg Drokin --- diff --git a/lnet/klnds/o2iblnd/o2iblnd.c b/lnet/klnds/o2iblnd/o2iblnd.c index 0c44a61..1b57abf 100644 --- a/lnet/klnds/o2iblnd/o2iblnd.c +++ b/lnet/klnds/o2iblnd/o2iblnd.c @@ -3159,12 +3159,11 @@ kiblnd_start_schedulers(struct kib_sched_info *sched) } for (i = 0; i < nthrs; i++) { - long id; - char name[20]; - id = KIB_THREAD_ID(sched->ibs_cpt, sched->ibs_nthreads + i); - snprintf(name, sizeof(name), "kiblnd_sd_%02ld_%02ld", - KIB_THREAD_CPT(id), KIB_THREAD_TID(id)); - rc = kiblnd_thread_start(kiblnd_scheduler, (void *)id, name); + long id = KIB_THREAD_ID(sched->ibs_cpt, sched->ibs_nthreads + i); + + rc = kiblnd_thread_start(kiblnd_scheduler, (void *)id, + "kiblnd_sd_%02ld_%02ld", + KIB_THREAD_CPT(id), KIB_THREAD_TID(id)); if (rc == 0) continue; diff --git a/lnet/klnds/o2iblnd/o2iblnd.h b/lnet/klnds/o2iblnd/o2iblnd.h index 652c798..26956a3 100644 --- a/lnet/klnds/o2iblnd/o2iblnd.h +++ b/lnet/klnds/o2iblnd/o2iblnd.h @@ -1093,7 +1093,15 @@ int kiblnd_tunables_init(void); int kiblnd_connd (void *arg); int kiblnd_scheduler(void *arg); -int kiblnd_thread_start(int (*fn)(void *arg), void *arg, char *name); +#define kiblnd_thread_start(fn, data, namefmt, arg...) \ + ({ \ + struct task_struct *__task = kthread_run(fn, data, \ + namefmt, ##arg); \ + if (!IS_ERR(__task)) \ + atomic_inc(&kiblnd_data.kib_nthreads); \ + PTR_ERR_OR_ZERO(__task); \ + }) + int kiblnd_failover_thread (void *arg); int kiblnd_alloc_pages(struct kib_pages **pp, int cpt, int npages); diff --git a/lnet/klnds/o2iblnd/o2iblnd_cb.c b/lnet/klnds/o2iblnd/o2iblnd_cb.c index 7189676..38c91a7 100644 --- a/lnet/klnds/o2iblnd/o2iblnd_cb.c +++ b/lnet/klnds/o2iblnd/o2iblnd_cb.c @@ -1931,18 +1931,6 @@ kiblnd_recv(struct lnet_ni *ni, void *private, struct lnet_msg *lntmsg, return rc; } -int -kiblnd_thread_start(int (*fn)(void *arg), void *arg, char *name) -{ - struct task_struct *task = kthread_run(fn, arg, "%s", name); - - if (IS_ERR(task)) - return PTR_ERR(task); - - atomic_inc(&kiblnd_data.kib_nthreads); - return 0; -} - static void kiblnd_thread_fini (void) { diff --git a/lnet/klnds/socklnd/socklnd.c b/lnet/klnds/socklnd/socklnd.c index 8e84644..fef2edf 100644 --- a/lnet/klnds/socklnd/socklnd.c +++ b/lnet/klnds/socklnd/socklnd.c @@ -2045,15 +2045,13 @@ ksocknal_base_startup(void) } for (i = 0; i < *ksocknal_tunables.ksnd_nconnds; i++) { - char name[16]; spin_lock_bh(&ksocknal_data.ksnd_connd_lock); ksocknal_data.ksnd_connd_starting++; spin_unlock_bh(&ksocknal_data.ksnd_connd_lock); - - snprintf(name, sizeof(name), "socknal_cd%02d", i); rc = ksocknal_thread_start(ksocknal_connd, - (void *)((uintptr_t)i), name); + (void *)((uintptr_t)i), + "socknal_cd%02d", i); if (rc != 0) { spin_lock_bh(&ksocknal_data.ksnd_connd_lock); ksocknal_data.ksnd_connd_starting--; @@ -2221,14 +2219,12 @@ ksocknal_start_schedulers(struct ksock_sched *sched) for (i = 0; i < nthrs; i++) { long id; - char name[20]; id = KSOCK_THREAD_ID(sched->kss_cpt, sched->kss_nthreads + i); - snprintf(name, sizeof(name), "socknal_sd%02d_%02d", - sched->kss_cpt, (int)KSOCK_THREAD_SID(id)); - - rc = ksocknal_thread_start(ksocknal_scheduler, - (void *)id, name); + rc = ksocknal_thread_start(ksocknal_scheduler, (void *)id, + "socknal_sd%02d_%02d", + sched->kss_cpt, + (int)KSOCK_THREAD_SID(id)); if (rc == 0) continue; diff --git a/lnet/klnds/socklnd/socklnd.h b/lnet/klnds/socklnd/socklnd.h index f5c29d5..1c64f5b 100644 --- a/lnet/klnds/socklnd/socklnd.h +++ b/lnet/klnds/socklnd/socklnd.h @@ -621,7 +621,15 @@ extern void ksocknal_next_tx_carrier(struct ksock_conn *conn); extern void ksocknal_queue_tx_locked(struct ksock_tx *tx, struct ksock_conn *conn); extern void ksocknal_txlist_done(struct lnet_ni *ni, struct list_head *txlist, int error); -extern int ksocknal_thread_start(int (*fn)(void *arg), void *arg, char *name); +#define ksocknal_thread_start(fn, data, namefmt, arg...) \ + ({ \ + struct task_struct *__task = kthread_run(fn, data, \ + namefmt, ##arg); \ + if (!IS_ERR(__task)) \ + atomic_inc(&ksocknal_data.ksnd_nthreads); \ + PTR_ERR_OR_ZERO(__task); \ + }) + extern void ksocknal_thread_fini(void); extern void ksocknal_launch_all_connections_locked(struct ksock_peer_ni *peer_ni); extern struct ksock_conn_cb *ksocknal_find_connectable_conn_cb_locked(struct ksock_peer_ni *peer_ni); diff --git a/lnet/klnds/socklnd/socklnd_cb.c b/lnet/klnds/socklnd/socklnd_cb.c index 24889b6..ec3f952 100644 --- a/lnet/klnds/socklnd/socklnd_cb.c +++ b/lnet/klnds/socklnd/socklnd_cb.c @@ -1044,18 +1044,6 @@ ksocknal_send(struct lnet_ni *ni, void *private, struct lnet_msg *lntmsg) return (-EIO); } -int -ksocknal_thread_start(int (*fn)(void *arg), void *arg, char *name) -{ - struct task_struct *task = kthread_run(fn, arg, "%s", name); - - if (IS_ERR(task)) - return PTR_ERR(task); - - atomic_inc(&ksocknal_data.ksnd_nthreads); - return 0; -} - void ksocknal_thread_fini (void) { @@ -2068,7 +2056,6 @@ ksocknal_connect(struct ksock_conn_cb *conn_cb) static int ksocknal_connd_check_start(time64_t sec, long *timeout) { - char name[16]; int rc; int total = ksocknal_data.ksnd_connd_starting + ksocknal_data.ksnd_connd_running; @@ -2106,8 +2093,8 @@ ksocknal_connd_check_start(time64_t sec, long *timeout) spin_unlock_bh(&ksocknal_data.ksnd_connd_lock); /* NB: total is the next id */ - snprintf(name, sizeof(name), "socknal_cd%02d", total); - rc = ksocknal_thread_start(ksocknal_connd, NULL, name); + rc = ksocknal_thread_start(ksocknal_connd, NULL, + "socknal_cd%02d", total); spin_lock_bh(&ksocknal_data.ksnd_connd_lock); if (rc == 0)