All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v2 00/17] lib/bitmap: optimize bitmap_weight() usage
@ 2021-12-18 21:19 ` Yury Norov
  0 siblings, 0 replies; 126+ messages in thread
From: Yury Norov @ 2021-12-18 21:19 UTC (permalink / raw)
  To: linux-kernel, Yury Norov, James E.J. Bottomley,
	Martin K. Petersen, Michał Mirosław, Paul E. McKenney,
	Rafael J. Wysocki, Alexander Shishkin, Alexey Klimov,
	Amitkumar Karwar, Andi Kleen, Andrew Lunn, Andrew Morton,
	Andy Gross, Andy Lutomirski, Andy Shevchenko, Anup Patel,
	Ard Biesheuvel, Arnaldo Carvalho de Melo, Arnd Bergmann,
	Borislav Petkov, Catalin Marinas, Christoph Hellwig,
	Christoph Lameter, Daniel Vetter, Dave Hansen, David Airlie,
	David Laight, Dennis Zhou, Emil Renner Berthing,
	Geert Uytterhoeven, Geetha sowjanya, Greg Kroah-Hartman, Guo Ren,
	Hans de Goede, Heiko Carstens, Ian Rogers, Ingo Molnar,
	Jakub Kicinski, Jason Wessel, Jens Axboe, Jiri Olsa, Joe Perches,
	Jonathan Cameron, Juri Lelli, Kees Cook, Krzysztof Kozlowski,
	Lee Jones, Marc Zyngier, Marcin Wojtas, Mark Gross, Mark Rutland,
	Matti Vaittinen, Mauro Carvalho Chehab, Mel Gorman,
	Michael Ellerman, Mike Marciniszyn, Nicholas Piggin,
	Palmer Dabbelt, Peter Zijlstra, Petr Mladek, Randy Dunlap,
	Rasmus Villemoes, Russell King, Saeed Mahameed, Sagi Grimberg,
	Sergey Senozhatsky, Solomon Peachy, Stephen Boyd,
	Stephen Rothwell, Steven Rostedt, Subbaraya Sundeep,
	Sudeep Holla, Sunil Goutham, Tariq Toukan, Tejun Heo,
	Thomas Bogendoerfer, Thomas Gleixner, Ulf Hansson,
	Vincent Guittot, Vineet Gupta, Viresh Kumar, Vivien Didelot,
	Vlastimil Babka, Will Deacon, bcm-kernel-feedback-list, kvm,
	linux-alpha, linux-arm-kernel, linux-crypto, linux-csky,
	linux-ia64, linux-mips, linux-mm, linux-perf-users, linux-riscv,
	linux-s390, linux-snps-arc, linuxppc-dev

In many cases people use bitmap_weight()-based functions to compare
the result against a number of expression:

	if (cpumask_weight(...) > 1)
		do_something();

This may take considerable amount of time on many-cpus machines because
cpumask_weight(...) will traverse every word of underlying cpumask
unconditionally.

We can significantly improve on it for many real cases if stop traversing
the mask as soon as we count cpus to any number greater than 1:

	if (cpumask_weight_gt(..., 1))
		do_something();

To implement this idea, the series adds bitmap_weight_cmp() function
and bitmap_weight_{eq,gt,ge,lt,le} macros on top of it; corresponding
wrappers in cpumask and nodemask.

There are 3 cpumasks, for which weight is counted frequently: possible,
present and active. They all are read-mostly, and to optimize counting
number of set bits for them, this series adds atomic counters, similarly
to online cpumask.

v1: https://lkml.org/lkml/2021/11/27/339
v2:
  - add bitmap_weight_cmp();
  - fix bitmap_weight_le semantics and provide full set of {eq,gt,ge,lt,le}
    as wrappers around bitmap_weight_cmp();
  - don't touch small bitmaps (less than 32 bits) - optimization works
    only for large bitmaps;
  - move bitmap_weight() == 0 -> bitmap_empty() conversion to a separate
    patch, ditto cpumask_weight() and nodes_weight;
  - add counters for possible, present and active cpus;
  - drop bitmap_empty() where possible;
  - various fixes around bit counting that spotted my eyes.

Yury Norov (17):
  all: don't use bitmap_weight() where possible
  drivers: rename num_*_cpus variables
  fix open-coded for_each_set_bit()
  all: replace bitmap_weight with bitmap_empty where appropriate
  all: replace cpumask_weight with cpumask_empty where appropriate
  all: replace nodes_weight with nodes_empty where appropriate
  lib/bitmap: add bitmap_weight_{cmp,eq,gt,ge,lt,le} functions
  all: replace bitmap_weight with bitmap_weight_{eq,gt,ge,lt,le} where
    appropriate
  lib/cpumask: add cpumask_weight_{eq,gt,ge,lt,le}
  lib/nodemask: add nodemask_weight_{eq,gt,ge,lt,le}
  lib/nodemask: add num_node_state_eq()
  kernel/cpu.c: fix init_cpu_online
  kernel/cpu: add num_possible_cpus counter
  kernel/cpu: add num_present_cpu counter
  kernel/cpu: add num_active_cpu counter
  tools/bitmap: sync bitmap_weight
  MAINTAINERS: add cpumask and nodemask files to BITMAP_API

 MAINTAINERS                                   |   4 +
 arch/alpha/kernel/process.c                   |   2 +-
 arch/ia64/kernel/setup.c                      |   2 +-
 arch/ia64/mm/tlb.c                            |   2 +-
 arch/mips/cavium-octeon/octeon-irq.c          |   4 +-
 arch/mips/kernel/crash.c                      |   2 +-
 arch/nds32/kernel/perf_event_cpu.c            |   2 +-
 arch/powerpc/kernel/smp.c                     |   2 +-
 arch/powerpc/kernel/watchdog.c                |   2 +-
 arch/powerpc/xmon/xmon.c                      |   4 +-
 arch/s390/kernel/perf_cpum_cf.c               |   2 +-
 arch/x86/kernel/cpu/resctrl/rdtgroup.c        |  16 +--
 arch/x86/kernel/smpboot.c                     |   4 +-
 arch/x86/kvm/hyperv.c                         |   8 +-
 arch/x86/mm/amdtopology.c                     |   2 +-
 arch/x86/mm/mmio-mod.c                        |   2 +-
 arch/x86/mm/numa_emulation.c                  |   4 +-
 arch/x86/platform/uv/uv_nmi.c                 |   2 +-
 drivers/acpi/numa/srat.c                      |   2 +-
 drivers/cpufreq/qcom-cpufreq-hw.c             |   2 +-
 drivers/cpufreq/scmi-cpufreq.c                |   2 +-
 drivers/firmware/psci/psci_checker.c          |   2 +-
 drivers/gpu/drm/i915/i915_pmu.c               |   2 +-
 drivers/gpu/drm/msm/disp/mdp5/mdp5_smp.c      |   2 +-
 drivers/hv/channel_mgmt.c                     |   4 +-
 drivers/iio/dummy/iio_simple_dummy_buffer.c   |   4 +-
 drivers/iio/industrialio-trigger.c            |   2 +-
 drivers/infiniband/hw/hfi1/affinity.c         |  13 +-
 drivers/infiniband/hw/qib/qib_file_ops.c      |   2 +-
 drivers/infiniband/hw/qib/qib_iba7322.c       |   2 +-
 drivers/irqchip/irq-bcm6345-l1.c              |   2 +-
 drivers/leds/trigger/ledtrig-cpu.c            |   6 +-
 drivers/memstick/core/ms_block.c              |   4 +-
 drivers/net/dsa/b53/b53_common.c              |   6 +-
 drivers/net/ethernet/broadcom/bcmsysport.c    |   6 +-
 .../net/ethernet/intel/ice/ice_virtchnl_pf.c  |   4 +-
 .../net/ethernet/intel/ixgbe/ixgbe_sriov.c    |   2 +-
 .../marvell/octeontx2/nic/otx2_ethtool.c      |   2 +-
 .../marvell/octeontx2/nic/otx2_flows.c        |   8 +-
 .../ethernet/marvell/octeontx2/nic/otx2_pf.c  |   2 +-
 drivers/net/ethernet/mellanox/mlx4/cmd.c      |  33 ++---
 drivers/net/ethernet/mellanox/mlx4/eq.c       |   4 +-
 drivers/net/ethernet/mellanox/mlx4/fw.c       |   4 +-
 drivers/net/ethernet/mellanox/mlx4/main.c     |   2 +-
 drivers/net/ethernet/qlogic/qed/qed_rdma.c    |   4 +-
 drivers/net/ethernet/qlogic/qed/qed_roce.c    |   2 +-
 drivers/perf/arm-cci.c                        |   2 +-
 drivers/perf/arm_pmu.c                        |   4 +-
 drivers/perf/hisilicon/hisi_uncore_pmu.c      |   2 +-
 drivers/perf/thunderx2_pmu.c                  |   4 +-
 drivers/perf/xgene_pmu.c                      |   2 +-
 drivers/scsi/lpfc/lpfc_init.c                 |   2 +-
 drivers/scsi/storvsc_drv.c                    |   6 +-
 drivers/soc/fsl/qbman/qman_test_stash.c       |   2 +-
 drivers/staging/media/tegra-video/vi.c        |   2 +-
 drivers/thermal/intel/intel_powerclamp.c      |   9 +-
 include/linux/bitmap.h                        |  80 +++++++++++
 include/linux/cpumask.h                       | 131 +++++++++++++-----
 include/linux/nodemask.h                      |  40 ++++++
 kernel/cpu.c                                  |  54 ++++++++
 kernel/irq/affinity.c                         |   2 +-
 kernel/padata.c                               |   2 +-
 kernel/rcu/tree_nocb.h                        |   4 +-
 kernel/rcu/tree_plugin.h                      |   2 +-
 kernel/sched/core.c                           |  10 +-
 kernel/sched/topology.c                       |   4 +-
 kernel/time/clockevents.c                     |   2 +-
 kernel/time/clocksource.c                     |   2 +-
 lib/bitmap.c                                  |  21 +++
 mm/mempolicy.c                                |   2 +-
 mm/page_alloc.c                               |   2 +-
 mm/vmstat.c                                   |   4 +-
 tools/include/linux/bitmap.h                  |  44 ++++++
 tools/lib/bitmap.c                            |  20 +++
 tools/perf/builtin-c2c.c                      |   4 +-
 tools/perf/util/pmu.c                         |   2 +-
 76 files changed, 480 insertions(+), 183 deletions(-)

-- 
2.30.2


^ permalink raw reply	[flat|nested] 126+ messages in thread

end of thread, other threads:[~2021-12-21 14:22 UTC | newest]

Thread overview: 126+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-12-18 21:19 [PATCH v2 00/17] lib/bitmap: optimize bitmap_weight() usage Yury Norov
2021-12-18 21:19 ` Yury Norov
2021-12-18 21:19 ` Yury Norov
2021-12-18 21:19 ` Yury Norov
2021-12-18 21:19 ` Yury Norov
2021-12-18 21:19 ` [PATCH 01/17] all: don't use bitmap_weight() where possible Yury Norov
2021-12-18 21:19   ` Yury Norov
2021-12-18 21:19   ` Yury Norov
2021-12-18 21:19   ` Yury Norov
2021-12-18 22:15   ` Michał Mirosław
2021-12-18 22:15     ` Michał Mirosław
2021-12-18 22:15     ` Michał Mirosław
2021-12-18 22:15     ` Michał Mirosław
2021-12-18 22:15     ` Michał Mirosław
2021-12-18 23:28     ` Yury Norov
2021-12-18 23:28       ` Yury Norov
2021-12-18 23:28       ` Yury Norov
2021-12-18 23:28       ` Yury Norov
2021-12-18 23:28       ` Yury Norov
2021-12-18 23:28       ` Yury Norov
2021-12-18 21:19 ` [PATCH 02/17] drivers: rename num_*_cpus variables Yury Norov
2021-12-18 21:19   ` Yury Norov
2021-12-18 21:19   ` Yury Norov
2021-12-18 21:19   ` Yury Norov
2021-12-18 21:19   ` Yury Norov
2021-12-18 21:19 ` [PATCH 03/17] fix open-coded for_each_set_bit() Yury Norov
2021-12-18 21:19   ` Yury Norov
2021-12-18 21:19   ` Yury Norov
2021-12-18 21:19   ` Yury Norov
2021-12-18 21:19 ` Yury Norov
2021-12-18 21:20 ` [PATCH 04/17] all: replace bitmap_weight with bitmap_empty where appropriate Yury Norov
2021-12-18 21:20 ` Yury Norov
2021-12-18 21:20   ` Yury Norov
2021-12-18 21:20   ` Yury Norov
2021-12-18 21:20   ` Yury Norov
2021-12-18 21:20 ` [PATCH 05/17] all: replace cpumask_weight with cpumask_empty " Yury Norov
2021-12-18 21:20   ` Yury Norov
2021-12-18 21:20   ` Yury Norov
2021-12-18 21:20   ` Yury Norov
2021-12-18 21:20 ` Yury Norov
2021-12-18 21:20 ` [PATCH 06/17] all: replace nodes_weight with nodes_empty " Yury Norov
2021-12-18 21:20   ` Yury Norov
2021-12-18 21:20   ` Yury Norov
2021-12-18 21:20   ` Yury Norov
2021-12-18 21:20 ` Yury Norov
2021-12-18 21:20 ` [PATCH 07/17] lib/bitmap: add bitmap_weight_{cmp,eq,gt,ge,lt,le} functions Yury Norov
2021-12-18 21:20   ` Yury Norov
2021-12-18 21:20   ` Yury Norov
2021-12-18 21:20   ` [PATCH 07/17] lib/bitmap: add bitmap_weight_{cmp, eq, gt, ge, lt, le} functions Yury Norov
2021-12-18 21:20   ` Yury Norov
2021-12-18 21:20   ` Yury Norov
2021-12-18 21:20 ` [PATCH 08/17] all: replace bitmap_weight with bitmap_weight_{eq,gt,ge,lt,le} where appropriate Yury Norov
2021-12-18 21:20 ` Yury Norov
2021-12-18 21:20   ` Yury Norov
2021-12-18 21:20   ` [PATCH 08/17] all: replace bitmap_weight with bitmap_weight_{eq, gt, ge, lt, le} " Yury Norov
2021-12-18 21:20   ` Yury Norov
2021-12-18 21:20   ` Yury Norov
2021-12-20 16:41   ` [PATCH 08/17] all: replace bitmap_weight with bitmap_weight_{eq,gt,ge,lt,le} " Greg Kroah-Hartman
2021-12-20 16:41     ` Greg Kroah-Hartman
2021-12-20 16:41     ` Greg Kroah-Hartman
2021-12-20 16:41     ` Greg Kroah-Hartman
2021-12-20 16:41     ` Greg Kroah-Hartman
2021-12-20 16:41     ` Greg Kroah-Hartman
2021-12-18 21:20 ` [PATCH 09/17] lib/cpumask: add cpumask_weight_{eq,gt,ge,lt,le} Yury Norov
2021-12-18 21:20   ` Yury Norov
2021-12-18 21:20   ` Yury Norov
2021-12-18 21:20   ` Yury Norov
2021-12-18 21:20   ` Yury Norov
2021-12-18 21:20 ` [PATCH 10/17] lib/nodemask: add nodemask_weight_{eq,gt,ge,lt,le} Yury Norov
2021-12-18 21:20   ` Yury Norov
2021-12-18 21:20   ` Yury Norov
2021-12-18 21:20   ` Yury Norov
2021-12-18 21:20 ` Yury Norov
2021-12-18 21:20 ` [PATCH 11/17] lib/nodemask: add num_node_state_eq() Yury Norov
2021-12-18 21:20 ` Yury Norov
2021-12-18 21:20   ` Yury Norov
2021-12-18 21:20   ` Yury Norov
2021-12-18 21:20   ` Yury Norov
2021-12-18 21:20 ` [PATCH 12/17] kernel/cpu.c: fix init_cpu_online Yury Norov
2021-12-18 21:20   ` Yury Norov
2021-12-18 21:20   ` Yury Norov
2021-12-18 21:20   ` Yury Norov
2021-12-18 21:20 ` Yury Norov
2021-12-18 21:20 ` [PATCH 13/17] kernel/cpu: add num_possible_cpus counter Yury Norov
2021-12-18 21:20   ` Yury Norov
2021-12-18 21:20   ` Yury Norov
2021-12-18 21:20   ` Yury Norov
2021-12-21 13:15   ` Peter Zijlstra
2021-12-21 13:15     ` Peter Zijlstra
2021-12-21 13:15     ` Peter Zijlstra
2021-12-21 13:15     ` Peter Zijlstra
2021-12-21 13:15     ` Peter Zijlstra
2021-12-21 13:15     ` Peter Zijlstra
2021-12-18 21:20 ` Yury Norov
2021-12-18 21:20 ` [PATCH 14/17] kernel/cpu: add num_present_cpu counter Yury Norov
2021-12-18 21:20 ` Yury Norov
2021-12-18 21:20   ` Yury Norov
2021-12-18 21:20   ` Yury Norov
2021-12-18 21:20   ` Yury Norov
2021-12-21 13:14   ` Peter Zijlstra
2021-12-21 13:14     ` Peter Zijlstra
2021-12-21 13:14     ` Peter Zijlstra
2021-12-21 13:14     ` Peter Zijlstra
2021-12-21 13:14     ` Peter Zijlstra
2021-12-21 13:14     ` Peter Zijlstra
2021-12-18 21:20 ` [PATCH 15/17] kernel/cpu: add num_active_cpu counter Yury Norov
2021-12-18 21:20   ` Yury Norov
2021-12-18 21:20   ` Yury Norov
2021-12-18 21:20   ` Yury Norov
2021-12-21 13:13   ` Peter Zijlstra
2021-12-21 13:13     ` Peter Zijlstra
2021-12-21 13:13     ` Peter Zijlstra
2021-12-21 13:13     ` Peter Zijlstra
2021-12-21 13:13     ` Peter Zijlstra
2021-12-21 13:13     ` Peter Zijlstra
2021-12-18 21:20 ` Yury Norov
2021-12-18 21:20 ` [PATCH 16/17] tools/bitmap: sync bitmap_weight Yury Norov
2021-12-18 21:20   ` Yury Norov
2021-12-18 21:20   ` Yury Norov
2021-12-18 21:20   ` Yury Norov
2021-12-18 21:20 ` Yury Norov
2021-12-18 21:20 ` [PATCH 17/17] MAINTAINERS: add cpumask and nodemask files to BITMAP_API Yury Norov
2021-12-18 21:20 ` Yury Norov
2021-12-18 21:20   ` Yury Norov
2021-12-18 21:20   ` Yury Norov
2021-12-18 21:20   ` Yury Norov

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.