-----"Steve Wise" <larrystevenwise@xxxxxxxxx> wrote: ----- >To: "Bernard Metzler" <bmt@xxxxxxxxxxxxxx> >From: "Steve Wise" <larrystevenwise@xxxxxxxxx> >Date: 09/07/2019 12:31AM >Cc: linux-rdma@xxxxxxxxxxxxxxx, dledford@xxxxxxxxxx >Subject: [EXTERNAL] Re: [PATCH] RDMA/siw: Relax from kmap_atomic() >use in TX path > >Hey Bernard, is the code below called directly from the driver’s >post_send function? If so it must use atomic...I think. > Hey Steve, Only a kernel TX thread executes the TX path. It is not executed directly from the drivers post_send() method, which only queues work for TX processing and wakes up the TX thread if it currently does not run. The single exception is TX processing out of a user space application context, if no TX thread is currently running, but only for a small burst. In any case, all TX processing is done out of a non-atomic context. Best, Bernard. >Stevo > >> On Sep 6, 2019, at 6:18 AM, Bernard Metzler <bmt@xxxxxxxxxxxxxx> >wrote: >> >> Since the transmit path is never executed in an atomic >> context, we do not need kmap_atomic() and can always >> use less demanding kmap(). >> >> Signed-off-by: Bernard Metzler <bmt@xxxxxxxxxxxxxx> >> --- >> drivers/infiniband/sw/siw/siw_qp_tx.c | 12 +++++------- >> 1 file changed, 5 insertions(+), 7 deletions(-) >> >> diff --git a/drivers/infiniband/sw/siw/siw_qp_tx.c >b/drivers/infiniband/sw/siw/siw_qp_tx.c >> index 8e72f955921d..5d97bba0ce6d 100644 >> --- a/drivers/infiniband/sw/siw/siw_qp_tx.c >> +++ b/drivers/infiniband/sw/siw/siw_qp_tx.c >> @@ -76,16 +76,15 @@ static int siw_try_1seg(struct siw_iwarp_tx >*c_tx, void *paddr) >> if (unlikely(!p)) >> return -EFAULT; >> >> - buffer = kmap_atomic(p); >> + buffer = kmap(p); >> >> if (likely(PAGE_SIZE - off >= bytes)) { >> memcpy(paddr, buffer + off, bytes); >> - kunmap_atomic(buffer); >> } else { >> unsigned long part = bytes - (PAGE_SIZE - off); >> >> memcpy(paddr, buffer + off, part); >> - kunmap_atomic(buffer); >> + kunmap(p); >> >> if (!mem->is_pbl) >> p = siw_get_upage(mem->umem, >> @@ -97,11 +96,10 @@ static int siw_try_1seg(struct siw_iwarp_tx >*c_tx, void *paddr) >> if (unlikely(!p)) >> return -EFAULT; >> >> - buffer = kmap_atomic(p); >> - memcpy(paddr + part, buffer, >> - bytes - part); >> - kunmap_atomic(buffer); >> + buffer = kmap(p); >> + memcpy(paddr + part, buffer, bytes - part); >> } >> + kunmap(p); >> } >> } >> return (int)bytes; >> -- >> 2.17.2 >> > >