Re: [PATCH for-next v3 1/7] RDMA/rxe: Convert triple tasklets to use workqueue

2022-12-28 Thread Bob Pearson
On 12/23/22 00:51, Daisuke Matsuda wrote:
> In order to implement On-Demand Paging on the rxe driver, triple tasklets
> (requester, responder, and completer) must be allowed to sleep so that they
> can trigger page fault when pages being accessed are not present.
> 
> This patch replaces the tasklets with a workqueue, but still allows direct-
> call of works from softirq context if it is obvious that MRs are not going
> to be accessed and there is no work being processed in the workqueue.

There are already at least two patch sets that do this waiting to get upstream.
Bob

> 
> As counterparts to tasklet_disable() and tasklet_enable() are missing for
> workqueues, an atomic value is introduced to prevent work items from being
> scheduled while qp reset is in progress.
> 
> The way to initialize/destroy workqueue is picked up from the
> implementation of Ian Ziemba and Bob Pearson at HPE.
> 
> Link: https://lore.kernel.org/all/20221018043345.4033-1-rpearson...@gmail.com/
> Signed-off-by: Daisuke Matsuda 
> ---
>  drivers/infiniband/sw/rxe/rxe.c   |  9 -
>  drivers/infiniband/sw/rxe/rxe_comp.c  |  2 +-
>  drivers/infiniband/sw/rxe/rxe_param.h |  2 +-
>  drivers/infiniband/sw/rxe/rxe_qp.c|  2 +-
>  drivers/infiniband/sw/rxe/rxe_req.c   |  2 +-
>  drivers/infiniband/sw/rxe/rxe_resp.c  |  2 +-
>  drivers/infiniband/sw/rxe/rxe_task.c  | 52 ---
>  drivers/infiniband/sw/rxe/rxe_task.h  | 15 ++--
>  8 files changed, 65 insertions(+), 21 deletions(-)
> 
> diff --git a/drivers/infiniband/sw/rxe/rxe.c b/drivers/infiniband/sw/rxe/rxe.c
> index 136c2efe3466..3c7e42e5b0c7 100644
> --- a/drivers/infiniband/sw/rxe/rxe.c
> +++ b/drivers/infiniband/sw/rxe/rxe.c
> @@ -210,10 +210,16 @@ static int __init rxe_module_init(void)
>  {
>   int err;
>  
> - err = rxe_net_init();
> + err = rxe_alloc_wq();
>   if (err)
>   return err;
>  
> + err = rxe_net_init();
> + if (err) {
> + rxe_destroy_wq();
> + return err;
> + }
> +
>   rdma_link_register(&rxe_link_ops);
>   pr_info("loaded\n");
>   return 0;
> @@ -224,6 +230,7 @@ static void __exit rxe_module_exit(void)
>   rdma_link_unregister(&rxe_link_ops);
>   ib_unregister_driver(RDMA_DRIVER_RXE);
>   rxe_net_exit();
> + rxe_destroy_wq();
>  
>   pr_info("unloaded\n");
>  }
> diff --git a/drivers/infiniband/sw/rxe/rxe_comp.c 
> b/drivers/infiniband/sw/rxe/rxe_comp.c
> index 20737fec392b..046bbacce37c 100644
> --- a/drivers/infiniband/sw/rxe/rxe_comp.c
> +++ b/drivers/infiniband/sw/rxe/rxe_comp.c
> @@ -773,7 +773,7 @@ int rxe_completer(void *arg)
>   }
>  
>   /* A non-zero return value will cause rxe_do_task to
> -  * exit its loop and end the tasklet. A zero return
> +  * exit its loop and end the work item. A zero return
>* will continue looping and return to rxe_completer
>*/
>  done:
> diff --git a/drivers/infiniband/sw/rxe/rxe_param.h 
> b/drivers/infiniband/sw/rxe/rxe_param.h
> index a754fc902e3d..bd8050e99d6b 100644
> --- a/drivers/infiniband/sw/rxe/rxe_param.h
> +++ b/drivers/infiniband/sw/rxe/rxe_param.h
> @@ -112,7 +112,7 @@ enum rxe_device_param {
>   RXE_INFLIGHT_SKBS_PER_QP_HIGH   = 64,
>   RXE_INFLIGHT_SKBS_PER_QP_LOW= 16,
>  
> - /* Max number of interations of each tasklet
> + /* Max number of interations of each work item
>* before yielding the cpu to let other
>* work make progress
>*/
> diff --git a/drivers/infiniband/sw/rxe/rxe_qp.c 
> b/drivers/infiniband/sw/rxe/rxe_qp.c
> index ab72db68b58f..e033b2449dfe 100644
> --- a/drivers/infiniband/sw/rxe/rxe_qp.c
> +++ b/drivers/infiniband/sw/rxe/rxe_qp.c
> @@ -471,7 +471,7 @@ int rxe_qp_chk_attr(struct rxe_dev *rxe, struct rxe_qp 
> *qp,
>  /* move the qp to the reset state */
>  static void rxe_qp_reset(struct rxe_qp *qp)
>  {
> - /* stop tasks from running */
> + /* flush workqueue and stop tasks from running */
>   rxe_disable_task(&qp->resp.task);
>  
>   /* stop request/comp */
> diff --git a/drivers/infiniband/sw/rxe/rxe_req.c 
> b/drivers/infiniband/sw/rxe/rxe_req.c
> index 899c8779f800..2bcd287a2c3b 100644
> --- a/drivers/infiniband/sw/rxe/rxe_req.c
> +++ b/drivers/infiniband/sw/rxe/rxe_req.c
> @@ -830,7 +830,7 @@ int rxe_requester(void *arg)
>   update_state(qp, &pkt);
>  
>   /* A non-zero return value will cause rxe_do_task to
> -  * exit its loop and end the tasklet. A zero return
> +  * exit its loop and end the work item. A zero return
>* will continue looping and return to rxe_requester
>*/
>  done:
> diff --git a/drivers/infiniband/sw/rxe/rxe_resp.c 
> b/drivers/infiniband/sw/rxe/rxe_resp.c
> index c74972244f08..d9134a00a529 100644
> --- a/drivers/infiniband/sw/rxe/rxe_resp.c
> +++ b/drivers/infiniband/sw/rxe/rxe_resp.c
> @@ -1691,7 +1691,7 @@ int rxe_responder(void *arg)
>   }
>  
>   /* A non-zero return value will cause rxe_do_task to
> -   

Re: [PATCH for-next v3 1/7] RDMA/rxe: Convert triple tasklets to use workqueue

2022-12-28 Thread Zhu Yanjun
On Thu, Dec 29, 2022 at 12:56 AM Bob Pearson  wrote:
>
> On 12/23/22 00:51, Daisuke Matsuda wrote:
> > In order to implement On-Demand Paging on the rxe driver, triple tasklets
> > (requester, responder, and completer) must be allowed to sleep so that they
> > can trigger page fault when pages being accessed are not present.
> >
> > This patch replaces the tasklets with a workqueue, but still allows direct-
> > call of works from softirq context if it is obvious that MRs are not going
> > to be accessed and there is no work being processed in the workqueue.
>
> There are already at least two patch sets that do this waiting to get 
> upstream.

RXE accepted several patch sets just now. So it needs time to make
tests and check bugs.

Zhu Yanjun

> Bob
>
> >
> > As counterparts to tasklet_disable() and tasklet_enable() are missing for
> > workqueues, an atomic value is introduced to prevent work items from being
> > scheduled while qp reset is in progress.
> >
> > The way to initialize/destroy workqueue is picked up from the
> > implementation of Ian Ziemba and Bob Pearson at HPE.
> >
> > Link: 
> > https://lore.kernel.org/all/20221018043345.4033-1-rpearson...@gmail.com/
> > Signed-off-by: Daisuke Matsuda 
> > ---
> >  drivers/infiniband/sw/rxe/rxe.c   |  9 -
> >  drivers/infiniband/sw/rxe/rxe_comp.c  |  2 +-
> >  drivers/infiniband/sw/rxe/rxe_param.h |  2 +-
> >  drivers/infiniband/sw/rxe/rxe_qp.c|  2 +-
> >  drivers/infiniband/sw/rxe/rxe_req.c   |  2 +-
> >  drivers/infiniband/sw/rxe/rxe_resp.c  |  2 +-
> >  drivers/infiniband/sw/rxe/rxe_task.c  | 52 ---
> >  drivers/infiniband/sw/rxe/rxe_task.h  | 15 ++--
> >  8 files changed, 65 insertions(+), 21 deletions(-)
> >
> > diff --git a/drivers/infiniband/sw/rxe/rxe.c 
> > b/drivers/infiniband/sw/rxe/rxe.c
> > index 136c2efe3466..3c7e42e5b0c7 100644
> > --- a/drivers/infiniband/sw/rxe/rxe.c
> > +++ b/drivers/infiniband/sw/rxe/rxe.c
> > @@ -210,10 +210,16 @@ static int __init rxe_module_init(void)
> >  {
> >   int err;
> >
> > - err = rxe_net_init();
> > + err = rxe_alloc_wq();
> >   if (err)
> >   return err;
> >
> > + err = rxe_net_init();
> > + if (err) {
> > + rxe_destroy_wq();
> > + return err;
> > + }
> > +
> >   rdma_link_register(&rxe_link_ops);
> >   pr_info("loaded\n");
> >   return 0;
> > @@ -224,6 +230,7 @@ static void __exit rxe_module_exit(void)
> >   rdma_link_unregister(&rxe_link_ops);
> >   ib_unregister_driver(RDMA_DRIVER_RXE);
> >   rxe_net_exit();
> > + rxe_destroy_wq();
> >
> >   pr_info("unloaded\n");
> >  }
> > diff --git a/drivers/infiniband/sw/rxe/rxe_comp.c 
> > b/drivers/infiniband/sw/rxe/rxe_comp.c
> > index 20737fec392b..046bbacce37c 100644
> > --- a/drivers/infiniband/sw/rxe/rxe_comp.c
> > +++ b/drivers/infiniband/sw/rxe/rxe_comp.c
> > @@ -773,7 +773,7 @@ int rxe_completer(void *arg)
> >   }
> >
> >   /* A non-zero return value will cause rxe_do_task to
> > -  * exit its loop and end the tasklet. A zero return
> > +  * exit its loop and end the work item. A zero return
> >* will continue looping and return to rxe_completer
> >*/
> >  done:
> > diff --git a/drivers/infiniband/sw/rxe/rxe_param.h 
> > b/drivers/infiniband/sw/rxe/rxe_param.h
> > index a754fc902e3d..bd8050e99d6b 100644
> > --- a/drivers/infiniband/sw/rxe/rxe_param.h
> > +++ b/drivers/infiniband/sw/rxe/rxe_param.h
> > @@ -112,7 +112,7 @@ enum rxe_device_param {
> >   RXE_INFLIGHT_SKBS_PER_QP_HIGH   = 64,
> >   RXE_INFLIGHT_SKBS_PER_QP_LOW= 16,
> >
> > - /* Max number of interations of each tasklet
> > + /* Max number of interations of each work item
> >* before yielding the cpu to let other
> >* work make progress
> >*/
> > diff --git a/drivers/infiniband/sw/rxe/rxe_qp.c 
> > b/drivers/infiniband/sw/rxe/rxe_qp.c
> > index ab72db68b58f..e033b2449dfe 100644
> > --- a/drivers/infiniband/sw/rxe/rxe_qp.c
> > +++ b/drivers/infiniband/sw/rxe/rxe_qp.c
> > @@ -471,7 +471,7 @@ int rxe_qp_chk_attr(struct rxe_dev *rxe, struct rxe_qp 
> > *qp,
> >  /* move the qp to the reset state */
> >  static void rxe_qp_reset(struct rxe_qp *qp)
> >  {
> > - /* stop tasks from running */
> > + /* flush workqueue and stop tasks from running */
> >   rxe_disable_task(&qp->resp.task);
> >
> >   /* stop request/comp */
> > diff --git a/drivers/infiniband/sw/rxe/rxe_req.c 
> > b/drivers/infiniband/sw/rxe/rxe_req.c
> > index 899c8779f800..2bcd287a2c3b 100644
> > --- a/drivers/infiniband/sw/rxe/rxe_req.c
> > +++ b/drivers/infiniband/sw/rxe/rxe_req.c
> > @@ -830,7 +830,7 @@ int rxe_requester(void *arg)
> >   update_state(qp, &pkt);
> >
> >   /* A non-zero return value will cause rxe_do_task to
> > -  * exit its loop and end the tasklet. A zero return
> > +  * exit its loop and end the work item. A zero return
> >* will continue looping and return to rxe_reque

Re: [PATCH for-next v3 1/7] RDMA/rxe: Convert triple tasklets to use workqueue

2022-12-28 Thread Leon Romanovsky
On Wed, Dec 28, 2022 at 10:56:11AM -0600, Bob Pearson wrote:
> On 12/23/22 00:51, Daisuke Matsuda wrote:
> > In order to implement On-Demand Paging on the rxe driver, triple tasklets
> > (requester, responder, and completer) must be allowed to sleep so that they
> > can trigger page fault when pages being accessed are not present.
> > 
> > This patch replaces the tasklets with a workqueue, but still allows direct-
> > call of works from softirq context if it is obvious that MRs are not going
> > to be accessed and there is no work being processed in the workqueue.
> 
> There are already at least two patch sets that do this waiting to get upstream

I don't see any unhandled RXE series, except of this one patch [1],
which is one out larger series.

[1] 
https://patchwork.kernel.org/project/linux-rdma/patch/20221029031331.64518-1-rpearson...@gmail.com/

> Bob