xprtrdma: Refactor tasklet scheduling
authorChuck Lever <chuck.lever@oracle.com>
Sun, 9 Nov 2014 01:14:37 +0000 (20:14 -0500)
committerAnna Schumaker <Anna.Schumaker@Netapp.com>
Tue, 25 Nov 2014 18:39:20 +0000 (13:39 -0500)
Restore the separate function that schedules the reply handling
tasklet. I need to call it from two different paths.

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
net/sunrpc/xprtrdma/verbs.c

index 3c88276..478b2fd 100644 (file)
@@ -107,6 +107,17 @@ rpcrdma_run_tasklet(unsigned long data)
 static DECLARE_TASKLET(rpcrdma_tasklet_g, rpcrdma_run_tasklet, 0UL);
 
 static void
+rpcrdma_schedule_tasklet(struct list_head *sched_list)
+{
+       unsigned long flags;
+
+       spin_lock_irqsave(&rpcrdma_tk_lock_g, flags);
+       list_splice_tail(sched_list, &rpcrdma_tasklets_g);
+       spin_unlock_irqrestore(&rpcrdma_tk_lock_g, flags);
+       tasklet_schedule(&rpcrdma_tasklet_g);
+}
+
+static void
 rpcrdma_qp_async_error_upcall(struct ib_event *event, void *context)
 {
        struct rpcrdma_ep *ep = context;
@@ -244,7 +255,6 @@ rpcrdma_recvcq_poll(struct ib_cq *cq, struct rpcrdma_ep *ep)
        struct list_head sched_list;
        struct ib_wc *wcs;
        int budget, count, rc;
-       unsigned long flags;
 
        INIT_LIST_HEAD(&sched_list);
        budget = RPCRDMA_WC_BUDGET / RPCRDMA_POLLSIZE;
@@ -262,10 +272,7 @@ rpcrdma_recvcq_poll(struct ib_cq *cq, struct rpcrdma_ep *ep)
        rc = 0;
 
 out_schedule:
-       spin_lock_irqsave(&rpcrdma_tk_lock_g, flags);
-       list_splice_tail(&sched_list, &rpcrdma_tasklets_g);
-       spin_unlock_irqrestore(&rpcrdma_tk_lock_g, flags);
-       tasklet_schedule(&rpcrdma_tasklet_g);
+       rpcrdma_schedule_tasklet(&sched_list);
        return rc;
 }