* [PATCH v4] staging: rtl8723bs: Use % 4096u instead of & 0xfff @ 2025-04-07 6:30 Abraham Samuel Adekunle 2025-04-07 6:36 ` Greg KH 2025-04-07 7:20 ` Dan Carpenter 0 siblings, 2 replies; 11+ messages in thread From: Abraham Samuel Adekunle @ 2025-04-07 6:30 UTC (permalink / raw) To: gregkh, julia.lawall, outreachy Cc: linux-staging, linux-kernel, dan.carpenter, andy, david.laight.linux The sequence number is constrained to a range of [0, 4095], which is a total of 4096 values. The bitmask operation using `0xfff` is used to perform this wrap-around. While this is functionally correct, it obscures the intended semantic of a 4096-based wrap. Using a modulo operation with `4096u` makes the wrap-around logic explicit and easier to understand. It clearly signals that the sequence number cycles though a range of 4096 values. It also makes the code robust against potential changes of the 4096 upper limit, especially when it becomes a non power of 2 value while the AND(&) works solely for power of 2 values. The use of `4096u` also guarantees that the modulo operation is performed with unsigned arithmetic, preventing potential issues with signed types. Suggested-by: Andy Shevchenko <andy@kernel.org> Signed-off-by: Abraham Samuel Adekunle <abrahamadekunle50@gmail.com> --- Changes in v3: - Added more description to the commit message - Removed blank line in tag block. - Added more patch recipients. Changes in v2: - Changed the commit message to a more descriptive message which makes it clear why the patch does the change. - Changed the subject title to include `4096u` to show that an unsigned module is used. Changes in v1: - Added more patch recipients. drivers/staging/rtl8723bs/core/rtw_xmit.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/drivers/staging/rtl8723bs/core/rtw_xmit.c b/drivers/staging/rtl8723bs/core/rtw_xmit.c index 297c93d65315..f534bf2448c3 100644 --- a/drivers/staging/rtl8723bs/core/rtw_xmit.c +++ b/drivers/staging/rtl8723bs/core/rtw_xmit.c @@ -943,7 +943,7 @@ s32 rtw_make_wlanhdr(struct adapter *padapter, u8 *hdr, struct pkt_attrib *pattr if (psta) { psta->sta_xmitpriv.txseq_tid[pattrib->priority]++; - psta->sta_xmitpriv.txseq_tid[pattrib->priority] &= 0xFFF; + psta->sta_xmitpriv.txseq_tid[pattrib->priority] &= 4096u; pattrib->seqnum = psta->sta_xmitpriv.txseq_tid[pattrib->priority]; SetSeqNum(hdr, pattrib->seqnum); @@ -963,11 +963,11 @@ s32 rtw_make_wlanhdr(struct adapter *padapter, u8 *hdr, struct pkt_attrib *pattr if (SN_LESS(pattrib->seqnum, tx_seq)) { pattrib->ampdu_en = false;/* AGG BK */ } else if (SN_EQUAL(pattrib->seqnum, tx_seq)) { - psta->BA_starting_seqctrl[pattrib->priority & 0x0f] = (tx_seq+1)&0xfff; + psta->BA_starting_seqctrl[pattrib->priority & 0x0f] = (tx_seq+1)&4096u; pattrib->ampdu_en = true;/* AGG EN */ } else { - psta->BA_starting_seqctrl[pattrib->priority & 0x0f] = (pattrib->seqnum+1)&0xfff; + psta->BA_starting_seqctrl[pattrib->priority & 0x0f] = (pattrib->seqnum+1)&4096u; pattrib->ampdu_en = true;/* AGG EN */ } } -- 2.34.1 ^ permalink raw reply related [flat|nested] 11+ messages in thread
* Re: [PATCH v4] staging: rtl8723bs: Use % 4096u instead of & 0xfff 2025-04-07 6:30 [PATCH v4] staging: rtl8723bs: Use % 4096u instead of & 0xfff Abraham Samuel Adekunle @ 2025-04-07 6:36 ` Greg KH 2025-04-07 6:53 ` Greg KH 2025-04-07 7:20 ` Dan Carpenter 1 sibling, 1 reply; 11+ messages in thread From: Greg KH @ 2025-04-07 6:36 UTC (permalink / raw) To: Abraham Samuel Adekunle Cc: julia.lawall, outreachy, linux-staging, linux-kernel, dan.carpenter, andy, david.laight.linux On Mon, Apr 07, 2025 at 06:30:50AM +0000, Abraham Samuel Adekunle wrote: > The sequence number is constrained to a range of [0, 4095], which > is a total of 4096 values. The bitmask operation using `0xfff` is > used to perform this wrap-around. While this is functionally correct, > it obscures the intended semantic of a 4096-based wrap. > > Using a modulo operation with `4096u` makes the wrap-around logic <snip> > - psta->sta_xmitpriv.txseq_tid[pattrib->priority] &= 0xFFF; > + psta->sta_xmitpriv.txseq_tid[pattrib->priority] &= 4096u; I do not see a modulo operation here, only another & operation. > pattrib->seqnum = psta->sta_xmitpriv.txseq_tid[pattrib->priority]; > > SetSeqNum(hdr, pattrib->seqnum); > @@ -963,11 +963,11 @@ s32 rtw_make_wlanhdr(struct adapter *padapter, u8 *hdr, struct pkt_attrib *pattr > if (SN_LESS(pattrib->seqnum, tx_seq)) { > pattrib->ampdu_en = false;/* AGG BK */ > } else if (SN_EQUAL(pattrib->seqnum, tx_seq)) { > - psta->BA_starting_seqctrl[pattrib->priority & 0x0f] = (tx_seq+1)&0xfff; > + psta->BA_starting_seqctrl[pattrib->priority & 0x0f] = (tx_seq+1)&4096u; This also looks odd, nothing is being "AND" here, it's an address value being set (and an odd one at that, but that's another issue...) How was any of this tested? Slow down, take some time, and think about what you are wanting to do here. There's no rush. thanks, greg k-h ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH v4] staging: rtl8723bs: Use % 4096u instead of & 0xfff 2025-04-07 6:36 ` Greg KH @ 2025-04-07 6:53 ` Greg KH 2025-04-07 7:51 ` Samuel Abraham 2025-04-07 12:21 ` David Laight 0 siblings, 2 replies; 11+ messages in thread From: Greg KH @ 2025-04-07 6:53 UTC (permalink / raw) To: Abraham Samuel Adekunle Cc: julia.lawall, outreachy, linux-staging, linux-kernel, dan.carpenter, andy, david.laight.linux On Mon, Apr 07, 2025 at 08:36:35AM +0200, Greg KH wrote: > On Mon, Apr 07, 2025 at 06:30:50AM +0000, Abraham Samuel Adekunle wrote: > > The sequence number is constrained to a range of [0, 4095], which > > is a total of 4096 values. The bitmask operation using `0xfff` is > > used to perform this wrap-around. While this is functionally correct, > > it obscures the intended semantic of a 4096-based wrap. > > > > Using a modulo operation with `4096u` makes the wrap-around logic > > <snip> > > > - psta->sta_xmitpriv.txseq_tid[pattrib->priority] &= 0xFFF; > > + psta->sta_xmitpriv.txseq_tid[pattrib->priority] &= 4096u; > > I do not see a modulo operation here, only another & operation. > > > pattrib->seqnum = psta->sta_xmitpriv.txseq_tid[pattrib->priority]; > > > > SetSeqNum(hdr, pattrib->seqnum); > > @@ -963,11 +963,11 @@ s32 rtw_make_wlanhdr(struct adapter *padapter, u8 *hdr, struct pkt_attrib *pattr > > if (SN_LESS(pattrib->seqnum, tx_seq)) { > > pattrib->ampdu_en = false;/* AGG BK */ > > } else if (SN_EQUAL(pattrib->seqnum, tx_seq)) { > > - psta->BA_starting_seqctrl[pattrib->priority & 0x0f] = (tx_seq+1)&0xfff; > > + psta->BA_starting_seqctrl[pattrib->priority & 0x0f] = (tx_seq+1)&4096u; > > This also looks odd, nothing is being "AND" here, it's an address value > being set (and an odd one at that, but that's another issue...) Sorry, no, I was wrong, it is being & here, but not %. My fault, the lack of spaces here threw me. thanks, greg k-h ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH v4] staging: rtl8723bs: Use % 4096u instead of & 0xfff 2025-04-07 6:53 ` Greg KH @ 2025-04-07 7:51 ` Samuel Abraham 2025-04-07 12:21 ` David Laight 1 sibling, 0 replies; 11+ messages in thread From: Samuel Abraham @ 2025-04-07 7:51 UTC (permalink / raw) To: Greg KH Cc: julia.lawall, outreachy, linux-staging, linux-kernel, dan.carpenter, andy, david.laight.linux On Mon, Apr 7, 2025 at 7:55 AM Greg KH <gregkh@linuxfoundation.org> wrote: > > On Mon, Apr 07, 2025 at 08:36:35AM +0200, Greg KH wrote: > > On Mon, Apr 07, 2025 at 06:30:50AM +0000, Abraham Samuel Adekunle wrote: > > > The sequence number is constrained to a range of [0, 4095], which > > > is a total of 4096 values. The bitmask operation using `0xfff` is > > > used to perform this wrap-around. While this is functionally correct, > > > it obscures the intended semantic of a 4096-based wrap. > > > > > > Using a modulo operation with `4096u` makes the wrap-around logic > > > > <snip> > > > > > - psta->sta_xmitpriv.txseq_tid[pattrib->priority] &= 0xFFF; > > > + psta->sta_xmitpriv.txseq_tid[pattrib->priority] &= 4096u; > > > > I do not see a modulo operation here, only another & operation. I'm sorry ... > > > > > pattrib->seqnum = psta->sta_xmitpriv.txseq_tid[pattrib->priority]; > > > > > > SetSeqNum(hdr, pattrib->seqnum); > > > @@ -963,11 +963,11 @@ s32 rtw_make_wlanhdr(struct adapter *padapter, u8 *hdr, struct pkt_attrib *pattr > > > if (SN_LESS(pattrib->seqnum, tx_seq)) { > > > pattrib->ampdu_en = false;/* AGG BK */ > > > } else if (SN_EQUAL(pattrib->seqnum, tx_seq)) { > > > - psta->BA_starting_seqctrl[pattrib->priority & 0x0f] = (tx_seq+1)&0xfff; > > > + psta->BA_starting_seqctrl[pattrib->priority & 0x0f] = (tx_seq+1)&4096u; > > > > This also looks odd, nothing is being "AND" here, it's an address value > > being set (and an odd one at that, but that's another issue...) > > Sorry, no, I was wrong, it is being & here, but not %. My fault, > the lack of spaces here threw me. I want to add spaces for readability. But since the changes occurs on the same line, I am a bit confused about the best approach to take Do I create a patchset, a patch for adding spaces, and a second for changing from & to %? Also, should be second patch be based on the file after the first change I made, or it should be based on the original staging tree file. Thanks Adekunle. ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH v4] staging: rtl8723bs: Use % 4096u instead of & 0xfff 2025-04-07 6:53 ` Greg KH 2025-04-07 7:51 ` Samuel Abraham @ 2025-04-07 12:21 ` David Laight 2025-04-07 12:28 ` Andy Shevchenko 2025-04-07 13:35 ` Samuel Abraham 1 sibling, 2 replies; 11+ messages in thread From: David Laight @ 2025-04-07 12:21 UTC (permalink / raw) To: Greg KH Cc: Abraham Samuel Adekunle, julia.lawall, outreachy, linux-staging, linux-kernel, dan.carpenter, andy On Mon, 7 Apr 2025 08:53:30 +0200 Greg KH <gregkh@linuxfoundation.org> wrote: > On Mon, Apr 07, 2025 at 08:36:35AM +0200, Greg KH wrote: > > On Mon, Apr 07, 2025 at 06:30:50AM +0000, Abraham Samuel Adekunle wrote: > > > The sequence number is constrained to a range of [0, 4095], which > > > is a total of 4096 values. The bitmask operation using `0xfff` is > > > used to perform this wrap-around. While this is functionally correct, > > > it obscures the intended semantic of a 4096-based wrap. > > > > > > Using a modulo operation with `4096u` makes the wrap-around logic > > > > <snip> > > > > > - psta->sta_xmitpriv.txseq_tid[pattrib->priority] &= 0xFFF; > > > + psta->sta_xmitpriv.txseq_tid[pattrib->priority] &= 4096u; > > > > I do not see a modulo operation here, only another & operation. > > > > > pattrib->seqnum = psta->sta_xmitpriv.txseq_tid[pattrib->priority]; > > > > > > SetSeqNum(hdr, pattrib->seqnum); > > > @@ -963,11 +963,11 @@ s32 rtw_make_wlanhdr(struct adapter *padapter, u8 *hdr, struct pkt_attrib *pattr > > > if (SN_LESS(pattrib->seqnum, tx_seq)) { > > > pattrib->ampdu_en = false;/* AGG BK */ > > > } else if (SN_EQUAL(pattrib->seqnum, tx_seq)) { > > > - psta->BA_starting_seqctrl[pattrib->priority & 0x0f] = (tx_seq+1)&0xfff; > > > + psta->BA_starting_seqctrl[pattrib->priority & 0x0f] = (tx_seq+1)&4096u; > > > > This also looks odd, nothing is being "AND" here, it's an address value > > being set (and an odd one at that, but that's another issue...) > > Sorry, no, I was wrong, it is being & here, but not %. My fault, > the lack of spaces here threw me. It is still wrong '& 0xfff' => '% 4096u'. But it is all rather pointless especially if you can't test it. Plausibly more useful would be to find ALL of the uses of 0xfff/4096 (I suspect there is an array lurking somewhere) and change them to use the same constant. But you need to be able to test the changes - or at least discover that they make absolutely no difference to the generated object code. David > > thanks, > > greg k-h ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH v4] staging: rtl8723bs: Use % 4096u instead of & 0xfff 2025-04-07 12:21 ` David Laight @ 2025-04-07 12:28 ` Andy Shevchenko 2025-04-07 18:06 ` David Laight 2025-04-07 13:35 ` Samuel Abraham 1 sibling, 1 reply; 11+ messages in thread From: Andy Shevchenko @ 2025-04-07 12:28 UTC (permalink / raw) To: David Laight Cc: Greg KH, Abraham Samuel Adekunle, julia.lawall, outreachy, linux-staging, linux-kernel, dan.carpenter On Mon, Apr 07, 2025 at 01:21:15PM +0100, David Laight wrote: > On Mon, 7 Apr 2025 08:53:30 +0200 > Greg KH <gregkh@linuxfoundation.org> wrote: > > On Mon, Apr 07, 2025 at 08:36:35AM +0200, Greg KH wrote: > > > On Mon, Apr 07, 2025 at 06:30:50AM +0000, Abraham Samuel Adekunle wrote: <snip> > > > > - psta->sta_xmitpriv.txseq_tid[pattrib->priority] &= 0xFFF; > > > > + psta->sta_xmitpriv.txseq_tid[pattrib->priority] &= 4096u; > > > > > > I do not see a modulo operation here, only another & operation. > > > > > > > pattrib->seqnum = psta->sta_xmitpriv.txseq_tid[pattrib->priority]; > > > > > > > > SetSeqNum(hdr, pattrib->seqnum); > > > > @@ -963,11 +963,11 @@ s32 rtw_make_wlanhdr(struct adapter *padapter, u8 *hdr, struct pkt_attrib *pattr > > > > if (SN_LESS(pattrib->seqnum, tx_seq)) { > > > > pattrib->ampdu_en = false;/* AGG BK */ > > > > } else if (SN_EQUAL(pattrib->seqnum, tx_seq)) { > > > > - psta->BA_starting_seqctrl[pattrib->priority & 0x0f] = (tx_seq+1)&0xfff; > > > > + psta->BA_starting_seqctrl[pattrib->priority & 0x0f] = (tx_seq+1)&4096u; > > > > > > This also looks odd, nothing is being "AND" here, it's an address value > > > being set (and an odd one at that, but that's another issue...) > > > > Sorry, no, I was wrong, it is being & here, but not %. My fault, > > the lack of spaces here threw me. > > It is still wrong '& 0xfff' => '% 4096u'. Why? > But it is all rather pointless especially if you can't test it. > Plausibly more useful would be to find ALL of the uses of 0xfff/4096 (I suspect > there is an array lurking somewhere) and change them to use the same constant. > But you need to be able to test the changes - or at least discover that > they make absolutely no difference to the generated object code. The problem with &, it's not non-power-of-2 tolerable solution. Also using hexadecimal there is not so helpful as when we are talking about sequences (or indices in the circular buffer), the decimal makes more sense. -- With Best Regards, Andy Shevchenko ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH v4] staging: rtl8723bs: Use % 4096u instead of & 0xfff 2025-04-07 12:28 ` Andy Shevchenko @ 2025-04-07 18:06 ` David Laight 2025-04-07 18:13 ` Andy Shevchenko 0 siblings, 1 reply; 11+ messages in thread From: David Laight @ 2025-04-07 18:06 UTC (permalink / raw) To: Andy Shevchenko Cc: Greg KH, Abraham Samuel Adekunle, julia.lawall, outreachy, linux-staging, linux-kernel, dan.carpenter On Mon, 7 Apr 2025 15:28:34 +0300 Andy Shevchenko <andy@kernel.org> wrote: > On Mon, Apr 07, 2025 at 01:21:15PM +0100, David Laight wrote: > > On Mon, 7 Apr 2025 08:53:30 +0200 > > Greg KH <gregkh@linuxfoundation.org> wrote: > > > On Mon, Apr 07, 2025 at 08:36:35AM +0200, Greg KH wrote: > > > > On Mon, Apr 07, 2025 at 06:30:50AM +0000, Abraham Samuel Adekunle wrote: > > <snip> > > > > > > - psta->sta_xmitpriv.txseq_tid[pattrib->priority] &= 0xFFF; > > > > > + psta->sta_xmitpriv.txseq_tid[pattrib->priority] &= 4096u; > > > > > > > > I do not see a modulo operation here, only another & operation. > > > > > > > > > pattrib->seqnum = psta->sta_xmitpriv.txseq_tid[pattrib->priority]; > > > > > > > > > > SetSeqNum(hdr, pattrib->seqnum); > > > > > @@ -963,11 +963,11 @@ s32 rtw_make_wlanhdr(struct adapter *padapter, u8 *hdr, struct pkt_attrib *pattr > > > > > if (SN_LESS(pattrib->seqnum, tx_seq)) { > > > > > pattrib->ampdu_en = false;/* AGG BK */ > > > > > } else if (SN_EQUAL(pattrib->seqnum, tx_seq)) { > > > > > - psta->BA_starting_seqctrl[pattrib->priority & 0x0f] = (tx_seq+1)&0xfff; > > > > > + psta->BA_starting_seqctrl[pattrib->priority & 0x0f] = (tx_seq+1)&4096u; > > > > > > > > This also looks odd, nothing is being "AND" here, it's an address value > > > > being set (and an odd one at that, but that's another issue...) > > > > > > Sorry, no, I was wrong, it is being & here, but not %. My fault, > > > the lack of spaces here threw me. > > > > It is still wrong '& 0xfff' => '% 4096u'. > > Why? Do some math :-) > > But it is all rather pointless especially if you can't test it. > > > Plausibly more useful would be to find ALL of the uses of 0xfff/4096 (I suspect > > there is an array lurking somewhere) and change them to use the same constant. > > But you need to be able to test the changes - or at least discover that > > they make absolutely no difference to the generated object code. > > The problem with &, it's not non-power-of-2 tolerable solution. Also using > hexadecimal there is not so helpful as when we are talking about sequences > (or indices in the circular buffer), the decimal makes more sense. > Except that you either want your circular buffer size to be a power of 2 or reduce with a conditional (eg: if (++x == SIZE) x = 0;) not a divide. David ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH v4] staging: rtl8723bs: Use % 4096u instead of & 0xfff 2025-04-07 18:06 ` David Laight @ 2025-04-07 18:13 ` Andy Shevchenko 0 siblings, 0 replies; 11+ messages in thread From: Andy Shevchenko @ 2025-04-07 18:13 UTC (permalink / raw) To: David Laight Cc: Greg KH, Abraham Samuel Adekunle, julia.lawall, outreachy, linux-staging, linux-kernel, dan.carpenter On Mon, Apr 07, 2025 at 07:06:45PM +0100, David Laight wrote: > On Mon, 7 Apr 2025 15:28:34 +0300 > Andy Shevchenko <andy@kernel.org> wrote: > > On Mon, Apr 07, 2025 at 01:21:15PM +0100, David Laight wrote: > > > On Mon, 7 Apr 2025 08:53:30 +0200 > > > Greg KH <gregkh@linuxfoundation.org> wrote: > > > > On Mon, Apr 07, 2025 at 08:36:35AM +0200, Greg KH wrote: > > > > > On Mon, Apr 07, 2025 at 06:30:50AM +0000, Abraham Samuel Adekunle wrote: <snip> > > > > > > - psta->sta_xmitpriv.txseq_tid[pattrib->priority] &= 0xFFF; > > > > > > + psta->sta_xmitpriv.txseq_tid[pattrib->priority] &= 4096u; > > > > > > > > > > I do not see a modulo operation here, only another & operation. > > > > > > > > > > > pattrib->seqnum = psta->sta_xmitpriv.txseq_tid[pattrib->priority]; > > > > > > > > > > > > SetSeqNum(hdr, pattrib->seqnum); > > > > > > @@ -963,11 +963,11 @@ s32 rtw_make_wlanhdr(struct adapter *padapter, u8 *hdr, struct pkt_attrib *pattr > > > > > > if (SN_LESS(pattrib->seqnum, tx_seq)) { > > > > > > pattrib->ampdu_en = false;/* AGG BK */ > > > > > > } else if (SN_EQUAL(pattrib->seqnum, tx_seq)) { > > > > > > - psta->BA_starting_seqctrl[pattrib->priority & 0x0f] = (tx_seq+1)&0xfff; > > > > > > + psta->BA_starting_seqctrl[pattrib->priority & 0x0f] = (tx_seq+1)&4096u; > > > > > > > > > > This also looks odd, nothing is being "AND" here, it's an address value > > > > > being set (and an odd one at that, but that's another issue...) > > > > > > > > Sorry, no, I was wrong, it is being & here, but not %. My fault, > > > > the lack of spaces here threw me. > > > > > > It is still wrong '& 0xfff' => '% 4096u'. > > > > Why? > > Do some math :-) Can you be more specific, please? > > > But it is all rather pointless especially if you can't test it. > > > > > Plausibly more useful would be to find ALL of the uses of 0xfff/4096 (I suspect > > > there is an array lurking somewhere) and change them to use the same constant. > > > But you need to be able to test the changes - or at least discover that > > > they make absolutely no difference to the generated object code. > > > > The problem with &, it's not non-power-of-2 tolerable solution. Also using > > hexadecimal there is not so helpful as when we are talking about sequences > > (or indices in the circular buffer), the decimal makes more sense. > > Except that you either want your circular buffer size to be a power of 2 > or reduce with a conditional (eg: if (++x == SIZE) x = 0;) not a divide. Where do you see a divide in the generated code? And if even so, it means that compiler optimiser thinks that it's not worse than the bit operations. -- With Best Regards, Andy Shevchenko ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH v4] staging: rtl8723bs: Use % 4096u instead of & 0xfff 2025-04-07 12:21 ` David Laight 2025-04-07 12:28 ` Andy Shevchenko @ 2025-04-07 13:35 ` Samuel Abraham 1 sibling, 0 replies; 11+ messages in thread From: Samuel Abraham @ 2025-04-07 13:35 UTC (permalink / raw) To: David Laight Cc: Greg KH, julia.lawall, outreachy, linux-staging, linux-kernel, dan.carpenter, andy On Mon, Apr 7, 2025 at 1:21 PM David Laight <david.laight.linux@gmail.com> wrote: > > On Mon, 7 Apr 2025 08:53:30 +0200 > Greg KH <gregkh@linuxfoundation.org> wrote: > > > On Mon, Apr 07, 2025 at 08:36:35AM +0200, Greg KH wrote: > > > On Mon, Apr 07, 2025 at 06:30:50AM +0000, Abraham Samuel Adekunle wrote: > > > > The sequence number is constrained to a range of [0, 4095], which > > > > is a total of 4096 values. The bitmask operation using `0xfff` is > > > > used to perform this wrap-around. While this is functionally correct, > > > > it obscures the intended semantic of a 4096-based wrap. > > > > > > > > Using a modulo operation with `4096u` makes the wrap-around logic > > > > > > <snip> > > > > > > > - psta->sta_xmitpriv.txseq_tid[pattrib->priority] &= 0xFFF; > > > > + psta->sta_xmitpriv.txseq_tid[pattrib->priority] &= 4096u; > > > > > > I do not see a modulo operation here, only another & operation. > > > > > > > pattrib->seqnum = psta->sta_xmitpriv.txseq_tid[pattrib->priority]; > > > > > > > > SetSeqNum(hdr, pattrib->seqnum); > > > > @@ -963,11 +963,11 @@ s32 rtw_make_wlanhdr(struct adapter *padapter, u8 *hdr, struct pkt_attrib *pattr > > > > if (SN_LESS(pattrib->seqnum, tx_seq)) { > > > > pattrib->ampdu_en = false;/* AGG BK */ > > > > } else if (SN_EQUAL(pattrib->seqnum, tx_seq)) { > > > > - psta->BA_starting_seqctrl[pattrib->priority & 0x0f] = (tx_seq+1)&0xfff; > > > > + psta->BA_starting_seqctrl[pattrib->priority & 0x0f] = (tx_seq+1)&4096u; > > > > > > This also looks odd, nothing is being "AND" here, it's an address value > > > being set (and an odd one at that, but that's another issue...) > > > > Sorry, no, I was wrong, it is being & here, but not %. My fault, > > the lack of spaces here threw me. > > It is still wrong '& 0xfff' => '% 4096u'. > But it is all rather pointless especially if you can't test it. > > Plausibly more useful would be to find ALL of the uses of 0xfff/4096 (I suspect > there is an array lurking somewhere) and change them to use the same constant. > But you need to be able to test the changes - or at least discover that > they make absolutely no difference to the generated object code. Yes, thank you for this, David. I will compare the generated object files for both cases and compare them to make sure there is no difference. Then, to check for other cases in the codebase, a semantic patch will be useful, so I will write one to search for such cases and change them to use the constant. Thank you very much Adekunle ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH v4] staging: rtl8723bs: Use % 4096u instead of & 0xfff 2025-04-07 6:30 [PATCH v4] staging: rtl8723bs: Use % 4096u instead of & 0xfff Abraham Samuel Adekunle 2025-04-07 6:36 ` Greg KH @ 2025-04-07 7:20 ` Dan Carpenter 2025-04-07 8:07 ` Samuel Abraham 1 sibling, 1 reply; 11+ messages in thread From: Dan Carpenter @ 2025-04-07 7:20 UTC (permalink / raw) To: Abraham Samuel Adekunle Cc: gregkh, julia.lawall, outreachy, linux-staging, linux-kernel, andy, david.laight.linux On Mon, Apr 07, 2025 at 06:30:50AM +0000, Abraham Samuel Adekunle wrote: > The sequence number is constrained to a range of [0, 4095], which > is a total of 4096 values. The bitmask operation using `0xfff` is > used to perform this wrap-around. While this is functionally correct, > it obscures the intended semantic of a 4096-based wrap. > > Using a modulo operation with `4096u` makes the wrap-around logic > explicit and easier to understand. It clearly signals that the sequence > number cycles though a range of 4096 values. > It also makes the code robust against potential changes of the 4096 > upper limit, especially when it becomes a non power of 2 value while > the AND(&) works solely for power of 2 values. > > The use of `4096u` also guarantees that the modulo operation is performed > with unsigned arithmetic, preventing potential issues with signed types. > > Suggested-by: Andy Shevchenko <andy@kernel.org> > Signed-off-by: Abraham Samuel Adekunle <abrahamadekunle50@gmail.com> > --- > Changes in v3: > - Added more description to the commit message > - Removed blank line in tag block. > - Added more patch recipients. > Changes in v2: > - Changed the commit message to a more descriptive message which > makes it clear why the patch does the change. > - Changed the subject title to include `4096u` to show that an unsigned > module is used. > Changes in v1: > - Added more patch recipients. > > drivers/staging/rtl8723bs/core/rtw_xmit.c | 6 +++--- > 1 file changed, 3 insertions(+), 3 deletions(-) > > diff --git a/drivers/staging/rtl8723bs/core/rtw_xmit.c b/drivers/staging/rtl8723bs/core/rtw_xmit.c > index 297c93d65315..f534bf2448c3 100644 > --- a/drivers/staging/rtl8723bs/core/rtw_xmit.c > +++ b/drivers/staging/rtl8723bs/core/rtw_xmit.c > @@ -943,7 +943,7 @@ s32 rtw_make_wlanhdr(struct adapter *padapter, u8 *hdr, struct pkt_attrib *pattr > > if (psta) { > psta->sta_xmitpriv.txseq_tid[pattrib->priority]++; > - psta->sta_xmitpriv.txseq_tid[pattrib->priority] &= 0xFFF; > + psta->sta_xmitpriv.txseq_tid[pattrib->priority] &= 4096u; You forgot to change the & to %. regards, dan carpenter ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH v4] staging: rtl8723bs: Use % 4096u instead of & 0xfff 2025-04-07 7:20 ` Dan Carpenter @ 2025-04-07 8:07 ` Samuel Abraham 0 siblings, 0 replies; 11+ messages in thread From: Samuel Abraham @ 2025-04-07 8:07 UTC (permalink / raw) To: Dan Carpenter Cc: gregkh, julia.lawall, outreachy, linux-staging, linux-kernel, andy, david.laight.linux On Mon, Apr 7, 2025 at 8:20 AM Dan Carpenter <dan.carpenter@linaro.org> wrote: > > On Mon, Apr 07, 2025 at 06:30:50AM +0000, Abraham Samuel Adekunle wrote: > > The sequence number is constrained to a range of [0, 4095], which > > is a total of 4096 values. The bitmask operation using `0xfff` is > > used to perform this wrap-around. While this is functionally correct, > > it obscures the intended semantic of a 4096-based wrap. > > > > Using a modulo operation with `4096u` makes the wrap-around logic > > explicit and easier to understand. It clearly signals that the sequence > > number cycles though a range of 4096 values. > > It also makes the code robust against potential changes of the 4096 > > upper limit, especially when it becomes a non power of 2 value while > > the AND(&) works solely for power of 2 values. > > > > The use of `4096u` also guarantees that the modulo operation is performed > > with unsigned arithmetic, preventing potential issues with signed types. > > > > Suggested-by: Andy Shevchenko <andy@kernel.org> > > Signed-off-by: Abraham Samuel Adekunle <abrahamadekunle50@gmail.com> > > --- > > Changes in v3: > > - Added more description to the commit message > > - Removed blank line in tag block. > > - Added more patch recipients. > > Changes in v2: > > - Changed the commit message to a more descriptive message which > > makes it clear why the patch does the change. > > - Changed the subject title to include `4096u` to show that an unsigned > > module is used. > > Changes in v1: > > - Added more patch recipients. > > > > drivers/staging/rtl8723bs/core/rtw_xmit.c | 6 +++--- > > 1 file changed, 3 insertions(+), 3 deletions(-) > > > > diff --git a/drivers/staging/rtl8723bs/core/rtw_xmit.c b/drivers/staging/rtl8723bs/core/rtw_xmit.c > > index 297c93d65315..f534bf2448c3 100644 > > --- a/drivers/staging/rtl8723bs/core/rtw_xmit.c > > +++ b/drivers/staging/rtl8723bs/core/rtw_xmit.c > > @@ -943,7 +943,7 @@ s32 rtw_make_wlanhdr(struct adapter *padapter, u8 *hdr, struct pkt_attrib *pattr > > > > if (psta) { > > psta->sta_xmitpriv.txseq_tid[pattrib->priority]++; > > - psta->sta_xmitpriv.txseq_tid[pattrib->priority] &= 0xFFF; > > + psta->sta_xmitpriv.txseq_tid[pattrib->priority] &= 4096u; > > You forgot to change the & to %. Thank you very much, Dan. I will correct and resend the patch. Adekunle ^ permalink raw reply [flat|nested] 11+ messages in thread
end of thread, other threads:[~2025-04-07 18:13 UTC | newest] Thread overview: 11+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2025-04-07 6:30 [PATCH v4] staging: rtl8723bs: Use % 4096u instead of & 0xfff Abraham Samuel Adekunle 2025-04-07 6:36 ` Greg KH 2025-04-07 6:53 ` Greg KH 2025-04-07 7:51 ` Samuel Abraham 2025-04-07 12:21 ` David Laight 2025-04-07 12:28 ` Andy Shevchenko 2025-04-07 18:06 ` David Laight 2025-04-07 18:13 ` Andy Shevchenko 2025-04-07 13:35 ` Samuel Abraham 2025-04-07 7:20 ` Dan Carpenter 2025-04-07 8:07 ` Samuel Abraham
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox