From: Yury Norov <yury.norov@gmail.com>
To: Alexander Lobakin <aleksander.lobakin@intel.com>
Cc: Rasmus Villemoes <linux@rasmusvillemoes.dk>,
dm-devel@redhat.com, Alexander Potapenko <glider@google.com>,
Jiri Pirko <jiri@resnulli.us>,
linux-s390@vger.kernel.org,
Przemek Kitszel <przemyslaw.kitszel@intel.com>,
intel-wired-lan@lists.osuosl.org,
Jakub Kicinski <kuba@kernel.org>, Paolo Abeni <pabeni@redhat.com>,
Wojciech Drewek <wojciech.drewek@intel.com>,
Ido Schimmel <idosch@nvidia.com>,
Andy Shevchenko <andriy.shevchenko@linux.intel.com>,
Andy Shevchenko <andy@kernel.org>,
Eric Dumazet <edumazet@google.com>,
netdev@vger.kernel.org, linux-kernel@vger.kernel.org,
Marcin Szycik <marcin.szycik@linux.intel.com>,
Simon Horman <horms@kernel.org>,
Michal Swiatkowski <michal.swiatkowski@linux.intel.com>,
ntfs3@lists.linux.dev, "David S. Miller" <davem@davemloft.net>,
linux-btrfs@vger.kernel.org
Subject: Re: [Intel-wired-lan] [PATCH net-next v5 06/21] bitops: let the compiler optimize {__, }assign_bit()
Date: Wed, 28 Feb 2024 08:23:09 -0800 [thread overview]
Message-ID: <Zd9d7XS+TtOx73zP@yury-ThinkPad> (raw)
In-Reply-To: <20240201122216.2634007-7-aleksander.lobakin@intel.com>
On Thu, Feb 01, 2024 at 01:22:01PM +0100, Alexander Lobakin wrote:
> Since commit b03fc1173c0c ("bitops: let optimize out non-atomic bitops
> on compile-time constants"), the compilers are able to expand inline
> bitmap operations to compile-time initializers when possible.
> However, during the round of replacement if-__set-else-__clear with
> __assign_bit() as per Andy's advice, bloat-o-meter showed +1024 bytes
> difference in object code size for one module (even one function),
> where the pattern:
>
> DECLARE_BITMAP(foo) = { }; // on the stack, zeroed
>
> if (a)
> __set_bit(const_bit_num, foo);
> if (b)
> __set_bit(another_const_bit_num, foo);
> ...
>
> is heavily used, although there should be no difference: the bitmap is
> zeroed, so the second half of __assign_bit() should be compiled-out as
> a no-op.
> I either missed the fact that __assign_bit() has bitmap pointer marked
> as `volatile` (as we usually do for bitops) or was hoping that the
> compilers would at least try to look past the `volatile` for
> __always_inline functions. Anyhow, due to that attribute, the compilers
> were always compiling the whole expression and no mentioned compile-time
> optimizations were working.
>
> Convert __assign_bit() to a macro since it's a very simple if-else and
> all of the checks are performed inside __set_bit() and __clear_bit(),
> thus that wrapper has to be as transparent as possible. After that
> change, despite it showing only -20 bytes change for vmlinux (due to
> that it's still relatively unpopular), no drastic code size changes
> happen when replacing if-set-else-clear for onstack bitmaps with
> __assign_bit(), meaning the compiler now expands them to the actual
> operations will all the expected optimizations.
>
> Atomic assign_bit() is less affected due to its nature, but let's
> convert it to a macro as well to keep the code consistent and not
> leave a place for possible suboptimal codegen. Moreover, with certain
> kernel configuration it actually gives some saves (x86):
>
> do_ip_setsockopt 4154 4099 -55
>
> Suggested-by: Yury Norov <yury.norov@gmail.com> # assign_bit(), too
> Cc: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
> Reviewed-by: Przemek Kitszel <przemyslaw.kitszel@intel.com>
> Signed-off-by: Alexander Lobakin <aleksander.lobakin@intel.com>
Acked-by: Yury Norov <yury.norov@gmail.com>
WARNING: multiple messages have this Message-ID (diff)
From: Yury Norov <yury.norov@gmail.com>
To: Alexander Lobakin <aleksander.lobakin@intel.com>
Cc: "David S. Miller" <davem@davemloft.net>,
Eric Dumazet <edumazet@google.com>,
Jakub Kicinski <kuba@kernel.org>, Paolo Abeni <pabeni@redhat.com>,
Michal Swiatkowski <michal.swiatkowski@linux.intel.com>,
Marcin Szycik <marcin.szycik@linux.intel.com>,
Wojciech Drewek <wojciech.drewek@intel.com>,
Andy Shevchenko <andy@kernel.org>,
Rasmus Villemoes <linux@rasmusvillemoes.dk>,
Alexander Potapenko <glider@google.com>,
Jiri Pirko <jiri@resnulli.us>, Ido Schimmel <idosch@nvidia.com>,
Przemek Kitszel <przemyslaw.kitszel@intel.com>,
Simon Horman <horms@kernel.org>,
linux-btrfs@vger.kernel.org, dm-devel@redhat.com,
ntfs3@lists.linux.dev, linux-s390@vger.kernel.org,
intel-wired-lan@lists.osuosl.org, netdev@vger.kernel.org,
linux-kernel@vger.kernel.org,
Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Subject: Re: [PATCH net-next v5 06/21] bitops: let the compiler optimize {__,}assign_bit()
Date: Wed, 28 Feb 2024 08:23:09 -0800 [thread overview]
Message-ID: <Zd9d7XS+TtOx73zP@yury-ThinkPad> (raw)
In-Reply-To: <20240201122216.2634007-7-aleksander.lobakin@intel.com>
On Thu, Feb 01, 2024 at 01:22:01PM +0100, Alexander Lobakin wrote:
> Since commit b03fc1173c0c ("bitops: let optimize out non-atomic bitops
> on compile-time constants"), the compilers are able to expand inline
> bitmap operations to compile-time initializers when possible.
> However, during the round of replacement if-__set-else-__clear with
> __assign_bit() as per Andy's advice, bloat-o-meter showed +1024 bytes
> difference in object code size for one module (even one function),
> where the pattern:
>
> DECLARE_BITMAP(foo) = { }; // on the stack, zeroed
>
> if (a)
> __set_bit(const_bit_num, foo);
> if (b)
> __set_bit(another_const_bit_num, foo);
> ...
>
> is heavily used, although there should be no difference: the bitmap is
> zeroed, so the second half of __assign_bit() should be compiled-out as
> a no-op.
> I either missed the fact that __assign_bit() has bitmap pointer marked
> as `volatile` (as we usually do for bitops) or was hoping that the
> compilers would at least try to look past the `volatile` for
> __always_inline functions. Anyhow, due to that attribute, the compilers
> were always compiling the whole expression and no mentioned compile-time
> optimizations were working.
>
> Convert __assign_bit() to a macro since it's a very simple if-else and
> all of the checks are performed inside __set_bit() and __clear_bit(),
> thus that wrapper has to be as transparent as possible. After that
> change, despite it showing only -20 bytes change for vmlinux (due to
> that it's still relatively unpopular), no drastic code size changes
> happen when replacing if-set-else-clear for onstack bitmaps with
> __assign_bit(), meaning the compiler now expands them to the actual
> operations will all the expected optimizations.
>
> Atomic assign_bit() is less affected due to its nature, but let's
> convert it to a macro as well to keep the code consistent and not
> leave a place for possible suboptimal codegen. Moreover, with certain
> kernel configuration it actually gives some saves (x86):
>
> do_ip_setsockopt 4154 4099 -55
>
> Suggested-by: Yury Norov <yury.norov@gmail.com> # assign_bit(), too
> Cc: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
> Reviewed-by: Przemek Kitszel <przemyslaw.kitszel@intel.com>
> Signed-off-by: Alexander Lobakin <aleksander.lobakin@intel.com>
Acked-by: Yury Norov <yury.norov@gmail.com>
next prev parent reply other threads:[~2024-02-28 16:23 UTC|newest]
Thread overview: 104+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-02-01 12:21 [Intel-wired-lan] [PATCH net-next v5 00/21] ice: add PFCP filter support Alexander Lobakin
2024-02-01 12:21 ` Alexander Lobakin
2024-02-01 12:21 ` [Intel-wired-lan] [PATCH net-next v5 01/21] lib/bitmap: add bitmap_{read, write}() Alexander Lobakin
2024-02-01 12:21 ` [PATCH net-next v5 01/21] lib/bitmap: add bitmap_{read,write}() Alexander Lobakin
2024-02-01 13:23 ` [Intel-wired-lan] [PATCH net-next v5 01/21] lib/bitmap: add bitmap_{read, write}() Arnd Bergmann
2024-02-01 13:23 ` [PATCH net-next v5 01/21] lib/bitmap: add bitmap_{read,write}() Arnd Bergmann
2024-02-01 13:45 ` [Intel-wired-lan] [PATCH net-next v5 01/21] lib/bitmap: add bitmap_{read, write}() Alexander Potapenko
2024-02-01 13:45 ` [PATCH net-next v5 01/21] lib/bitmap: add bitmap_{read,write}() Alexander Potapenko
2024-02-01 14:02 ` [Intel-wired-lan] [PATCH net-next v5 01/21] lib/bitmap: add bitmap_{read, write}() Arnd Bergmann
2024-02-01 14:02 ` [PATCH net-next v5 01/21] lib/bitmap: add bitmap_{read,write}() Arnd Bergmann
2024-02-28 16:10 ` [Intel-wired-lan] [PATCH net-next v5 01/21] lib/bitmap: add bitmap_{read, write}() Yury Norov
2024-02-28 16:10 ` [PATCH net-next v5 01/21] lib/bitmap: add bitmap_{read,write}() Yury Norov
2024-02-01 15:49 ` [Intel-wired-lan] [PATCH net-next v5 01/21] lib/bitmap: add bitmap_{read, write}() Alexander Lobakin
2024-02-01 15:49 ` [PATCH net-next v5 01/21] lib/bitmap: add bitmap_{read,write}() Alexander Lobakin
2024-02-01 12:21 ` [Intel-wired-lan] [PATCH net-next v5 02/21] lib/test_bitmap: add tests for bitmap_{read, write}() Alexander Lobakin
2024-02-01 12:21 ` [PATCH net-next v5 02/21] lib/test_bitmap: add tests for bitmap_{read,write}() Alexander Lobakin
2024-02-28 16:13 ` [Intel-wired-lan] [PATCH net-next v5 02/21] lib/test_bitmap: add tests for bitmap_{read, write}() Yury Norov
2024-02-28 16:13 ` [PATCH net-next v5 02/21] lib/test_bitmap: add tests for bitmap_{read,write}() Yury Norov
2024-02-01 12:21 ` [Intel-wired-lan] [PATCH net-next v5 03/21] lib/test_bitmap: use pr_info() for non-error messages Alexander Lobakin
2024-02-01 12:21 ` Alexander Lobakin
2024-02-28 16:16 ` [Intel-wired-lan] " Yury Norov
2024-02-28 16:16 ` Yury Norov
2024-02-01 12:21 ` [Intel-wired-lan] [PATCH net-next v5 04/21] bitops: add missing prototype check Alexander Lobakin
2024-02-01 12:21 ` Alexander Lobakin
2024-02-28 16:18 ` [Intel-wired-lan] " Yury Norov
2024-02-28 16:18 ` Yury Norov
2024-02-01 12:22 ` [Intel-wired-lan] [PATCH net-next v5 05/21] bitops: make BYTES_TO_BITS() treewide-available Alexander Lobakin
2024-02-01 12:22 ` Alexander Lobakin
2024-02-28 16:20 ` [Intel-wired-lan] " Yury Norov
2024-02-28 16:20 ` Yury Norov
2024-02-01 12:22 ` [Intel-wired-lan] [PATCH net-next v5 06/21] bitops: let the compiler optimize {__, }assign_bit() Alexander Lobakin
2024-02-01 12:22 ` [PATCH net-next v5 06/21] bitops: let the compiler optimize {__,}assign_bit() Alexander Lobakin
2024-02-28 16:23 ` Yury Norov [this message]
2024-02-28 16:23 ` Yury Norov
2024-02-01 12:22 ` [Intel-wired-lan] [PATCH net-next v5 07/21] linkmode: convert linkmode_{test, set, clear, mod}_bit() to macros Alexander Lobakin
2024-02-01 12:22 ` [PATCH net-next v5 07/21] linkmode: convert linkmode_{test,set,clear,mod}_bit() " Alexander Lobakin
2024-02-28 16:24 ` [Intel-wired-lan] [PATCH net-next v5 07/21] linkmode: convert linkmode_{test, set, clear, mod}_bit() " Yury Norov
2024-02-28 16:24 ` [PATCH net-next v5 07/21] linkmode: convert linkmode_{test,set,clear,mod}_bit() " Yury Norov
2024-02-01 12:22 ` [Intel-wired-lan] [PATCH net-next v5 08/21] s390/cio: rename bitmap_size() -> idset_bitmap_size() Alexander Lobakin
2024-02-01 12:22 ` Alexander Lobakin
2024-02-26 17:13 ` [Intel-wired-lan] " Peter Oberparleiter
2024-02-26 17:13 ` Peter Oberparleiter
2024-02-01 12:22 ` [Intel-wired-lan] [PATCH net-next v5 09/21] fs/ntfs3: add prefix to bitmap_size() and use BITS_TO_U64() Alexander Lobakin
2024-02-01 12:22 ` Alexander Lobakin
2024-02-28 16:26 ` [Intel-wired-lan] " Yury Norov
2024-02-28 16:26 ` Yury Norov
2024-02-01 12:22 ` [Intel-wired-lan] [PATCH net-next v5 10/21] btrfs: rename bitmap_set_bits() -> btrfs_bitmap_set_bits() Alexander Lobakin
2024-02-01 12:22 ` Alexander Lobakin
2024-02-28 16:27 ` [Intel-wired-lan] " Yury Norov
2024-02-28 16:27 ` Yury Norov
2024-02-01 12:22 ` [Intel-wired-lan] [PATCH net-next v5 11/21] tools: move alignment-related macros to new <linux/align.h> Alexander Lobakin
2024-02-01 12:22 ` Alexander Lobakin
2024-02-02 11:37 ` [Intel-wired-lan] " Przemek Kitszel
2024-02-02 11:37 ` Przemek Kitszel
2024-02-28 16:28 ` [Intel-wired-lan] " Yury Norov
2024-02-28 16:28 ` Yury Norov
2024-02-28 16:29 ` [Intel-wired-lan] " Yury Norov
2024-02-28 16:29 ` Yury Norov
2024-02-01 12:22 ` [Intel-wired-lan] [PATCH net-next v5 12/21] bitmap: introduce generic optimized bitmap_size() Alexander Lobakin
2024-02-01 12:22 ` Alexander Lobakin
2024-02-28 16:31 ` [Intel-wired-lan] " Yury Norov
2024-02-28 16:31 ` Yury Norov
2024-02-01 12:22 ` [Intel-wired-lan] [PATCH net-next v5 13/21] bitmap: make bitmap_{get, set}_value8() use bitmap_{read, write}() Alexander Lobakin
2024-02-01 12:22 ` [PATCH net-next v5 13/21] bitmap: make bitmap_{get,set}_value8() use bitmap_{read,write}() Alexander Lobakin
2024-02-02 11:39 ` [Intel-wired-lan] [PATCH net-next v5 13/21] bitmap: make bitmap_{get, set}_value8() use bitmap_{read, write}() Przemek Kitszel
2024-02-02 11:39 ` [PATCH net-next v5 13/21] bitmap: make bitmap_{get,set}_value8() use bitmap_{read,write}() Przemek Kitszel
2024-02-28 16:31 ` [Intel-wired-lan] [PATCH net-next v5 13/21] bitmap: make bitmap_{get, set}_value8() use bitmap_{read, write}() Yury Norov
2024-02-28 16:31 ` [PATCH net-next v5 13/21] bitmap: make bitmap_{get,set}_value8() use bitmap_{read,write}() Yury Norov
2024-02-01 12:22 ` [Intel-wired-lan] [PATCH net-next v5 14/21] lib/bitmap: add compile-time test for __assign_bit() optimization Alexander Lobakin
2024-02-01 12:22 ` Alexander Lobakin
2024-02-28 16:32 ` [Intel-wired-lan] " Yury Norov
2024-02-28 16:32 ` Yury Norov
2024-02-01 12:22 ` [Intel-wired-lan] [PATCH net-next v5 15/21] ip_tunnel: use a separate struct to store tunnel params in the kernel Alexander Lobakin
2024-02-01 12:22 ` Alexander Lobakin
2024-02-01 12:22 ` [Intel-wired-lan] [PATCH net-next v5 16/21] ip_tunnel: convert __be16 tunnel flags to bitmaps Alexander Lobakin
2024-02-01 12:22 ` Alexander Lobakin
2024-02-01 12:22 ` [Intel-wired-lan] [PATCH net-next v5 17/21] lib/bitmap: add tests for IP tunnel flags conversion helpers Alexander Lobakin
2024-02-01 12:22 ` Alexander Lobakin
2024-02-28 16:38 ` [Intel-wired-lan] " Yury Norov
2024-02-28 16:38 ` Yury Norov
2024-03-26 12:20 ` [Intel-wired-lan] " Alexander Lobakin
2024-03-26 12:20 ` Alexander Lobakin
2024-02-01 12:22 ` [Intel-wired-lan] [PATCH net-next v5 18/21] pfcp: add PFCP module Alexander Lobakin
2024-02-01 12:22 ` Alexander Lobakin
2024-02-01 12:22 ` [Intel-wired-lan] [PATCH net-next v5 19/21] pfcp: always set pfcp metadata Alexander Lobakin
2024-02-01 12:22 ` Alexander Lobakin
2024-02-01 12:22 ` [Intel-wired-lan] [PATCH net-next v5 20/21] ice: refactor ICE_TC_FLWR_FIELD_ENC_OPTS Alexander Lobakin
2024-02-01 12:22 ` Alexander Lobakin
2024-02-01 12:22 ` [Intel-wired-lan] [PATCH net-next v5 21/21] ice: Add support for PFCP hardware offload in switchdev Alexander Lobakin
2024-02-01 12:22 ` Alexander Lobakin
2024-02-06 12:46 ` [Intel-wired-lan] [PATCH net-next v5 00/21] ice: add PFCP filter support Alexander Lobakin
2024-02-06 12:46 ` Alexander Lobakin
2024-02-06 15:37 ` [Intel-wired-lan] " Jakub Kicinski
2024-02-06 15:37 ` Jakub Kicinski
2024-02-07 15:05 ` [Intel-wired-lan] " Jakub Kicinski
2024-02-07 15:05 ` Jakub Kicinski
2024-02-12 11:35 ` [Intel-wired-lan] " Alexander Lobakin
2024-02-12 11:35 ` Alexander Lobakin
2024-02-28 16:46 ` Yury Norov
2024-02-28 16:46 ` Yury Norov
2024-04-02 10:59 ` Niklas Schnelle
2024-04-02 10:59 ` Niklas Schnelle
2024-04-02 11:00 ` Alexander Lobakin
2024-04-02 11:00 ` Alexander Lobakin
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=Zd9d7XS+TtOx73zP@yury-ThinkPad \
--to=yury.norov@gmail.com \
--cc=aleksander.lobakin@intel.com \
--cc=andriy.shevchenko@linux.intel.com \
--cc=andy@kernel.org \
--cc=davem@davemloft.net \
--cc=dm-devel@redhat.com \
--cc=edumazet@google.com \
--cc=glider@google.com \
--cc=horms@kernel.org \
--cc=idosch@nvidia.com \
--cc=intel-wired-lan@lists.osuosl.org \
--cc=jiri@resnulli.us \
--cc=kuba@kernel.org \
--cc=linux-btrfs@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-s390@vger.kernel.org \
--cc=linux@rasmusvillemoes.dk \
--cc=marcin.szycik@linux.intel.com \
--cc=michal.swiatkowski@linux.intel.com \
--cc=netdev@vger.kernel.org \
--cc=ntfs3@lists.linux.dev \
--cc=pabeni@redhat.com \
--cc=przemyslaw.kitszel@intel.com \
--cc=wojciech.drewek@intel.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.