diff mbox series

RDMA/siw: Trim size of page array to max size needed

Message ID 20240119130532.57146-1-bmt@zurich.ibm.com (mailing list archive)
State Changes Requested
Headers show
Series RDMA/siw: Trim size of page array to max size needed | expand

Commit Message

Bernard Metzler Jan. 19, 2024, 1:05 p.m. UTC
siw tries sending all parts of an iWarp wire frame in one socket
send operation. If user data can be send without copy, user data
pages for one wire frame are referenced in an fixed size page array.
The size of this array can be made 2 elements smaller, since it
does not reference iWarp header and trailer crc. Trimming
the page array reduces the affected siw_tx_hdt() functions frame
size, staying below 1024 bytes. This avoids the following
compile-time warning:

 drivers/infiniband/sw/siw/siw_qp_tx.c: In function 'siw_tx_hdt':
 drivers/infiniband/sw/siw/siw_qp_tx.c:677:1: warning: the frame
 size of 1040 bytes is larger than 1024 bytes [-Wframe-larger-than=]

Fixes: b9be6f18cf9e ("rdma/siw: transmit path")
Reported-by: ionut_n2001@yahoo.com
Link: https://bugzilla.kernel.org/show_bug.cgi?id=218375
Signed-off-by: Bernard Metzler <bmt@zurich.ibm.com>
---
 drivers/infiniband/sw/siw/siw_qp_tx.c | 29 +++++++++++++++------------
 1 file changed, 16 insertions(+), 13 deletions(-)

Comments

Guoqing Jiang Jan. 23, 2024, 2:43 a.m. UTC | #1
Hi Bernard,

On 1/19/24 21:05, Bernard Metzler wrote:
> siw tries sending all parts of an iWarp wire frame in one socket
> send operation. If user data can be send without copy, user data
> pages for one wire frame are referenced in an fixed size page array.
> The size of this array can be made 2 elements smaller, since it
> does not reference iWarp header and trailer crc. Trimming
> the page array reduces the affected siw_tx_hdt() functions frame
> size, staying below 1024 bytes. This avoids the following
> compile-time warning:
>
>   drivers/infiniband/sw/siw/siw_qp_tx.c: In function 'siw_tx_hdt':
>   drivers/infiniband/sw/siw/siw_qp_tx.c:677:1: warning: the frame
>   size of 1040 bytes is larger than 1024 bytes [-Wframe-larger-than=]

I saw similar warning in my ubuntu 22.04 VM which has below gcc.

root@buk:/home/gjiang/linux-mirror# make M=drivers/infiniband/sw/siw/ 
-j16 W=1
   CC [M]  drivers/infiniband/sw/siw/siw_qp_tx.o
drivers/infiniband/sw/siw/siw_qp_tx.c: In function ‘siw_tx_hdt’:
drivers/infiniband/sw/siw/siw_qp_tx.c:665:1: warning: the frame size of 
1440 bytes is larger than 1024 bytes [-Wframe-larger-than=]
   665 | }
       | ^

# gcc --version
gcc (Ubuntu 12.3.0-1ubuntu1~22.04) 12.3.0

And it still appears after apply this patch on top of 6.8-rc1.

root@buk:/home/gjiang/linux-mirror# git am 
./20240119_bmt_rdma_siw_trim_size_of_page_array_to_max_size_needed.mbx
Applying: RDMA/siw: Trim size of page array to max size needed
root@buk:/home/gjiang/linux-mirror# make M=drivers/infiniband/sw/siw/ 
-j16 W=1
   CC [M]  drivers/infiniband/sw/siw/siw_qp_tx.o
drivers/infiniband/sw/siw/siw_qp_tx.c: In function ‘siw_tx_hdt’:
drivers/infiniband/sw/siw/siw_qp_tx.c:668:1: warning: the frame size of 
1408 bytes is larger than 1024 bytes [-Wframe-larger-than=]
   668 | }
       | ^

However with gcc-13.1, I can't see the warning with or without the patch.

Thanks,
Guoqing
Bernard Metzler Jan. 24, 2024, 7:59 p.m. UTC | #2
> -----Original Message-----
> From: Guoqing Jiang <guoqing.jiang@linux.dev>
> Sent: Tuesday, January 23, 2024 3:43 AM
> To: Bernard Metzler <BMT@zurich.ibm.com>; linux-rdma@vger.kernel.org
> Cc: jgg@ziepe.ca; leon@kernel.org; ionut_n2001@yahoo.com
> Subject: [EXTERNAL] Re: [PATCH] RDMA/siw: Trim size of page array to max
> size needed
> 
> Hi Bernard,
> 
> On 1/19/24 21:05, Bernard Metzler wrote:
> > siw tries sending all parts of an iWarp wire frame in one socket
> > send operation. If user data can be send without copy, user data
> > pages for one wire frame are referenced in an fixed size page array.
> > The size of this array can be made 2 elements smaller, since it
> > does not reference iWarp header and trailer crc. Trimming
> > the page array reduces the affected siw_tx_hdt() functions frame
> > size, staying below 1024 bytes. This avoids the following
> > compile-time warning:
> >
> >   drivers/infiniband/sw/siw/siw_qp_tx.c: In function 'siw_tx_hdt':
> >   drivers/infiniband/sw/siw/siw_qp_tx.c:677:1: warning: the frame
> >   size of 1040 bytes is larger than 1024 bytes [-Wframe-larger-than=]
> 
> I saw similar warning in my ubuntu 22.04 VM which has below gcc.
> 
> root@buk:/home/gjiang/linux-mirror# make M=drivers/infiniband/sw/siw/
> -j16 W=1
>    CC [M]  drivers/infiniband/sw/siw/siw_qp_tx.o
> drivers/infiniband/sw/siw/siw_qp_tx.c: In function ‘siw_tx_hdt’:
> drivers/infiniband/sw/siw/siw_qp_tx.c:665:1: warning: the frame size of
> 1440 bytes is larger than 1024 bytes [-Wframe-larger-than=]
>    665 | }
>        | ^
> 

Whew.. that is quite substantially off the target!
How come different compilers making so much of a difference.
Guoqing, can you check if the macro computing the maximum number
of fragments is broken, i.e., computes different values in
the cases you refer?

Thanks a lot!
Bernard
> # gcc --version
> gcc (Ubuntu 12.3.0-1ubuntu1~22.04) 12.3.0
> 
> And it still appears after apply this patch on top of 6.8-rc1.
> 
> root@buk:/home/gjiang/linux-mirror# git am
> ./20240119_bmt_rdma_siw_trim_size_of_page_array_to_max_size_needed.mbx
> Applying: RDMA/siw: Trim size of page array to max size needed
> root@buk:/home/gjiang/linux-mirror# make M=drivers/infiniband/sw/siw/
> -j16 W=1
>    CC [M]  drivers/infiniband/sw/siw/siw_qp_tx.o
> drivers/infiniband/sw/siw/siw_qp_tx.c: In function ‘siw_tx_hdt’:
> drivers/infiniband/sw/siw/siw_qp_tx.c:668:1: warning: the frame size of
> 1408 bytes is larger than 1024 bytes [-Wframe-larger-than=]
>    668 | }
>        | ^
> 
> However with gcc-13.1, I can't see the warning with or without the
> patch.
> 
> Thanks,
> Guoqing
Guoqing Jiang Jan. 25, 2024, 9:15 a.m. UTC | #3
Hi Bernard,

On 1/25/24 03:59, Bernard Metzler wrote:
>> -----Original Message-----
>> From: Guoqing Jiang <guoqing.jiang@linux.dev>
>> Sent: Tuesday, January 23, 2024 3:43 AM
>> To: Bernard Metzler <BMT@zurich.ibm.com>; linux-rdma@vger.kernel.org
>> Cc: jgg@ziepe.ca; leon@kernel.org; ionut_n2001@yahoo.com
>> Subject: [EXTERNAL] Re: [PATCH] RDMA/siw: Trim size of page array to max
>> size needed
>>
>> Hi Bernard,
>>
>> On 1/19/24 21:05, Bernard Metzler wrote:
>>> siw tries sending all parts of an iWarp wire frame in one socket
>>> send operation. If user data can be send without copy, user data
>>> pages for one wire frame are referenced in an fixed size page array.
>>> The size of this array can be made 2 elements smaller, since it
>>> does not reference iWarp header and trailer crc. Trimming
>>> the page array reduces the affected siw_tx_hdt() functions frame
>>> size, staying below 1024 bytes. This avoids the following
>>> compile-time warning:
>>>
>>>    drivers/infiniband/sw/siw/siw_qp_tx.c: In function 'siw_tx_hdt':
>>>    drivers/infiniband/sw/siw/siw_qp_tx.c:677:1: warning: the frame
>>>    size of 1040 bytes is larger than 1024 bytes [-Wframe-larger-than=]
>> I saw similar warning in my ubuntu 22.04 VM which has below gcc.
>>
>> root@buk:/home/gjiang/linux-mirror# make M=drivers/infiniband/sw/siw/
>> -j16 W=1
>>     CC [M]  drivers/infiniband/sw/siw/siw_qp_tx.o
>> drivers/infiniband/sw/siw/siw_qp_tx.c: In function ‘siw_tx_hdt’:
>> drivers/infiniband/sw/siw/siw_qp_tx.c:665:1: warning: the frame size of
>> 1440 bytes is larger than 1024 bytes [-Wframe-larger-than=]
>>     665 | }
>>         | ^
>>
> Whew.. that is quite substantially off the target!
> How come different compilers making so much of a difference.
> Guoqing, can you check if the macro computing the maximum number
> of fragments is broken, i.e., computes different values in
> the cases you refer?

Sorry, I was wrong 
Bernard Metzler Jan. 25, 2024, 5:27 p.m. UTC | #4
> -----Original Message-----
> From: Guoqing Jiang <guoqing.jiang@linux.dev>
> Sent: Thursday, January 25, 2024 1:15 AM
> To: Bernard Metzler <BMT@zurich.ibm.com>; linux-rdma@vger.kernel.org
> Cc: jgg@ziepe.ca; leon@kernel.org; ionut_n2001@yahoo.com
> Subject: [EXTERNAL] Re: [PATCH] RDMA/siw: Trim size of page array to max
> size needed
> 
> Hi Bernard,
> 
> On 1/25/24 03:59, Bernard Metzler wrote:
> >> -----Original Message-----
> >> From: Guoqing Jiang <guoqing.jiang@linux.dev>
> >> Sent: Tuesday, January 23, 2024 3:43 AM
> >> To: Bernard Metzler <BMT@zurich.ibm.com>; linux-rdma@vger.kernel.org
> >> Cc: jgg@ziepe.ca; leon@kernel.org; ionut_n2001@yahoo.com
> >> Subject: [EXTERNAL] Re: [PATCH] RDMA/siw: Trim size of page array to
> max
> >> size needed
> >>
> >> Hi Bernard,
> >>
> >> On 1/19/24 21:05, Bernard Metzler wrote:
> >>> siw tries sending all parts of an iWarp wire frame in one socket
> >>> send operation. If user data can be send without copy, user data
> >>> pages for one wire frame are referenced in an fixed size page array.
> >>> The size of this array can be made 2 elements smaller, since it
> >>> does not reference iWarp header and trailer crc. Trimming
> >>> the page array reduces the affected siw_tx_hdt() functions frame
> >>> size, staying below 1024 bytes. This avoids the following
> >>> compile-time warning:
> >>>
> >>>    drivers/infiniband/sw/siw/siw_qp_tx.c: In function 'siw_tx_hdt':
> >>>    drivers/infiniband/sw/siw/siw_qp_tx.c:677:1: warning: the frame
> >>>    size of 1040 bytes is larger than 1024 bytes [-Wframe-larger-
> than=]
> >> I saw similar warning in my ubuntu 22.04 VM which has below gcc.
> >>
> >> root@buk:/home/gjiang/linux-mirror# make M=drivers/infiniband/sw/siw/
> >> -j16 W=1
> >>     CC [M]  drivers/infiniband/sw/siw/siw_qp_tx.o
> >> drivers/infiniband/sw/siw/siw_qp_tx.c: In function ‘siw_tx_hdt’:
> >> drivers/infiniband/sw/siw/siw_qp_tx.c:665:1: warning: the frame size
> of
> >> 1440 bytes is larger than 1024 bytes [-Wframe-larger-than=]
> >>     665 | }
> >>         | ^
> >>
> > Whew.. that is quite substantially off the target!
> > How come different compilers making so much of a difference.
> > Guoqing, can you check if the macro computing the maximum number
> > of fragments is broken, i.e., computes different values in
> > the cases you refer?
> 
> Sorry, I was wrong 
Guoqing Jiang Jan. 26, 2024, 1:51 a.m. UTC | #5
On 1/26/24 01:27, Bernard Metzler wrote:
>
>> -----Original Message-----
>> From: Guoqing Jiang <guoqing.jiang@linux.dev>
>> Sent: Thursday, January 25, 2024 1:15 AM
>> To: Bernard Metzler <BMT@zurich.ibm.com>; linux-rdma@vger.kernel.org
>> Cc: jgg@ziepe.ca; leon@kernel.org; ionut_n2001@yahoo.com
>> Subject: [EXTERNAL] Re: [PATCH] RDMA/siw: Trim size of page array to max
>> size needed
>>
>> Hi Bernard,
>>
>> On 1/25/24 03:59, Bernard Metzler wrote:
>>>> -----Original Message-----
>>>> From: Guoqing Jiang <guoqing.jiang@linux.dev>
>>>> Sent: Tuesday, January 23, 2024 3:43 AM
>>>> To: Bernard Metzler <BMT@zurich.ibm.com>; linux-rdma@vger.kernel.org
>>>> Cc: jgg@ziepe.ca; leon@kernel.org; ionut_n2001@yahoo.com
>>>> Subject: [EXTERNAL] Re: [PATCH] RDMA/siw: Trim size of page array to
>> max
>>>> size needed
>>>>
>>>> Hi Bernard,
>>>>
>>>> On 1/19/24 21:05, Bernard Metzler wrote:
>>>>> siw tries sending all parts of an iWarp wire frame in one socket
>>>>> send operation. If user data can be send without copy, user data
>>>>> pages for one wire frame are referenced in an fixed size page array.
>>>>> The size of this array can be made 2 elements smaller, since it
>>>>> does not reference iWarp header and trailer crc. Trimming
>>>>> the page array reduces the affected siw_tx_hdt() functions frame
>>>>> size, staying below 1024 bytes. This avoids the following
>>>>> compile-time warning:
>>>>>
>>>>>     drivers/infiniband/sw/siw/siw_qp_tx.c: In function 'siw_tx_hdt':
>>>>>     drivers/infiniband/sw/siw/siw_qp_tx.c:677:1: warning: the frame
>>>>>     size of 1040 bytes is larger than 1024 bytes [-Wframe-larger-
>> than=]
>>>> I saw similar warning in my ubuntu 22.04 VM which has below gcc.
>>>>
>>>> root@buk:/home/gjiang/linux-mirror# make M=drivers/infiniband/sw/siw/
>>>> -j16 W=1
>>>>      CC [M]  drivers/infiniband/sw/siw/siw_qp_tx.o
>>>> drivers/infiniband/sw/siw/siw_qp_tx.c: In function ‘siw_tx_hdt’:
>>>> drivers/infiniband/sw/siw/siw_qp_tx.c:665:1: warning: the frame size
>> of
>>>> 1440 bytes is larger than 1024 bytes [-Wframe-larger-than=]
>>>>      665 | }
>>>>          | ^
>>>>
>>> Whew.. that is quite substantially off the target!
>>> How come different compilers making so much of a difference.
>>> Guoqing, can you check if the macro computing the maximum number
>>> of fragments is broken, i.e., computes different values in
>>> the cases you refer?
>> Sorry, I was wrong 
Leon Romanovsky Jan. 26, 2024, 11:05 a.m. UTC | #6
On Thu, Jan 25, 2024 at 05:27:52PM +0000, Bernard Metzler wrote:
> 
> 
> > -----Original Message-----
> > From: Guoqing Jiang <guoqing.jiang@linux.dev>
> > Sent: Thursday, January 25, 2024 1:15 AM
> > To: Bernard Metzler <BMT@zurich.ibm.com>; linux-rdma@vger.kernel.org
> > Cc: jgg@ziepe.ca; leon@kernel.org; ionut_n2001@yahoo.com
> > Subject: [EXTERNAL] Re: [PATCH] RDMA/siw: Trim size of page array to max
> > size needed
> > 
> > Hi Bernard,
> > 
> > On 1/25/24 03:59, Bernard Metzler wrote:
> > >> -----Original Message-----
> > >> From: Guoqing Jiang <guoqing.jiang@linux.dev>
> > >> Sent: Tuesday, January 23, 2024 3:43 AM
> > >> To: Bernard Metzler <BMT@zurich.ibm.com>; linux-rdma@vger.kernel.org
> > >> Cc: jgg@ziepe.ca; leon@kernel.org; ionut_n2001@yahoo.com
> > >> Subject: [EXTERNAL] Re: [PATCH] RDMA/siw: Trim size of page array to
> > max
> > >> size needed
> > >>
> > >> Hi Bernard,
> > >>
> > >> On 1/19/24 21:05, Bernard Metzler wrote:
> > >>> siw tries sending all parts of an iWarp wire frame in one socket
> > >>> send operation. If user data can be send without copy, user data
> > >>> pages for one wire frame are referenced in an fixed size page array.
> > >>> The size of this array can be made 2 elements smaller, since it
> > >>> does not reference iWarp header and trailer crc. Trimming
> > >>> the page array reduces the affected siw_tx_hdt() functions frame
> > >>> size, staying below 1024 bytes. This avoids the following
> > >>> compile-time warning:
> > >>>
> > >>>    drivers/infiniband/sw/siw/siw_qp_tx.c: In function 'siw_tx_hdt':
> > >>>    drivers/infiniband/sw/siw/siw_qp_tx.c:677:1: warning: the frame
> > >>>    size of 1040 bytes is larger than 1024 bytes [-Wframe-larger-
> > than=]
> > >> I saw similar warning in my ubuntu 22.04 VM which has below gcc.
> > >>
> > >> root@buk:/home/gjiang/linux-mirror# make M=drivers/infiniband/sw/siw/
> > >> -j16 W=1
> > >>     CC [M]  drivers/infiniband/sw/siw/siw_qp_tx.o
> > >> drivers/infiniband/sw/siw/siw_qp_tx.c: In function ‘siw_tx_hdt’:
> > >> drivers/infiniband/sw/siw/siw_qp_tx.c:665:1: warning: the frame size
> > of
> > >> 1440 bytes is larger than 1024 bytes [-Wframe-larger-than=]
> > >>     665 | }
> > >>         | ^
> > >>
> > > Whew.. that is quite substantially off the target!
> > > How come different compilers making so much of a difference.
> > > Guoqing, can you check if the macro computing the maximum number
> > > of fragments is broken, i.e., computes different values in
> > > the cases you refer?
> > 
> > Sorry, I was wrong 
Bernard Metzler Feb. 8, 2024, 11:32 a.m. UTC | #7
> -----Original Message-----
> From: Leon Romanovsky <leon@kernel.org>
> Sent: Friday, January 26, 2024 12:06 PM
> To: Bernard Metzler <BMT@zurich.ibm.com>
> Cc: Guoqing Jiang <guoqing.jiang@linux.dev>; linux-rdma@vger.kernel.org;
> jgg@ziepe.ca; ionut_n2001@yahoo.com
> Subject: [EXTERNAL] Re: Re: [PATCH] RDMA/siw: Trim size of page array to
> max size needed
> 
> On Thu, Jan 25, 2024 at 05:27:52PM +0000, Bernard Metzler wrote:
> >
> >
> > > -----Original Message-----
> > > From: Guoqing Jiang <guoqing.jiang@linux.dev>
> > > Sent: Thursday, January 25, 2024 1:15 AM
> > > To: Bernard Metzler <BMT@zurich.ibm.com>; linux-rdma@vger.kernel.org
> > > Cc: jgg@ziepe.ca; leon@kernel.org; ionut_n2001@yahoo.com
> > > Subject: [EXTERNAL] Re: [PATCH] RDMA/siw: Trim size of page array to
> max
> > > size needed
> > >
> > > Hi Bernard,
> > >
> > > On 1/25/24 03:59, Bernard Metzler wrote:
> > > >> -----Original Message-----
> > > >> From: Guoqing Jiang <guoqing.jiang@linux.dev>
> > > >> Sent: Tuesday, January 23, 2024 3:43 AM
> > > >> To: Bernard Metzler <BMT@zurich.ibm.com>; linux-rdma@vger.kernel.org
> > > >> Cc: jgg@ziepe.ca; leon@kernel.org; ionut_n2001@yahoo.com
> > > >> Subject: [EXTERNAL] Re: [PATCH] RDMA/siw: Trim size of page array to
> > > max
> > > >> size needed
> > > >>
> > > >> Hi Bernard,
> > > >>
> > > >> On 1/19/24 21:05, Bernard Metzler wrote:
> > > >>> siw tries sending all parts of an iWarp wire frame in one socket
> > > >>> send operation. If user data can be send without copy, user data
> > > >>> pages for one wire frame are referenced in an fixed size page
> array.
> > > >>> The size of this array can be made 2 elements smaller, since it
> > > >>> does not reference iWarp header and trailer crc. Trimming
> > > >>> the page array reduces the affected siw_tx_hdt() functions frame
> > > >>> size, staying below 1024 bytes. This avoids the following
> > > >>> compile-time warning:
> > > >>>
> > > >>>    drivers/infiniband/sw/siw/siw_qp_tx.c: In function 'siw_tx_hdt':
> > > >>>    drivers/infiniband/sw/siw/siw_qp_tx.c:677:1: warning: the frame
> > > >>>    size of 1040 bytes is larger than 1024 bytes [-Wframe-larger-
> > > than=]
> > > >> I saw similar warning in my ubuntu 22.04 VM which has below gcc.
> > > >>
> > > >> root@buk:/home/gjiang/linux-mirror# make
> M=drivers/infiniband/sw/siw/
> > > >> -j16 W=1
> > > >>     CC [M]  drivers/infiniband/sw/siw/siw_qp_tx.o
> > > >> drivers/infiniband/sw/siw/siw_qp_tx.c: In function ‘siw_tx_hdt’:
> > > >> drivers/infiniband/sw/siw/siw_qp_tx.c:665:1: warning: the frame size
> > > of
> > > >> 1440 bytes is larger than 1024 bytes [-Wframe-larger-than=]
> > > >>     665 | }
> > > >>         | ^
> > > >>
> > > > Whew.. that is quite substantially off the target!
> > > > How come different compilers making so much of a difference.
> > > > Guoqing, can you check if the macro computing the maximum number
> > > > of fragments is broken, i.e., computes different values in
> > > > the cases you refer?
> > >
> > > Sorry, I was wrong 
Leon Romanovsky Feb. 8, 2024, 12:03 p.m. UTC | #8
On Thu, Feb 08, 2024 at 11:32:37AM +0000, Bernard Metzler wrote:
> 
> 
> > -----Original Message-----
> > From: Leon Romanovsky <leon@kernel.org>
> > Sent: Friday, January 26, 2024 12:06 PM
> > To: Bernard Metzler <BMT@zurich.ibm.com>
> > Cc: Guoqing Jiang <guoqing.jiang@linux.dev>; linux-rdma@vger.kernel.org;
> > jgg@ziepe.ca; ionut_n2001@yahoo.com
> > Subject: [EXTERNAL] Re: Re: [PATCH] RDMA/siw: Trim size of page array to
> > max size needed
> > 
> > On Thu, Jan 25, 2024 at 05:27:52PM +0000, Bernard Metzler wrote:
> > >
> > >
> > > > -----Original Message-----
> > > > From: Guoqing Jiang <guoqing.jiang@linux.dev>
> > > > Sent: Thursday, January 25, 2024 1:15 AM
> > > > To: Bernard Metzler <BMT@zurich.ibm.com>; linux-rdma@vger.kernel.org
> > > > Cc: jgg@ziepe.ca; leon@kernel.org; ionut_n2001@yahoo.com
> > > > Subject: [EXTERNAL] Re: [PATCH] RDMA/siw: Trim size of page array to
> > max
> > > > size needed
> > > >
> > > > Hi Bernard,
> > > >
> > > > On 1/25/24 03:59, Bernard Metzler wrote:
> > > > >> -----Original Message-----
> > > > >> From: Guoqing Jiang <guoqing.jiang@linux.dev>
> > > > >> Sent: Tuesday, January 23, 2024 3:43 AM
> > > > >> To: Bernard Metzler <BMT@zurich.ibm.com>; linux-rdma@vger.kernel.org
> > > > >> Cc: jgg@ziepe.ca; leon@kernel.org; ionut_n2001@yahoo.com
> > > > >> Subject: [EXTERNAL] Re: [PATCH] RDMA/siw: Trim size of page array to
> > > > max
> > > > >> size needed
> > > > >>
> > > > >> Hi Bernard,
> > > > >>
> > > > >> On 1/19/24 21:05, Bernard Metzler wrote:
> > > > >>> siw tries sending all parts of an iWarp wire frame in one socket
> > > > >>> send operation. If user data can be send without copy, user data
> > > > >>> pages for one wire frame are referenced in an fixed size page
> > array.
> > > > >>> The size of this array can be made 2 elements smaller, since it
> > > > >>> does not reference iWarp header and trailer crc. Trimming
> > > > >>> the page array reduces the affected siw_tx_hdt() functions frame
> > > > >>> size, staying below 1024 bytes. This avoids the following
> > > > >>> compile-time warning:
> > > > >>>
> > > > >>>    drivers/infiniband/sw/siw/siw_qp_tx.c: In function 'siw_tx_hdt':
> > > > >>>    drivers/infiniband/sw/siw/siw_qp_tx.c:677:1: warning: the frame
> > > > >>>    size of 1040 bytes is larger than 1024 bytes [-Wframe-larger-
> > > > than=]
> > > > >> I saw similar warning in my ubuntu 22.04 VM which has below gcc.
> > > > >>
> > > > >> root@buk:/home/gjiang/linux-mirror# make
> > M=drivers/infiniband/sw/siw/
> > > > >> -j16 W=1
> > > > >>     CC [M]  drivers/infiniband/sw/siw/siw_qp_tx.o
> > > > >> drivers/infiniband/sw/siw/siw_qp_tx.c: In function ‘siw_tx_hdt’:
> > > > >> drivers/infiniband/sw/siw/siw_qp_tx.c:665:1: warning: the frame size
> > > > of
> > > > >> 1440 bytes is larger than 1024 bytes [-Wframe-larger-than=]
> > > > >>     665 | }
> > > > >>         | ^
> > > > >>
> > > > > Whew.. that is quite substantially off the target!
> > > > > How come different compilers making so much of a difference.
> > > > > Guoqing, can you check if the macro computing the maximum number
> > > > > of fragments is broken, i.e., computes different values in
> > > > > the cases you refer?
> > > >
> > > > Sorry, I was wrong 
diff mbox series

