Generic Linux architectural discussions
 help / color / mirror / Atom feed
From: Yury Norov <ynorov@nvidia.com>
To: Tzu-Ching Yang <shingekinocore@gmail.com>
Cc: Guo Ren <guoren@kernel.org>,
	linux-csky@vger.kernel.org, Yury Norov <yury.norov@gmail.com>,
	Rasmus Villemoes <linux@rasmusvillemoes.dk>,
	Arnd Bergmann <arnd@arndb.de>,
	linux-arch@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH] csky: bitops: Use the compiler builtin for __fls()
Date: Wed, 28 Oct 2026 11:12:45 -0400	[thread overview]
Message-ID: <auIQ2RI89C374je2@yury> (raw)
In-Reply-To: <20261027062319.1700461-1-shingekinocore@gmail.com>

On Tue, Oct 27, 2026 at 02:23:19PM +0800, Tzu-Ching Yang wrote:
> On Fri, Oct 23, 2026 at 11:45:35AM -0400, Yury Norov wrote:
> > While waiting happy, can you print the bloat-o-meter results, and a
> > couple listings of the code generation, including compile- and runtime
> > cases.
> 
> scripts/bloat-o-meter -t on csky defconfig (CK807) vmlinux, GCC 16.2:
> 
> add/remove: 0/0 grow/shrink: 0/3 up/down: 0/-196 (-196)
> Function                                     old     new   delta
> fib6_add                                    1634    1630      -4
> build_sched_domains                         3948    3916     -32
> skb_try_coalesce                            1766    1606    -160
> Total: Before=4621444, After=4621248, chg -0.00%
> 
> The same with GCC 12.5:
> 
> add/remove: 0/0 grow/shrink: 7/6 up/down: 94/-330 (-236)
> Function                                     old     new   delta
> __netdev_alloc_skb                           304     338     +34
> skb_ts_finish                                 34      54     +20
> skb_copy_bits                                608     628     +20
> skb_release_data                             354     362      +8
> kfree_skb_list_reason                        280     286      +6
> fib6_add                                    1632    1636      +4
> ipv6_get_saddr_eval                          424     426      +2
> _find_last_bit                                86      84      -2
> build_sched_domains                         4292    4280     -12
> skb_store_bits                               622     606     -16
> skb_abort_seq_read                            54      34     -20
> __build_skb                                  116      72     -44
> skb_try_coalesce                            1560    1324    -236
> Total: Before=4333762, After=4333526, chg -0.01%

I wonder why the older GCC works better... Can you make sure its the
same kernel version and the config? 

Anyways the numbers show that the switch to the generic implementation
is worth to try. I've added the numbers to the commit message and
pushed in bitmap-for-next for testing.

Conditionally on the (so far, missing) csky engineers feedback.

Thanks,
Yury
 
> In both builds only skb_try_coalesce and build_sched_domains change
> in instruction count (GCC 16: 524 -> 466 and 1240 -> 1228; GCC 12:
> 476 -> 413 and 1333 -> 1327). The other lines are not new code. Most
> are literal-pool words (the constants that lrw loads) and their
> 2-byte alignment that moved into or out of a function's range:
> __build_skb has 24 instructions and 11 pool words before, 24 and 0
> after. fib6_add, ipv6_get_saddr_eval and _find_last_bit each call
> __fls() once at run time; they keep their instruction count, and one
> instruction changes between its 16- and 32-bit encoding (fib6_add
> also gains 2 bytes of pool alignment).
> 
> Over the 35 defconfig-based builds (CK807, CK810, CK860, some with
> KUnit or SMP, GCC 9 to 16) the bloat-o-meter total is between -118
> and -318 bytes in every one. The 128 to 320 bytes in the changelog
> are the .text change, which also counts the padding between
> functions.
> 
> Listings: a standalone file with the old and the new helpers from
> arch/csky/include/asm/bitops.h, built by GCC 16.2 with the kernel's
> flags, -O2 and -mcpu=ck807, plus -fno-ipa-icf so that GCC keeps the
> old and the new copies apart; objdump -d with the addresses dropped.
> The constant listing is the same with GCC 9 to 16.
> 
> Run-time argument: 4 instructions before and after with GCC 9 to 16;
> with GCC 11 to 16 both are this sequence:
> 
> 	unsigned long f(unsigned long x) { return __fls(x); }
> 
> 	ff1     r0, r0
> 	movi    r3, 31
> 	subu    r0, r3, r0
> 	rts
> 
> (GCC 9 and 10 put the movi first for the builtin; GCC 9 also writes
> the asm version as ff1/nor/addi.)
> 
> Constant argument. PP_DMA_INDEX_SHIFT in include/linux/mm.h is
> 1 + __fls(PP_SIGNATURE - POISON_POINTER_DELTA), which is
> 1 + __fls(0x40):
> 
> 	unsigned int f(void) { return 1 + __fls(0x40); }
> 
> 	before:
> 	movi    r3, 64
> 	ff1     r3, r3
> 	movi    r0, 32
> 	subu    r0, r3
> 	rts
> 
> 	after:
> 	movi    r0, 7
> 	rts
> 
> This is where skb_try_coalesce shrinks: netmem_is_pp(), inlined into
> it through skb_pp_frag_ref(), uses that shift, and the function goes
> from 12 ff1 to 2 with GCC 12 and 16. The 2 that stay are
> __ffs(PAGE_OFFSET) from the same macros; __ffs() keeps its asm
> (brev; ff1). build_sched_domains also has one ff1 fewer.
> 
> Thanks,
> Tzu-Ching

      reply	other threads:[~2026-10-28 15:13 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-10-22 11:59 [PATCH] csky: bitops: Use the compiler builtin for __fls() Tzu-Ching Yang
2026-10-22 19:41 ` Yury Norov
2026-10-23 14:08   ` Tzu-Ching Yang
2026-10-23 15:45     ` Yury Norov
2026-10-27  6:23       ` Tzu-Ching Yang
2026-10-28 15:12         ` Yury Norov [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=auIQ2RI89C374je2@yury \
    --to=ynorov@nvidia.com \
    --cc=arnd@arndb.de \
    --cc=guoren@kernel.org \
    --cc=linux-arch@vger.kernel.org \
    --cc=linux-csky@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux@rasmusvillemoes.dk \
    --cc=shingekinocore@gmail.com \
    --cc=yury.norov@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox