linux-rdma.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* Re: [PATCH 1/1] RDMA/rxe: Compact the function free_rd_atomic_resource
  2022-05-17 19:08 [PATCH 1/1] RDMA/rxe: Compact the function free_rd_atomic_resource yanjun.zhu
@ 2022-05-17 14:51 ` Bob Pearson
  2022-05-17 14:55   ` Jason Gunthorpe
  2022-05-17 15:14   ` Yanjun Zhu
  0 siblings, 2 replies; 6+ messages in thread
From: Bob Pearson @ 2022-05-17 14:51 UTC (permalink / raw)
  To: yanjun.zhu, jgg, leon, linux-rdma

On 5/17/22 14:08, yanjun.zhu@linux.dev wrote:
> From: Zhu Yanjun <yanjun.zhu@linux.dev>
> 
> Compact the function and move it to the header file.
I have two issues with this patch.

There is no advantage of having an inline function in a header file
that is only called once. The compiler is perfectly capable of (and does)
inlining a static function in a .c file if only called once. This just
makes the code harder to read.

There is a patch in for-rc that gets rid of read.mr in favor of an rkey.
This patch is out of date.

Bob
> 
> Signed-off-by: Zhu Yanjun <yanjun.zhu@linux.dev>
> ---
>  drivers/infiniband/sw/rxe/rxe_loc.h  | 11 ++++++++++-
>  drivers/infiniband/sw/rxe/rxe_qp.c   | 15 ++-------------
>  drivers/infiniband/sw/rxe/rxe_resp.c |  4 ++--
>  3 files changed, 14 insertions(+), 16 deletions(-)
> 
> diff --git a/drivers/infiniband/sw/rxe/rxe_loc.h b/drivers/infiniband/sw/rxe/rxe_loc.h
> index 409efeecd581..6517b4f104b1 100644
> --- a/drivers/infiniband/sw/rxe/rxe_loc.h
> +++ b/drivers/infiniband/sw/rxe/rxe_loc.h
> @@ -145,7 +145,16 @@ static inline int rcv_wqe_size(int max_sge)
>  		max_sge * sizeof(struct ib_sge);
>  }
>  
> -void free_rd_atomic_resource(struct rxe_qp *qp, struct resp_res *res);
> +static inline void free_rd_atomic_resource(struct resp_res *res)
> +{
> +	if (res->type == RXE_ATOMIC_MASK) {
> +		kfree_skb(res->atomic.skb);
> +	} else if (res->type == RXE_READ_MASK) {
> +		if (res->read.mr)
> +			rxe_drop_ref(res->read.mr);
> +	}
> +	res->type = 0;
> +}
>  
>  static inline void rxe_advance_resp_resource(struct rxe_qp *qp)
>  {
> diff --git a/drivers/infiniband/sw/rxe/rxe_qp.c b/drivers/infiniband/sw/rxe/rxe_qp.c
> index 5f270cbf18c6..b29208852bc4 100644
> --- a/drivers/infiniband/sw/rxe/rxe_qp.c
> +++ b/drivers/infiniband/sw/rxe/rxe_qp.c
> @@ -126,24 +126,13 @@ static void free_rd_atomic_resources(struct rxe_qp *qp)
>  		for (i = 0; i < qp->attr.max_dest_rd_atomic; i++) {
>  			struct resp_res *res = &qp->resp.resources[i];
>  
> -			free_rd_atomic_resource(qp, res);
> +			free_rd_atomic_resource(res);
>  		}
>  		kfree(qp->resp.resources);
>  		qp->resp.resources = NULL;
>  	}
>  }
>  
> -void free_rd_atomic_resource(struct rxe_qp *qp, struct resp_res *res)
> -{
> -	if (res->type == RXE_ATOMIC_MASK) {
> -		kfree_skb(res->atomic.skb);
> -	} else if (res->type == RXE_READ_MASK) {
> -		if (res->read.mr)
> -			rxe_drop_ref(res->read.mr);
> -	}
> -	res->type = 0;
> -}
> -
>  static void cleanup_rd_atomic_resources(struct rxe_qp *qp)
>  {
>  	int i;
> @@ -152,7 +141,7 @@ static void cleanup_rd_atomic_resources(struct rxe_qp *qp)
>  	if (qp->resp.resources) {
>  		for (i = 0; i < qp->attr.max_dest_rd_atomic; i++) {
>  			res = &qp->resp.resources[i];
> -			free_rd_atomic_resource(qp, res);
> +			free_rd_atomic_resource(res);
>  		}
>  	}
>  }
> diff --git a/drivers/infiniband/sw/rxe/rxe_resp.c b/drivers/infiniband/sw/rxe/rxe_resp.c
> index c369d78fc8e8..923a71ff305c 100644
> --- a/drivers/infiniband/sw/rxe/rxe_resp.c
> +++ b/drivers/infiniband/sw/rxe/rxe_resp.c
> @@ -663,7 +663,7 @@ static enum resp_states read_reply(struct rxe_qp *qp,
>  		 */
>  		res = &qp->resp.resources[qp->resp.res_head];
>  
> -		free_rd_atomic_resource(qp, res);
> +		free_rd_atomic_resource(res);
>  		rxe_advance_resp_resource(qp);
>  
>  		res->type		= RXE_READ_MASK;
> @@ -977,7 +977,7 @@ static int send_atomic_ack(struct rxe_qp *qp, struct rxe_pkt_info *pkt,
>  	}
>  
>  	res = &qp->resp.resources[qp->resp.res_head];
> -	free_rd_atomic_resource(qp, res);
> +	free_rd_atomic_resource(res);
>  	rxe_advance_resp_resource(qp);
>  
>  	skb_get(skb);


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH 1/1] RDMA/rxe: Compact the function free_rd_atomic_resource
  2022-05-17 14:51 ` Bob Pearson
@ 2022-05-17 14:55   ` Jason Gunthorpe
  2022-05-17 15:14   ` Yanjun Zhu
  1 sibling, 0 replies; 6+ messages in thread
From: Jason Gunthorpe @ 2022-05-17 14:55 UTC (permalink / raw)
  To: Bob Pearson; +Cc: yanjun.zhu, leon, linux-rdma

On Tue, May 17, 2022 at 09:51:44AM -0500, Bob Pearson wrote:
> On 5/17/22 14:08, yanjun.zhu@linux.dev wrote:
> > From: Zhu Yanjun <yanjun.zhu@linux.dev>
> > 
> > Compact the function and move it to the header file.
> I have two issues with this patch.
> 
> There is no advantage of having an inline function in a header file
> that is only called once. The compiler is perfectly capable of (and does)
> inlining a static function in a .c file if only called once. This just
> makes the code harder to read.

That is only if the function is static in the compilation unit, in
this case the only call site is in a different compilation unit

That still doesn't excuse putting it in a header file, but it does
suggest it could be just moved and made static.

> There is a patch in for-rc that gets rid of read.mr in favor of an rkey.
> This patch is out of date.

You are resending that with some fix?

Jason

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH 1/1] RDMA/rxe: Compact the function free_rd_atomic_resource
  2022-05-17 14:51 ` Bob Pearson
  2022-05-17 14:55   ` Jason Gunthorpe
@ 2022-05-17 15:14   ` Yanjun Zhu
  2022-05-17 15:49     ` Bob Pearson
  1 sibling, 1 reply; 6+ messages in thread
From: Yanjun Zhu @ 2022-05-17 15:14 UTC (permalink / raw)
  To: Bob Pearson, jgg, leon, linux-rdma


在 2022/5/17 22:51, Bob Pearson 写道:
> On 5/17/22 14:08, yanjun.zhu@linux.dev wrote:
>> From: Zhu Yanjun <yanjun.zhu@linux.dev>
>>
>> Compact the function and move it to the header file.
> I have two issues with this patch.
>
> There is no advantage of having an inline function in a header file
> that is only called once. The compiler is perfectly capable of (and does)
> inlining a static function in a .c file if only called once. This just
> makes the code harder to read.

When this function is put into the header file, this function can be 
included into the caller function file.

The compiler does not need to call this function in different file. In 
theory, this can increase

the compile speed.

Why do you insist on putting this function in .c file?

Zhu Yanjun

>
> There is a patch in for-rc that gets rid of read.mr in favor of an rkey.
> This patch is out of date.
>
> Bob
>> Signed-off-by: Zhu Yanjun <yanjun.zhu@linux.dev>
>> ---
>>   drivers/infiniband/sw/rxe/rxe_loc.h  | 11 ++++++++++-
>>   drivers/infiniband/sw/rxe/rxe_qp.c   | 15 ++-------------
>>   drivers/infiniband/sw/rxe/rxe_resp.c |  4 ++--
>>   3 files changed, 14 insertions(+), 16 deletions(-)
>>
>> diff --git a/drivers/infiniband/sw/rxe/rxe_loc.h b/drivers/infiniband/sw/rxe/rxe_loc.h
>> index 409efeecd581..6517b4f104b1 100644
>> --- a/drivers/infiniband/sw/rxe/rxe_loc.h
>> +++ b/drivers/infiniband/sw/rxe/rxe_loc.h
>> @@ -145,7 +145,16 @@ static inline int rcv_wqe_size(int max_sge)
>>   		max_sge * sizeof(struct ib_sge);
>>   }
>>   
>> -void free_rd_atomic_resource(struct rxe_qp *qp, struct resp_res *res);
>> +static inline void free_rd_atomic_resource(struct resp_res *res)
>> +{
>> +	if (res->type == RXE_ATOMIC_MASK) {
>> +		kfree_skb(res->atomic.skb);
>> +	} else if (res->type == RXE_READ_MASK) {
>> +		if (res->read.mr)
>> +			rxe_drop_ref(res->read.mr);
>> +	}
>> +	res->type = 0;
>> +}
>>   
>>   static inline void rxe_advance_resp_resource(struct rxe_qp *qp)
>>   {
>> diff --git a/drivers/infiniband/sw/rxe/rxe_qp.c b/drivers/infiniband/sw/rxe/rxe_qp.c
>> index 5f270cbf18c6..b29208852bc4 100644
>> --- a/drivers/infiniband/sw/rxe/rxe_qp.c
>> +++ b/drivers/infiniband/sw/rxe/rxe_qp.c
>> @@ -126,24 +126,13 @@ static void free_rd_atomic_resources(struct rxe_qp *qp)
>>   		for (i = 0; i < qp->attr.max_dest_rd_atomic; i++) {
>>   			struct resp_res *res = &qp->resp.resources[i];
>>   
>> -			free_rd_atomic_resource(qp, res);
>> +			free_rd_atomic_resource(res);
>>   		}
>>   		kfree(qp->resp.resources);
>>   		qp->resp.resources = NULL;
>>   	}
>>   }
>>   
>> -void free_rd_atomic_resource(struct rxe_qp *qp, struct resp_res *res)
>> -{
>> -	if (res->type == RXE_ATOMIC_MASK) {
>> -		kfree_skb(res->atomic.skb);
>> -	} else if (res->type == RXE_READ_MASK) {
>> -		if (res->read.mr)
>> -			rxe_drop_ref(res->read.mr);
>> -	}
>> -	res->type = 0;
>> -}
>> -
>>   static void cleanup_rd_atomic_resources(struct rxe_qp *qp)
>>   {
>>   	int i;
>> @@ -152,7 +141,7 @@ static void cleanup_rd_atomic_resources(struct rxe_qp *qp)
>>   	if (qp->resp.resources) {
>>   		for (i = 0; i < qp->attr.max_dest_rd_atomic; i++) {
>>   			res = &qp->resp.resources[i];
>> -			free_rd_atomic_resource(qp, res);
>> +			free_rd_atomic_resource(res);
>>   		}
>>   	}
>>   }
>> diff --git a/drivers/infiniband/sw/rxe/rxe_resp.c b/drivers/infiniband/sw/rxe/rxe_resp.c
>> index c369d78fc8e8..923a71ff305c 100644
>> --- a/drivers/infiniband/sw/rxe/rxe_resp.c
>> +++ b/drivers/infiniband/sw/rxe/rxe_resp.c
>> @@ -663,7 +663,7 @@ static enum resp_states read_reply(struct rxe_qp *qp,
>>   		 */
>>   		res = &qp->resp.resources[qp->resp.res_head];
>>   
>> -		free_rd_atomic_resource(qp, res);
>> +		free_rd_atomic_resource(res);
>>   		rxe_advance_resp_resource(qp);
>>   
>>   		res->type		= RXE_READ_MASK;
>> @@ -977,7 +977,7 @@ static int send_atomic_ack(struct rxe_qp *qp, struct rxe_pkt_info *pkt,
>>   	}
>>   
>>   	res = &qp->resp.resources[qp->resp.res_head];
>> -	free_rd_atomic_resource(qp, res);
>> +	free_rd_atomic_resource(res);
>>   	rxe_advance_resp_resource(qp);
>>   
>>   	skb_get(skb);

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH 1/1] RDMA/rxe: Compact the function free_rd_atomic_resource
  2022-05-17 15:14   ` Yanjun Zhu
@ 2022-05-17 15:49     ` Bob Pearson
  2022-05-19 14:00       ` Yanjun Zhu
  0 siblings, 1 reply; 6+ messages in thread
From: Bob Pearson @ 2022-05-17 15:49 UTC (permalink / raw)
  To: Yanjun Zhu, jgg, leon, linux-rdma

On 5/17/22 10:14, Yanjun Zhu wrote:
> 
> 在 2022/5/17 22:51, Bob Pearson 写道:
>> On 5/17/22 14:08, yanjun.zhu@linux.dev wrote:
>>> From: Zhu Yanjun <yanjun.zhu@linux.dev>
>>>
>>> Compact the function and move it to the header file.
>> I have two issues with this patch.
>>
>> There is no advantage of having an inline function in a header file
>> that is only called once. The compiler is perfectly capable of (and does)
>> inlining a static function in a .c file if only called once. This just
>> makes the code harder to read.
> 
> When this function is put into the header file, this function can be included into the caller function file.
> 
> The compiler does not need to call this function in different file. In theory, this can increase
> 
> the compile speed.
> 
> Why do you insist on putting this function in .c file?

I don't insist. I just don't like them. Jason is correct the subroutine is in rxe_qp.c
and there are two calls in rxe_resp.c and one in rxe_qp.c. Given there are three calls
I would prefer to not do anything. The responder resources code

	alloc_rd_atomic_resources()
	free_rd_atomic_resources()
	free_rd_atomic_resource()
	cleanup_rd_atomic_resources()

is mostly called by rxe_qp.c so they are in the right place. The 2-3 instructions
you might save by inlining free_rd_atomic_resource() just aren't worth it in the
tens of thousands of instructions in the response to an rdma_read or atomic request.

To Jason's question. 8a1a0be894da and 290c4a902b79 are already in for-rc. There
isn't any res.read.mr left.

Bob

> 
> Zhu Yanjun
> 
>>
>> There is a patch in for-rc that gets rid of read.mr in favor of an rkey.
>> This patch is out of date.
>>
>> Bob
>>> Signed-off-by: Zhu Yanjun <yanjun.zhu@linux.dev>
>>> ---
>>>   drivers/infiniband/sw/rxe/rxe_loc.h  | 11 ++++++++++-
>>>   drivers/infiniband/sw/rxe/rxe_qp.c   | 15 ++-------------
>>>   drivers/infiniband/sw/rxe/rxe_resp.c |  4 ++--
>>>   3 files changed, 14 insertions(+), 16 deletions(-)
>>>
>>> diff --git a/drivers/infiniband/sw/rxe/rxe_loc.h b/drivers/infiniband/sw/rxe/rxe_loc.h
>>> index 409efeecd581..6517b4f104b1 100644
>>> --- a/drivers/infiniband/sw/rxe/rxe_loc.h
>>> +++ b/drivers/infiniband/sw/rxe/rxe_loc.h
>>> @@ -145,7 +145,16 @@ static inline int rcv_wqe_size(int max_sge)
>>>           max_sge * sizeof(struct ib_sge);
>>>   }
>>>   -void free_rd_atomic_resource(struct rxe_qp *qp, struct resp_res *res);
>>> +static inline void free_rd_atomic_resource(struct resp_res *res)
>>> +{
>>> +    if (res->type == RXE_ATOMIC_MASK) {
>>> +        kfree_skb(res->atomic.skb);
>>> +    } else if (res->type == RXE_READ_MASK) {
>>> +        if (res->read.mr)
>>> +            rxe_drop_ref(res->read.mr);
>>> +    }
>>> +    res->type = 0;
>>> +}
>>>     static inline void rxe_advance_resp_resource(struct rxe_qp *qp)
>>>   {
>>> diff --git a/drivers/infiniband/sw/rxe/rxe_qp.c b/drivers/infiniband/sw/rxe/rxe_qp.c
>>> index 5f270cbf18c6..b29208852bc4 100644
>>> --- a/drivers/infiniband/sw/rxe/rxe_qp.c
>>> +++ b/drivers/infiniband/sw/rxe/rxe_qp.c
>>> @@ -126,24 +126,13 @@ static void free_rd_atomic_resources(struct rxe_qp *qp)
>>>           for (i = 0; i < qp->attr.max_dest_rd_atomic; i++) {
>>>               struct resp_res *res = &qp->resp.resources[i];
>>>   -            free_rd_atomic_resource(qp, res);
>>> +            free_rd_atomic_resource(res);
>>>           }
>>>           kfree(qp->resp.resources);
>>>           qp->resp.resources = NULL;
>>>       }
>>>   }
>>>   -void free_rd_atomic_resource(struct rxe_qp *qp, struct resp_res *res)
>>> -{
>>> -    if (res->type == RXE_ATOMIC_MASK) {
>>> -        kfree_skb(res->atomic.skb);
>>> -    } else if (res->type == RXE_READ_MASK) {
>>> -        if (res->read.mr)
>>> -            rxe_drop_ref(res->read.mr);
>>> -    }
>>> -    res->type = 0;
>>> -}
>>> -
>>>   static void cleanup_rd_atomic_resources(struct rxe_qp *qp)
>>>   {
>>>       int i;
>>> @@ -152,7 +141,7 @@ static void cleanup_rd_atomic_resources(struct rxe_qp *qp)
>>>       if (qp->resp.resources) {
>>>           for (i = 0; i < qp->attr.max_dest_rd_atomic; i++) {
>>>               res = &qp->resp.resources[i];
>>> -            free_rd_atomic_resource(qp, res);
>>> +            free_rd_atomic_resource(res);
>>>           }
>>>       }
>>>   }
>>> diff --git a/drivers/infiniband/sw/rxe/rxe_resp.c b/drivers/infiniband/sw/rxe/rxe_resp.c
>>> index c369d78fc8e8..923a71ff305c 100644
>>> --- a/drivers/infiniband/sw/rxe/rxe_resp.c
>>> +++ b/drivers/infiniband/sw/rxe/rxe_resp.c
>>> @@ -663,7 +663,7 @@ static enum resp_states read_reply(struct rxe_qp *qp,
>>>            */
>>>           res = &qp->resp.resources[qp->resp.res_head];
>>>   -        free_rd_atomic_resource(qp, res);
>>> +        free_rd_atomic_resource(res);
>>>           rxe_advance_resp_resource(qp);
>>>             res->type        = RXE_READ_MASK;
>>> @@ -977,7 +977,7 @@ static int send_atomic_ack(struct rxe_qp *qp, struct rxe_pkt_info *pkt,
>>>       }
>>>         res = &qp->resp.resources[qp->resp.res_head];
>>> -    free_rd_atomic_resource(qp, res);
>>> +    free_rd_atomic_resource(res);
>>>       rxe_advance_resp_resource(qp);
>>>         skb_get(skb);


^ permalink raw reply	[flat|nested] 6+ messages in thread

* [PATCH 1/1] RDMA/rxe: Compact the function free_rd_atomic_resource
@ 2022-05-17 19:08 yanjun.zhu
  2022-05-17 14:51 ` Bob Pearson
  0 siblings, 1 reply; 6+ messages in thread
From: yanjun.zhu @ 2022-05-17 19:08 UTC (permalink / raw)
  To: jgg, leon, linux-rdma, yanjun.zhu

From: Zhu Yanjun <yanjun.zhu@linux.dev>

Compact the function and move it to the header file.

Signed-off-by: Zhu Yanjun <yanjun.zhu@linux.dev>
---
 drivers/infiniband/sw/rxe/rxe_loc.h  | 11 ++++++++++-
 drivers/infiniband/sw/rxe/rxe_qp.c   | 15 ++-------------
 drivers/infiniband/sw/rxe/rxe_resp.c |  4 ++--
 3 files changed, 14 insertions(+), 16 deletions(-)

diff --git a/drivers/infiniband/sw/rxe/rxe_loc.h b/drivers/infiniband/sw/rxe/rxe_loc.h
index 409efeecd581..6517b4f104b1 100644
--- a/drivers/infiniband/sw/rxe/rxe_loc.h
+++ b/drivers/infiniband/sw/rxe/rxe_loc.h
@@ -145,7 +145,16 @@ static inline int rcv_wqe_size(int max_sge)
 		max_sge * sizeof(struct ib_sge);
 }
 
-void free_rd_atomic_resource(struct rxe_qp *qp, struct resp_res *res);
+static inline void free_rd_atomic_resource(struct resp_res *res)
+{
+	if (res->type == RXE_ATOMIC_MASK) {
+		kfree_skb(res->atomic.skb);
+	} else if (res->type == RXE_READ_MASK) {
+		if (res->read.mr)
+			rxe_drop_ref(res->read.mr);
+	}
+	res->type = 0;
+}
 
 static inline void rxe_advance_resp_resource(struct rxe_qp *qp)
 {
diff --git a/drivers/infiniband/sw/rxe/rxe_qp.c b/drivers/infiniband/sw/rxe/rxe_qp.c
index 5f270cbf18c6..b29208852bc4 100644
--- a/drivers/infiniband/sw/rxe/rxe_qp.c
+++ b/drivers/infiniband/sw/rxe/rxe_qp.c
@@ -126,24 +126,13 @@ static void free_rd_atomic_resources(struct rxe_qp *qp)
 		for (i = 0; i < qp->attr.max_dest_rd_atomic; i++) {
 			struct resp_res *res = &qp->resp.resources[i];
 
-			free_rd_atomic_resource(qp, res);
+			free_rd_atomic_resource(res);
 		}
 		kfree(qp->resp.resources);
 		qp->resp.resources = NULL;
 	}
 }
 
-void free_rd_atomic_resource(struct rxe_qp *qp, struct resp_res *res)
-{
-	if (res->type == RXE_ATOMIC_MASK) {
-		kfree_skb(res->atomic.skb);
-	} else if (res->type == RXE_READ_MASK) {
-		if (res->read.mr)
-			rxe_drop_ref(res->read.mr);
-	}
-	res->type = 0;
-}
-
 static void cleanup_rd_atomic_resources(struct rxe_qp *qp)
 {
 	int i;
@@ -152,7 +141,7 @@ static void cleanup_rd_atomic_resources(struct rxe_qp *qp)
 	if (qp->resp.resources) {
 		for (i = 0; i < qp->attr.max_dest_rd_atomic; i++) {
 			res = &qp->resp.resources[i];
-			free_rd_atomic_resource(qp, res);
+			free_rd_atomic_resource(res);
 		}
 	}
 }
diff --git a/drivers/infiniband/sw/rxe/rxe_resp.c b/drivers/infiniband/sw/rxe/rxe_resp.c
index c369d78fc8e8..923a71ff305c 100644
--- a/drivers/infiniband/sw/rxe/rxe_resp.c
+++ b/drivers/infiniband/sw/rxe/rxe_resp.c
@@ -663,7 +663,7 @@ static enum resp_states read_reply(struct rxe_qp *qp,
 		 */
 		res = &qp->resp.resources[qp->resp.res_head];
 
-		free_rd_atomic_resource(qp, res);
+		free_rd_atomic_resource(res);
 		rxe_advance_resp_resource(qp);
 
 		res->type		= RXE_READ_MASK;
@@ -977,7 +977,7 @@ static int send_atomic_ack(struct rxe_qp *qp, struct rxe_pkt_info *pkt,
 	}
 
 	res = &qp->resp.resources[qp->resp.res_head];
-	free_rd_atomic_resource(qp, res);
+	free_rd_atomic_resource(res);
 	rxe_advance_resp_resource(qp);
 
 	skb_get(skb);
-- 
2.30.2


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PATCH 1/1] RDMA/rxe: Compact the function free_rd_atomic_resource
  2022-05-17 15:49     ` Bob Pearson
@ 2022-05-19 14:00       ` Yanjun Zhu
  0 siblings, 0 replies; 6+ messages in thread
