diff mbox series

wifi: carl9170: micro-optimize carl9170_tx_shift_bm()

Message ID 20250326155200.39895-1-yury.norov@gmail.com
State New
Headers show
Series wifi: carl9170: micro-optimize carl9170_tx_shift_bm() | expand

Commit Message

Yury Norov March 26, 2025, 3:51 p.m. UTC
The function calls bitmap_empty() just before find_first_bit(). Both
functions are O(N). Because find_first_bit() returns >= nbits in case of
empty bitmap, the bitmap_empty() test may be avoided.

Signed-off-by: Yury Norov <yury.norov@gmail.com>
---
 drivers/net/wireless/ath/carl9170/tx.c | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

Comments

Yury Norov April 27, 2025, 3:25 p.m. UTC | #1
On Wed, Mar 26, 2025 at 09:00:33PM +0100, Christian Lamparter wrote:
> Hi,
> 
> On Wed, Mar 26, 2025 at 4:52 PM Yury Norov <yury.norov@gmail.com> wrote:
> >
> > The function calls bitmap_empty() just before find_first_bit(). Both
> > functions are O(N). Because find_first_bit() returns >= nbits in case of
> > empty bitmap, the bitmap_empty() test may be avoided.
> >
> 
> I looked up bitmap_empty():
> <https://web.git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/include/linux/bitmap.h#n423>
> 
> apart from the small_const_nbits stuff (which carl9170 likely does not qualify
> for since from what I remember it's a 128bits bitmap) the function just does:
> 
> |   return find_first_bit(src, nbits) == nbits;
> 
> so yes, find_first_bit runs twice with same parameters... Unless the
> compiler is smart
> enough to detect this and (re-)use the intermediate result later. But
> I haven't check
> if this is the case with any current, old or future compilers. Has anyone?
> 
> Anyway, Sure.
> 
> > Signed-off-by: Yury Norov <yury.norov@gmail.com>
> 
> Acked-by: Christian Lamparter <chunkeey@gmail.com>

Thanks, Chrustian. So, how is that supposed to be merged?
I can move it with bitmap-for-next, unless there's no better
branch.

Thanks,
Yury
Jeff Johnson May 20, 2025, 4:24 p.m. UTC | #2
On 4/27/2025 8:25 AM, Yury Norov wrote:
> On Wed, Mar 26, 2025 at 09:00:33PM +0100, Christian Lamparter wrote:
>> Hi,
>>
>> On Wed, Mar 26, 2025 at 4:52 PM Yury Norov <yury.norov@gmail.com> wrote:
>>>
>>> The function calls bitmap_empty() just before find_first_bit(). Both
>>> functions are O(N). Because find_first_bit() returns >= nbits in case of
>>> empty bitmap, the bitmap_empty() test may be avoided.
>>>
>>
>> I looked up bitmap_empty():
>> <https://web.git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/include/linux/bitmap.h#n423>
>>
>> apart from the small_const_nbits stuff (which carl9170 likely does not qualify
>> for since from what I remember it's a 128bits bitmap) the function just does:
>>
>> |   return find_first_bit(src, nbits) == nbits;
>>
>> so yes, find_first_bit runs twice with same parameters... Unless the
>> compiler is smart
>> enough to detect this and (re-)use the intermediate result later. But
>> I haven't check
>> if this is the case with any current, old or future compilers. Has anyone?
>>
>> Anyway, Sure.
>>
>>> Signed-off-by: Yury Norov <yury.norov@gmail.com>
>>
>> Acked-by: Christian Lamparter <chunkeey@gmail.com>
> 
> Thanks, Chrustian. So, how is that supposed to be merged?
> I can move it with bitmap-for-next, unless there's no better
> branch.
> 
> Thanks,
> Yury
> 

Yury, did you take this?
If not, I'll take it through the ath tree.
Yury Norov May 20, 2025, 4:32 p.m. UTC | #3
On Tue, May 20, 2025 at 09:24:14AM -0700, Jeff Johnson wrote:
> On 4/27/2025 8:25 AM, Yury Norov wrote:
> > On Wed, Mar 26, 2025 at 09:00:33PM +0100, Christian Lamparter wrote:
> >> Hi,
> >>
> >> On Wed, Mar 26, 2025 at 4:52 PM Yury Norov <yury.norov@gmail.com> wrote:
> >>>
> >>> The function calls bitmap_empty() just before find_first_bit(). Both
> >>> functions are O(N). Because find_first_bit() returns >= nbits in case of
> >>> empty bitmap, the bitmap_empty() test may be avoided.
> >>>
> >>
> >> I looked up bitmap_empty():
> >> <https://web.git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/include/linux/bitmap.h#n423>
> >>
> >> apart from the small_const_nbits stuff (which carl9170 likely does not qualify
> >> for since from what I remember it's a 128bits bitmap) the function just does:
> >>
> >> |   return find_first_bit(src, nbits) == nbits;
> >>
> >> so yes, find_first_bit runs twice with same parameters... Unless the
> >> compiler is smart
> >> enough to detect this and (re-)use the intermediate result later. But
> >> I haven't check
> >> if this is the case with any current, old or future compilers. Has anyone?
> >>
> >> Anyway, Sure.
> >>
> >>> Signed-off-by: Yury Norov <yury.norov@gmail.com>
> >>
> >> Acked-by: Christian Lamparter <chunkeey@gmail.com>
> > 
> > Thanks, Chrustian. So, how is that supposed to be merged?
> > I can move it with bitmap-for-next, unless there's no better
> > branch.
> > 
> > Thanks,
> > Yury
> > 
> 
> Yury, did you take this?
> If not, I'll take it through the ath tree.

No. Please take with ath.
diff mbox series

Patch

diff --git a/drivers/net/wireless/ath/carl9170/tx.c b/drivers/net/wireless/ath/carl9170/tx.c
index 0226c31a6cae..b7717f9e1e9b 100644
--- a/drivers/net/wireless/ath/carl9170/tx.c
+++ b/drivers/net/wireless/ath/carl9170/tx.c
@@ -366,8 +366,7 @@  static void carl9170_tx_shift_bm(struct ar9170 *ar,
 	if (WARN_ON_ONCE(off >= CARL9170_BAW_BITS))
 		return;
 
-	if (!bitmap_empty(tid_info->bitmap, off))
-		off = find_first_bit(tid_info->bitmap, off);
+	off = min(off, find_first_bit(tid_info->bitmap, off));
 
 	tid_info->bsn += off;
 	tid_info->bsn &= 0x0fff;