[PATCHES][RFC] packing struct block_device flags

Al Viro
2024-04-28T05:12:36Z

We have several bool members in struct block_device.
It would be nice to pack that stuff, preferably without
blowing the cacheline boundaries.

That had been suggested a while ago, and initial
implementation by Yu Kuai <yukuai1@huaweicloud.com> ran into
objections re atomicity, along with the obvious suggestion to
use unsigned long and test_bit/set_bit/clear_bit for access.
Unfortunately, that *does* blow the cacheline boundaries.

However, it's not hard to do that without bitops;
we have an 8-bit assign-once partition number nearby, and
folding it into a 32-bit member leaves us up to 24 bits for
flags. Using cmpxchg for setting/clearing flags is not
hard, and 32bit cmpxchg is supported everywhere.

Series below does that conversion. Please, review.
Individual patches in followups, the branch is in
git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs.git #work.bd_flags

Shortlog:
Al Viro (8):
Use bdev_is_paritition() instead of open-coding it
wrapper for access to ->bd_partno
bdev: infrastructure for flags
bdev: move ->bd_read_only to ->__bd_flags
bdev: move ->bd_write_holder into ->__bd_flags
bdev: move ->bd_has_subit_bio to ->__bd_flags
bdev: move ->bd_ro_warned to ->__bd_flags
bdev: move ->bd_make_it_fail to ->__bd_flags

Diffstat:
block/bdev.c | 17 ++++++++---------
block/blk-core.c | 17 ++++++++++-------
block/blk-mq.c | 2 +-
block/early-lookup.c | 2 +-
block/genhd.c | 15 ++++++++++-----
block/ioctl.c | 5 ++++-
block/partitions/core.c | 12 ++++++------
include/linux/blk_types.h | 19 +++++++++++--------
include/linux/blkdev.h | 42 +++++++++++++++++++++++++++++++++++++++---
include/linux/part_stat.h | 2 +-
lib/vsprintf.c | 4 ++--
11 files changed, 93 insertions(+), 44 deletions(-)