From: Yanjun Zhu @ 2022-05-19 14:00 UTC (permalink / raw)
  To: Bob Pearson, jgg, leon, linux-rdma


在 2022/5/17 23:49, Bob Pearson 写道:
> On 5/17/22 10:14, Yanjun Zhu wrote:
>> 在 2022/5/17 22:51, Bob Pearson 写道:
>>> On 5/17/22 14:08, yanjun.zhu@linux.dev wrote:
>>>> From: Zhu Yanjun <yanjun.zhu@linux.dev>
>>>>
>>>> Compact the function and move it to the header file.
>>> I have two issues with this patch.
>>>
>>> There is no advantage of having an inline function in a header file
>>> that is only called once. The compiler is perfectly capable of (and does)
>>> inlining a static function in a .c file if only called once. This just
>>> makes the code harder to read.
>> When this function is put into the header file, this function can be included into the caller function file.
>>
>> The compiler does not need to call this function in different file. In theory, this can increase
>>
>> the compile speed.
>>
>> Why do you insist on putting this function in .c file?
> I don't insist. I just don't like them. Jason is correct the subroutine is in rxe_qp.c
> and there are two calls in rxe_resp.c and one in rxe_qp.c. Given there are three calls
> I would prefer to not do anything. The responder resources code
>
> 	alloc_rd_atomic_resources()
> 	free_rd_atomic_resources()
> 	free_rd_atomic_resource()
> 	cleanup_rd_atomic_resources()
>
> is mostly called by rxe_qp.c so they are in the right place. The 2-3 instructions
> you might save by inlining free_rd_atomic_resource() just aren't worth it in the
> tens of thousands of instructions in the response to an rdma_read or atomic request.

