Skip to content

Commit ea91c2c

Browse files
gerd-rauschBrian Maly
authored andcommitted
Revert "net/rds: Get rid of tasklets"
This reverts commit db42a07e602d1d2306e8a7026743205abb5ebe0c. Orabug: 33590962 Signed-off-by: Gerd Rausch <[email protected]> Reviewed-by: John Donnelly <[email protected]> Signed-off-by: Brian Maly <[email protected]>
1 parent 750ec72 commit ea91c2c

File tree

3 files changed

+24
-41
lines changed

3 files changed

+24
-41
lines changed

net/rds/ib.c

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,6 @@ DEFINE_SPINLOCK(ib_nodev_conns_lock);
7878
LIST_HEAD(ib_nodev_conns);
7979

8080
struct workqueue_struct *rds_aux_wq;
81-
struct workqueue_struct *rds_evt_wq;
8281

8382
static struct ib_mr *rds_ib_get_dma_mr(struct ib_pd *pd, int mr_access_flags)
8483
{
@@ -1349,15 +1348,9 @@ int rds_ib_init(void)
13491348
goto out_recv;
13501349
}
13511350

1352-
rds_evt_wq = alloc_workqueue("krdsd_evt", WQ_UNBOUND, 0);
1353-
if (!rds_evt_wq) {
1354-
pr_err("RDS/IB: failed to create evt workqueue\n");
1355-
goto out_aux_wq;
1356-
}
1357-
13581351
ret = rds_trans_register(&rds_ib_transport);
13591352
if (ret)
1360-
goto out_evt_wq;
1353+
goto out_aux_wq;
13611354

13621355
rds_info_register_func(RDS_INFO_IB_CONNECTIONS, rds_ib_ic_info);
13631356
#if IS_ENABLED(CONFIG_IPV6)
@@ -1375,8 +1368,6 @@ int rds_ib_init(void)
13751368

13761369
goto out;
13771370

1378-
out_evt_wq:
1379-
destroy_workqueue(rds_evt_wq);
13801371
out_aux_wq:
13811372
destroy_workqueue(rds_aux_wq);
13821373
out_recv:
@@ -1445,7 +1436,6 @@ void rds_ib_exit(void)
14451436
rds_ib_sysctl_exit();
14461437
rds_ib_recv_exit();
14471438

1448-
destroy_workqueue(rds_evt_wq);
14491439
destroy_workqueue(rds_aux_wq);
14501440
rds_ib_fmr_exit();
14511441
debugfs_remove_recursive(debugfs_basedir);

net/rds/ib.h

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -256,8 +256,8 @@ struct rds_ib_connection {
256256
atomic_t i_fastreg_wrs;
257257

258258
/* interrupt handling */
259-
struct work_struct i_recv_w;
260-
struct work_struct i_send_w;
259+
struct tasklet_struct i_stasklet;
260+
struct tasklet_struct i_rtasklet;
261261

262262
/* tx */
263263
struct rds_ib_work_ring i_send_ring;
@@ -270,6 +270,7 @@ struct rds_ib_connection {
270270
atomic_t i_signaled_sends;
271271

272272
/* rx */
273+
struct tasklet_struct i_recv_tasklet;
273274
struct mutex i_recv_mutex;
274275
struct rds_ib_work_ring i_recv_ring;
275276
struct rds_ib_incoming *i_ibinc;
@@ -432,9 +433,9 @@ struct rds_ib_device {
432433
struct ib_cq *fastreg_cq;
433434
struct ib_wc fastreg_wc[RDS_WC_MAX];
434435
struct ib_qp *fastreg_qp;
436+
struct tasklet_struct fastreg_tasklet;
435437
atomic_t fastreg_wrs;
436438
struct rw_semaphore fastreg_lock;
437-
struct work_struct fastreg_w;
438439
struct work_struct fastreg_reset_w;
439440

440441
struct ib_mr *mr;
@@ -614,7 +615,6 @@ static inline __s32 rds_qp_num(struct rds_connection *conn, int dst)
614615

615616
/* ib.c */
616617
extern struct workqueue_struct *rds_aux_wq;
617-
extern struct workqueue_struct *rds_evt_wq;
618618
extern struct rds_transport rds_ib_transport;
619619
extern void rds_ib_add_one(struct ib_device *device);
620620
extern void rds_ib_remove_one(struct ib_device *device, void *client_data);
@@ -717,6 +717,7 @@ int rds_ib_inc_copy_to_user(struct rds_incoming *inc, struct iov_iter *to);
717717
void rds_ib_recv_cqe_handler(struct rds_ib_connection *ic,
718718
struct ib_wc *wc,
719719
struct rds_ib_ack_state *state);
720+
void rds_ib_recv_tasklet_fn(unsigned long data);
720721
void rds_ib_recv_init_ring(struct rds_ib_connection *ic);
721722
void rds_ib_recv_clear_ring(struct rds_ib_connection *ic);
722723
void rds_ib_recv_init_ack(struct rds_ib_connection *ic);

net/rds/ib_cm.c

Lines changed: 18 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -529,8 +529,7 @@ static void rds_ib_cq_comp_handler_fastreg(struct ib_cq *cq, void *context)
529529
{
530530
struct rds_ib_device *rds_ibdev = context;
531531

532-
queue_work_on(smp_processor_id(),
533-
rds_evt_wq, &rds_ibdev->fastreg_w);
532+
tasklet_schedule(&rds_ibdev->fastreg_tasklet);
534533
}
535534

536535
static void rds_ib_cq_comp_handler_send(struct ib_cq *cq, void *context)
@@ -542,8 +541,7 @@ static void rds_ib_cq_comp_handler_send(struct ib_cq *cq, void *context)
542541

543542
rds_ib_stats_inc(s_ib_evt_handler_call);
544543

545-
queue_work_on(smp_processor_id(),
546-
rds_evt_wq, &ic->i_send_w);
544+
tasklet_schedule(&ic->i_stasklet);
547545
}
548546

549547
static void rds_ib_cq_comp_handler_recv(struct ib_cq *cq, void *context)
@@ -555,8 +553,7 @@ static void rds_ib_cq_comp_handler_recv(struct ib_cq *cq, void *context)
555553

556554
rds_ib_stats_inc(s_ib_evt_handler_call);
557555

558-
queue_work_on(smp_processor_id(),
559-
rds_evt_wq, &ic->i_recv_w);
556+
tasklet_schedule(&ic->i_rtasklet);
560557
}
561558

562559
static void poll_fcq(struct rds_ib_device *rds_ibdev, struct ib_cq *cq,
@@ -623,22 +620,18 @@ static void poll_rcq(struct rds_ib_connection *ic, struct ib_cq *cq,
623620
}
624621
}
625622

626-
static void rds_ib_cq_comp_handler_fastreg_w(struct work_struct *work)
623+
static void rds_ib_tasklet_fn_fastreg(unsigned long data)
627624
{
628-
struct rds_ib_device *rds_ibdev = container_of(work,
629-
struct rds_ib_device,
630-
fastreg_w);
625+
struct rds_ib_device *rds_ibdev = (struct rds_ib_device *)data;
631626

632627
poll_fcq(rds_ibdev, rds_ibdev->fastreg_cq, rds_ibdev->fastreg_wc);
633628
ib_req_notify_cq(rds_ibdev->fastreg_cq, IB_CQ_NEXT_COMP);
634629
poll_fcq(rds_ibdev, rds_ibdev->fastreg_cq, rds_ibdev->fastreg_wc);
635630
}
636631

637-
void rds_ib_send_w(struct work_struct *work)
632+
void rds_ib_tasklet_fn_send(unsigned long data)
638633
{
639-
struct rds_ib_connection *ic = container_of(work,
640-
struct rds_ib_connection,
641-
i_send_w);
634+
struct rds_ib_connection *ic = (struct rds_ib_connection *) data;
642635
struct rds_connection *conn = ic->conn;
643636

644637
rds_ib_stats_inc(s_ib_tasklet_call);
@@ -712,11 +705,9 @@ static void rds_ib_rx(struct rds_ib_connection *ic)
712705
}
713706
}
714707

715-
void rds_ib_recv_w(struct work_struct *work)
708+
void rds_ib_tasklet_fn_recv(unsigned long data)
716709
{
717-
struct rds_ib_connection *ic = container_of(work,
718-
struct rds_ib_connection,
719-
i_recv_w);
710+
struct rds_ib_connection *ic = (struct rds_ib_connection *) data;
720711

721712
spin_lock_bh(&ic->i_rx_lock);
722713
if (ic->i_rx_wait_for_handler)
@@ -2122,11 +2113,10 @@ void rds_ib_conn_path_shutdown_prepare(struct rds_conn_path *cp)
21222113
} else if (rds_ib_srq_enabled && ic->rds_ibdev) {
21232114
/*
21242115
wait for the last wqe to complete, then schedule
2125-
the recv work to drain the RX CQ.
2116+
the recv tasklet to drain the RX CQ.
21262117
*/
21272118
wait_for_completion(&ic->i_last_wqe_complete);
2128-
queue_work_on(smp_processor_id(),
2129-
rds_evt_wq, &ic->i_recv_w);
2119+
tasklet_schedule(&ic->i_rtasklet);
21302120
}
21312121
}
21322122
}
@@ -2166,7 +2156,8 @@ void rds_ib_conn_path_shutdown_final(struct rds_conn_path *cp)
21662156
if (ic->i_cm_id) {
21672157
cancel_delayed_work_sync(&ic->i_rx_w.work);
21682158

2169-
flush_workqueue(rds_evt_wq);
2159+
tasklet_kill(&ic->i_stasklet);
2160+
tasklet_kill(&ic->i_rtasklet);
21702161

21712162
ic->i_flags &= ~RDS_IB_CQ_ERR;
21722163

@@ -2279,8 +2270,8 @@ int rds_ib_conn_alloc(struct rds_connection *conn, gfp_t gfp)
22792270
INIT_LIST_HEAD(&ic->ib_node);
22802271
init_rwsem(&ic->i_cm_id_free_lock);
22812272

2282-
INIT_WORK(&ic->i_send_w, rds_ib_send_w);
2283-
INIT_WORK(&ic->i_recv_w, rds_ib_recv_w);
2273+
tasklet_init(&ic->i_stasklet, rds_ib_tasklet_fn_send, (unsigned long) ic);
2274+
tasklet_init(&ic->i_rtasklet, rds_ib_tasklet_fn_recv, (unsigned long) ic);
22842275
mutex_init(&ic->i_recv_mutex);
22852276
#ifndef KERNEL_HAS_ATOMIC64
22862277
spin_lock_init(&ic->i_ack_lock);
@@ -2365,7 +2356,7 @@ void rds_ib_destroy_fastreg(struct rds_ib_device *rds_ibdev)
23652356
*/
23662357
WARN_ON(atomic_read(&rds_ibdev->fastreg_wrs) != RDS_IB_DEFAULT_FREG_WR);
23672358

2368-
flush_workqueue(rds_evt_wq);
2359+
tasklet_kill(&rds_ibdev->fastreg_tasklet);
23692360
if (rds_ibdev->fastreg_qp) {
23702361
/* Destroy qp */
23712362
if (ib_destroy_qp(rds_ibdev->fastreg_qp))
@@ -2526,7 +2517,8 @@ int rds_ib_setup_fastreg(struct rds_ib_device *rds_ibdev)
25262517
"moved qp to RTS state for device",
25272518
0);
25282519

2529-
INIT_WORK(&rds_ibdev->fastreg_w, rds_ib_cq_comp_handler_fastreg_w);
2520+
tasklet_init(&rds_ibdev->fastreg_tasklet, rds_ib_tasklet_fn_fastreg,
2521+
(unsigned long)rds_ibdev);
25302522
atomic_set(&rds_ibdev->fastreg_wrs, RDS_IB_DEFAULT_FREG_WR);
25312523

25322524
clean_up:

0 commit comments

Comments
 (0)