Patch

diff --git a/drivers/infiniband/sw/siw/siw_qp_tx.c b/drivers/infiniband/sw/siw/siw_qp_tx.c
index 64ad9e0895bd..7ffc91bac606 100644
--- a/drivers/infiniband/sw/siw/siw_qp_tx.c
+++ b/drivers/infiniband/sw/siw/siw_qp_tx.c
@@ -432,7 +432,7 @@  static int siw_tx_hdt(struct siw_iwarp_tx *c_tx, struct socket *s)
 	struct siw_wqe *wqe = &c_tx->wqe_active;
 	struct siw_sge *sge = &wqe->sqe.sge[c_tx->sge_idx];
 	struct kvec iov[MAX_ARRAY];
-	struct page *page_array[MAX_ARRAY];
+	struct page *page_array[MAX_ARRAY-2];
 	struct msghdr msg = { .msg_flags = MSG_DONTWAIT | MSG_EOR };
 
 	int seg = 0, do_crc = c_tx->do_crc, is_kva = 0, rv;
@@ -491,7 +491,6 @@  static int siw_tx_hdt(struct siw_iwarp_tx *c_tx, struct socket *s)
 
 		while (sge_len) {
 			size_t plen = min((int)PAGE_SIZE - fp_off, sge_len);
-			void *kaddr;
 
 			if (!is_kva) {
 				struct page *p;
@@ -503,14 +502,12 @@  static int siw_tx_hdt(struct siw_iwarp_tx *c_tx, struct socket *s)
 					rv = -EFAULT;
 					goto done_crc;
 				}
-				page_array[seg] = p;
-
 				if (!c_tx->use_sendpage) {
-					void *kaddr = kmap_local_page(p);
+					void *pa = kmap_local_page(p);
 
 					/* Remember for later kunmap() */
 					kmap_mask |= BIT(seg);
-					iov[seg].iov_base = kaddr + fp_off;
+					iov[seg].iov_base = pa + fp_off;
 					iov[seg].iov_len = plen;
 
 					if (do_crc)
@@ -518,12 +515,17 @@  static int siw_tx_hdt(struct siw_iwarp_tx *c_tx, struct socket *s)
 							c_tx->mpa_crc_hd,
 							iov[seg].iov_base,
 							plen);
-				} else if (do_crc) {
-					kaddr = kmap_local_page(p);
-					crypto_shash_update(c_tx->mpa_crc_hd,
-							    kaddr + fp_off,
-							    plen);
-					kunmap_local(kaddr);
+				} else {
+					page_array[seg] = p;
+					if (do_crc) {
+						void *pa = kmap_local_page(p);
+
+						crypto_shash_update(
+							c_tx->mpa_crc_hd,
+							pa + fp_off,
+							plen);
+						kunmap_local(pa);
+					}
 				}
 			} else {
 				/*
@@ -545,7 +547,8 @@  static int siw_tx_hdt(struct siw_iwarp_tx *c_tx, struct socket *s)
 			data_len -= plen;
 			fp_off = 0;
 
-			if (++seg >= (int)MAX_ARRAY) {
+			if (++seg >= (int)MAX_ARRAY ||
+			    (c_tx->use_sendpage && seg >= (int)MAX_ARRAY-2)) {
 				siw_dbg_qp(tx_qp(c_tx), "to many fragments\n");
 				siw_unmap_pages(iov, kmap_mask, seg-1);
 				wqe->processed -= c_tx->bytes_unsent;