The above 4 functions are in rxe_qp.c because these functions will use 
qp as parameter.

Now free_rd_atomic_resource will not use qp as paramter and other files 
also will call this function.

As such it is a good idea to put this function free_rd_atomic_resource 
to the head file.

Zhu Yanjun

>
> To Jason's question. 8a1a0be894da and 290c4a902b79 are already in for-rc. There
> isn't any res.read.mr left.
>
> Bob
>
>> Zhu Yanjun
>>
>>> There is a patch in for-rc that gets rid of read.mr in favor of an rkey.
>>> This patch is out of date.
>>>
>>> Bob
>>>> Signed-off-by: Zhu Yanjun <yanjun.zhu@linux.dev>
>>>> ---
>>>>    drivers/infiniband/sw/rxe/rxe_loc.h  | 11 ++++++++++-
>>>>    drivers/infiniband/sw/rxe/rxe_qp.c   | 15 ++-------------
>>>>    drivers/infiniband/sw/rxe/rxe_resp.c |  4 ++--
>>>>    3 files changed, 14 insertions(+), 16 deletions(-)
>>>>
>>>> diff --git a/drivers/infiniband/sw/rxe/rxe_loc.h b/drivers/infiniband/sw/rxe/rxe_loc.h
>>>> index 409efeecd581..6517b4f104b1 100644
>>>> --- a/drivers/infiniband/sw/rxe/rxe_loc.h
>>>> +++ b/drivers/infiniband/sw/rxe/rxe_loc.h
>>>> @@ -145,7 +145,16 @@ static inline int rcv_wqe_size(int max_sge)
>>>>            max_sge * sizeof(struct ib_sge);
>>>>    }
>>>>    -void free_rd_atomic_resource(struct rxe_qp *qp, struct resp_res *res);
>>>> +static inline void free_rd_atomic_resource(struct resp_res *res)
>>>> +{
>>>> +    if (res->type == RXE_ATOMIC_MASK) {
>>>> +        kfree_skb(res->atomic.skb);
>>>> +    } else if (res->type == RXE_READ_MASK) {
>>>> +        if (res->read.mr)
>>>> +            rxe_drop_ref(res->read.mr);
>>>> +    }
>>>> +    res->type = 0;
>>>> +}
>>>>      static inline void rxe_advance_resp_resource(struct rxe_qp *qp)
>>>>    {
>>>> diff --git a/drivers/infiniband/sw/rxe/rxe_qp.c b/drivers/infiniband/sw/rxe/rxe_qp.c
>>>> index 5f270cbf18c6..b29208852bc4 100644
>>>> --- a/drivers/infiniband/sw/rxe/rxe_qp.c
>>>> +++ b/drivers/infiniband/sw/rxe/rxe_qp.c
>>>> @@ -126,24 +126,13 @@ static void free_rd_atomic_resources(struct rxe_qp *qp)
>>>>            for (i = 0; i < qp->attr.max_dest_rd_atomic; i++) {
>>>>                struct resp_res *res = &qp->resp.resources[i];
>>>>    -            free_rd_atomic_resource(qp, res);
>>>> +            free_rd_atomic_resource(res);
>>>>            }
>>>>            kfree(qp->resp.resources);
>>>>            qp->resp.resources = NULL;
>>>>        }
>>>>    }
>>>>    -void free_rd_atomic_resource(struct rxe_qp *qp, struct resp_res *res)
>>>> -{
>>>> -    if (res->type == RXE_ATOMIC_MASK) {
>>>> -        kfree_skb(res->atomic.skb);
>>>> -    } else if (res->type == RXE_READ_MASK) {
>>>> -        if (res->read.mr)
>>>> -            rxe_drop_ref(res->read.mr);
>>>> -    }
>>>> -    res->type = 0;
>>>> -}
>>>> -
>>>>    static void cleanup_rd_atomic_resources(struct rxe_qp *qp)
>>>>    {
>>>>        int i;
>>>> @@ -152,7 +141,7 @@ static void cleanup_rd_atomic_resources(struct rxe_qp *qp)
>>>>        if (qp->resp.resources) {
>>>>            for (i = 0; i < qp->attr.max_dest_rd_atomic; i++) {
>>>>                res = &qp->resp.resources[i];
>>>> -            free_rd_atomic_resource(qp, res);
>>>> +            free_rd_atomic_resource(res);
>>>>            }
>>>>        }
>>>>    }
>>>> diff --git a/drivers/infiniband/sw/rxe/rxe_resp.c b/drivers/infiniband/sw/rxe/rxe_resp.c
>>>> index c369d78fc8e8..923a71ff305c 100644
>>>> --- a/drivers/infiniband/sw/rxe/rxe_resp.c
>>>> +++ b/drivers/infiniband/sw/rxe/rxe_resp.c
>>>> @@ -663,7 +663,7 @@ static enum resp_states read_reply(struct rxe_qp *qp,
>>>>             */
>>>>            res = &qp->resp.resources[qp->resp.res_head];
>>>>    -        free_rd_atomic_resource(qp, res);
>>>> +        free_rd_atomic_resource(res);
>>>>            rxe_advance_resp_resource(qp);
>>>>              res->type        = RXE_READ_MASK;
>>>> @@ -977,7 +977,7 @@ static int send_atomic_ack(struct rxe_qp *qp, struct rxe_pkt_info *pkt,
>>>>        }
>>>>          res = &qp->resp.resources[qp->resp.res_head];
>>>> -    free_rd_atomic_resource(qp, res);
>>>> +    free_rd_atomic_resource(res);
>>>>        rxe_advance_resp_resource(qp);
>>>>          skb_get(skb);

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2022-05-19 14:02 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-05-17 19:08 [PATCH 1/1] RDMA/rxe: Compact the function free_rd_atomic_resource yanjun.zhu
2022-05-17 14:51 ` Bob Pearson
2022-05-17 14:55   ` Jason Gunthorpe
2022-05-17 15:14   ` Yanjun Zhu
2022-05-17 15:49     ` Bob Pearson
2022-05-19 14:00       ` Yanjun Zhu

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).