Merge remote-tracking branch 'torvalds/master' into perf/core
authorArnaldo Carvalho de Melo <acme@redhat.com>
Fri, 16 Dec 2022 12:53:53 +0000 (09:53 -0300)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Fri, 16 Dec 2022 12:53:53 +0000 (09:53 -0300)
To resolve a trivial merge conflict with c302378bc157f6a7 ("libbpf:
Hashmap interface update to allow both long and void* keys/values"),
where a function present upstream was removed in the perf tools
development tree.

Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
1  2 
MAINTAINERS
tools/lib/bpf/Makefile
tools/perf/tests/expr.c
tools/perf/tests/pmu-events.c
tools/perf/util/bpf-loader.c
tools/perf/util/evsel.c
tools/perf/util/expr.c
tools/perf/util/metricgroup.c
tools/perf/util/stat-shadow.c
tools/perf/util/stat.c

diff --combined MAINTAINERS
@@@ -312,6 -312,13 +312,13 @@@ L:       linux-iio@vger.kernel.or
  S:    Maintained
  F:    drivers/counter/104-quad-8.c
  
+ ACCES IDIO-16 GPIO LIBRARY
+ M:    William Breathitt Gray <william.gray@linaro.org>
+ L:    linux-gpio@vger.kernel.org
+ S:    Maintained
+ F:    drivers/gpio/gpio-idio-16.c
+ F:    drivers/gpio/gpio-idio-16.h
  ACCES PCI-IDIO-16 GPIO DRIVER
  M:    William Breathitt Gray <william.gray@linaro.org>
  L:    linux-gpio@vger.kernel.org
@@@ -775,6 -782,24 +782,24 @@@ T:       git git://linuxtv.org/media_tree.gi
  F:    Documentation/devicetree/bindings/media/allwinner,sun4i-a10-csi.yaml
  F:    drivers/media/platform/sunxi/sun4i-csi/
  
+ ALLWINNER A31 CSI DRIVER
+ M:    Yong Deng <yong.deng@magewell.com>
+ M:    Paul Kocialkowski <paul.kocialkowski@bootlin.com>
+ L:    linux-media@vger.kernel.org
+ S:    Maintained
+ T:    git git://linuxtv.org/media_tree.git
+ F:    Documentation/devicetree/bindings/media/allwinner,sun6i-a31-csi.yaml
+ F:    drivers/media/platform/sunxi/sun6i-csi/
+ ALLWINNER A31 ISP DRIVER
+ M:    Paul Kocialkowski <paul.kocialkowski@bootlin.com>
+ L:    linux-media@vger.kernel.org
+ S:    Maintained
+ T:    git git://linuxtv.org/media_tree.git
+ F:    Documentation/devicetree/bindings/media/allwinner,sun6i-a31-isp.yaml
+ F:    drivers/staging/media/sunxi/sun6i-isp/
+ F:    drivers/staging/media/sunxi/sun6i-isp/uapi/sun6i-isp-config.h
  ALLWINNER A31 MIPI CSI-2 BRIDGE DRIVER
  M:    Paul Kocialkowski <paul.kocialkowski@bootlin.com>
  L:    linux-media@vger.kernel.org
@@@ -1093,6 -1118,16 +1118,16 @@@ S:    Maintaine
  F:    Documentation/hid/amd-sfh*
  F:    drivers/hid/amd-sfh-hid/
  
+ AMLOGIC DDR PMU DRIVER
+ M:    Jiucheng Xu <jiucheng.xu@amlogic.com>
+ L:    linux-amlogic@lists.infradead.org
+ S:    Supported
+ W:    http://www.amlogic.com
+ F:    Documentation/admin-guide/perf/meson-ddr-pmu.rst
+ F:    Documentation/devicetree/bindings/perf/amlogic,g12-ddr-pmu.yaml
+ F:    drivers/perf/amlogic/
+ F:    include/soc/amlogic/
  AMPHION VPU CODEC V4L2 DRIVER
  M:    Ming Qian <ming.qian@nxp.com>
  M:    Shijie Qin <shijie.qin@nxp.com>
@@@ -1685,7 -1720,7 +1720,7 @@@ M:      Miquel Raynal <miquel.raynal@bootlin
  M:    Naga Sureshkumar Relli <nagasure@xilinx.com>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  S:    Maintained
- F:    Documentation/devicetree/bindings/memory-controllers/arm,pl353-smc.yaml
+ F:    Documentation/devicetree/bindings/memory-controllers/arm,pl35x-smc.yaml
  F:    drivers/memory/pl353-smc.c
  
  ARM PRIMECELL CLCD PL110 DRIVER
@@@ -1897,12 -1932,14 +1932,14 @@@ T:   git https://github.com/AsahiLinux/li
  F:    Documentation/devicetree/bindings/arm/apple.yaml
  F:    Documentation/devicetree/bindings/arm/apple/*
  F:    Documentation/devicetree/bindings/clock/apple,nco.yaml
+ F:    Documentation/devicetree/bindings/cpufreq/apple,cluster-cpufreq.yaml
  F:    Documentation/devicetree/bindings/dma/apple,admac.yaml
  F:    Documentation/devicetree/bindings/i2c/apple,i2c.yaml
  F:    Documentation/devicetree/bindings/interrupt-controller/apple,*
  F:    Documentation/devicetree/bindings/iommu/apple,dart.yaml
  F:    Documentation/devicetree/bindings/iommu/apple,sart.yaml
  F:    Documentation/devicetree/bindings/mailbox/apple,mailbox.yaml
+ F:    Documentation/devicetree/bindings/net/bluetooth/brcm,bcm4377-bluetooth.yaml
  F:    Documentation/devicetree/bindings/nvme/apple,nvme-ans.yaml
  F:    Documentation/devicetree/bindings/nvmem/apple,efuses.yaml
  F:    Documentation/devicetree/bindings/pci/apple,pcie.yaml
@@@ -1910,7 -1947,9 +1947,9 @@@ F:      Documentation/devicetree/bindings/pi
  F:    Documentation/devicetree/bindings/power/apple*
  F:    Documentation/devicetree/bindings/watchdog/apple,wdt.yaml
  F:    arch/arm64/boot/dts/apple/
+ F:    drivers/bluetooth/hci_bcm4377.c
  F:    drivers/clk/clk-apple-nco.c
+ F:    drivers/cpufreq/apple-soc-cpufreq.c
  F:    drivers/dma/apple-admac.c
  F:    drivers/i2c/busses/i2c-pasemi-core.c
  F:    drivers/i2c/busses/i2c-pasemi-platform.c
@@@ -2272,8 -2311,6 +2311,6 @@@ F:      drivers/clocksource/timer-ixp4xx.
  F:    drivers/crypto/ixp4xx_crypto.c
  F:    drivers/gpio/gpio-ixp4xx.c
  F:    drivers/irqchip/irq-ixp4xx.c
- F:    include/linux/irqchip/irq-ixp4xx.h
- F:    include/linux/platform_data/timer-ixp4xx.h
  
  ARM/INTEL KEEMBAY ARCHITECTURE
  M:    Paul J. Murphy <paul.j.murphy@intel.com>
@@@ -2341,6 -2378,8 +2378,8 @@@ M:      Gregory Clement <gregory.clement@boo
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  S:    Maintained
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/gclement/mvebu.git
+ F:    Documentation/devicetree/bindings/arm/marvell/marvell,dove.txt
+ F:    Documentation/devicetree/bindings/arm/marvell/marvell,orion5x.txt
  F:    Documentation/devicetree/bindings/soc/dove/
  F:    arch/arm/boot/dts/dove*
  F:    arch/arm/boot/dts/orion5x*
@@@ -2357,6 -2396,7 +2396,7 @@@ M:      Sebastian Hesselbarth <sebastian.hes
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  S:    Maintained
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/gclement/mvebu.git
+ F:    Documentation/devicetree/bindings/arm/marvell/
  F:    arch/arm/boot/dts/armada*
  F:    arch/arm/boot/dts/kirkwood*
  F:    arch/arm/configs/mvebu_*_defconfig
@@@ -2439,6 -2479,7 +2479,7 @@@ L:      linux-arm-kernel@lists.infradead.or
  S:    Supported
  T:    git git://github.com/microchip-ung/linux-upstream.git
  F:    arch/arm64/boot/dts/microchip/
+ F:    drivers/net/ethernet/microchip/vcap/
  F:    drivers/pinctrl/pinctrl-microchip-sgpio.c
  N:    sparx5
  
@@@ -2620,7 -2661,7 +2661,7 @@@ W:      http://www.armlinux.org.uk
  ARM/QUALCOMM SUPPORT
  M:    Andy Gross <agross@kernel.org>
  M:    Bjorn Andersson <andersson@kernel.org>
- R:    Konrad Dybcio <konrad.dybcio@somainline.org>
+ R:    Konrad Dybcio <konrad.dybcio@linaro.org>
  L:    linux-arm-msm@vger.kernel.org
  S:    Maintained
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/qcom/linux.git
@@@ -2691,7 -2732,7 +2732,7 @@@ F:      arch/arm/boot/dts/rtd
  F:    arch/arm/mach-realtek/
  F:    arch/arm64/boot/dts/realtek/
  
- ARM/RENESAS ARCHITECTURE
+ ARM/RISC-V/RENESAS ARCHITECTURE
  M:    Geert Uytterhoeven <geert+renesas@glider.be>
  M:    Magnus Damm <magnus.damm@gmail.com>
  L:    linux-renesas-soc@vger.kernel.org
@@@ -2699,7 -2740,6 +2740,6 @@@ S:      Supporte
  Q:    http://patchwork.kernel.org/project/linux-renesas-soc/list/
  C:    irc://irc.libera.chat/renesas-soc
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/geert/renesas-devel.git next
- F:    Documentation/devicetree/bindings/arm/renesas.yaml
  F:    Documentation/devicetree/bindings/hwinfo/renesas,prr.yaml
  F:    Documentation/devicetree/bindings/soc/renesas/
  F:    arch/arm/boot/dts/emev2*
@@@ -2713,6 -2753,7 +2753,7 @@@ F:      arch/arm/configs/shmobile_defconfi
  F:    arch/arm/include/debug/renesas-scif.S
  F:    arch/arm/mach-shmobile/
  F:    arch/arm64/boot/dts/renesas/
+ F:    arch/riscv/boot/dts/renesas/
  F:    drivers/soc/renesas/
  F:    include/linux/soc/renesas/
  
@@@ -4941,6 -4982,12 +4982,12 @@@ S:    Maintaine
  F:    drivers/platform/chrome/cros_usbpd_notify.c
  F:    include/linux/platform_data/cros_usbpd_notify.h
  
+ CHROMEOS HPS DRIVER
+ M:    Dan Callaghan <dcallagh@chromium.org>
+ R:    Sami Kyöstilä <skyostil@chromium.org>
+ S:    Maintained
+ F:    drivers/platform/chrome/cros_hps_i2c.c
  CHRONTEL CH7322 CEC DRIVER
  M:    Joe Tessler <jrt@google.com>
  L:    linux-media@vger.kernel.org
@@@ -5299,7 -5346,7 +5346,7 @@@ M:      Johannes Weiner <hannes@cmpxchg.org
  M:    Michal Hocko <mhocko@kernel.org>
  M:    Roman Gushchin <roman.gushchin@linux.dev>
  M:    Shakeel Butt <shakeelb@google.com>
- R:    Muchun Song <songmuchun@bytedance.com>
+ R:    Muchun Song <muchun.song@linux.dev>
  L:    cgroups@vger.kernel.org
  L:    linux-mm@kvack.org
  S:    Maintained
@@@ -5502,14 -5549,6 +5549,6 @@@ M:     Jaya Kumar <jayakumar.alsa@gmail.com
  S:    Maintained
  F:    sound/pci/cs5535audio/
  
- CSI DRIVERS FOR ALLWINNER V3s
- M:    Yong Deng <yong.deng@magewell.com>
- L:    linux-media@vger.kernel.org
- S:    Maintained
- T:    git git://linuxtv.org/media_tree.git
- F:    Documentation/devicetree/bindings/media/allwinner,sun6i-a31-csi.yaml
- F:    drivers/media/platform/sunxi/sun6i-csi/
  CTU CAN FD DRIVER
  M:    Pavel Pisa <pisa@cmp.felk.cvut.cz>
  M:    Ondrej Ille <ondrej.ille@gmail.com>
@@@ -5585,8 -5624,6 +5624,6 @@@ F:      drivers/scsi/cxgbi/cxgb3
  
  CXGB4 CRYPTO DRIVER (chcr)
  M:    Ayush Sawal <ayush.sawal@chelsio.com>
- M:    Vinay Kumar Yadav <vinay.yadav@chelsio.com>
- M:    Rohit Maheshwari <rohitm@chelsio.com>
  L:    linux-crypto@vger.kernel.org
  S:    Supported
  W:    http://www.chelsio.com
@@@ -5594,8 -5631,6 +5631,6 @@@ F:      drivers/crypto/chelsi
  
  CXGB4 INLINE CRYPTO DRIVER
  M:    Ayush Sawal <ayush.sawal@chelsio.com>
- M:    Vinay Kumar Yadav <vinay.yadav@chelsio.com>
- M:    Rohit Maheshwari <rohitm@chelsio.com>
  L:    netdev@vger.kernel.org
  S:    Supported
  W:    http://www.chelsio.com
@@@ -5858,6 -5893,13 +5893,13 @@@ L:    Dell.Client.Kernel@dell.co
  S:    Maintained
  F:    drivers/platform/x86/dell/dell-wmi-descriptor.c
  
+ DELL WMI DDV DRIVER
+ M:    Armin Wolf <W_Armin@gmx.de>
+ S:    Maintained
+ F:    Documentation/ABI/testing/debugfs-dell-wmi-ddv
+ F:    Documentation/ABI/testing/sysfs-platform-dell-wmi-ddv
+ F:    drivers/platform/x86/dell/dell-wmi-ddv.c
  DELL WMI SYSMAN DRIVER
  M:    Divya Bharathi <divya.bharathi@dell.com>
  M:    Prasanth Ksr <prasanth.ksr@dell.com>
@@@ -6033,11 -6075,12 +6075,12 @@@ F:   include/net/devlink.
  F:    include/uapi/linux/devlink.h
  F:    net/core/devlink.c
  
- DH ELECTRONICS IMX6 DHCOM BOARD SUPPORT
+ DH ELECTRONICS IMX6 DHCOM/DHCOR BOARD SUPPORT
  M:    Christoph Niedermaier <cniedermaier@dh-electronics.com>
  L:    kernel@dh-electronics.com
  S:    Maintained
  F:    arch/arm/boot/dts/imx6*-dhcom-*
+ F:    arch/arm/boot/dts/imx6*-dhcor-*
  
  DH ELECTRONICS STM32MP1 DHCOM/DHCOR BOARD SUPPORT
  M:    Marek Vasut <marex@denx.de>
@@@ -6329,6 -6372,7 +6372,7 @@@ F:      drivers/net/ethernet/freescale/dpaa2
  F:    drivers/net/ethernet/freescale/dpaa2/Makefile
  F:    drivers/net/ethernet/freescale/dpaa2/dpaa2-eth*
  F:    drivers/net/ethernet/freescale/dpaa2/dpaa2-mac*
+ F:    drivers/net/ethernet/freescale/dpaa2/dpaa2-xsk*
  F:    drivers/net/ethernet/freescale/dpaa2/dpkg.h
  F:    drivers/net/ethernet/freescale/dpaa2/dpmac*
  F:    drivers/net/ethernet/freescale/dpaa2/dpni*
@@@ -6506,6 -6550,12 +6550,12 @@@ S:    Orphan / Obsolet
  F:    drivers/gpu/drm/i810/
  F:    include/uapi/drm/i810_drm.h
  
+ DRM DRIVER FOR JADARD JD9365DA-H3 MIPI-DSI LCD PANELS
+ M:    Jagan Teki <jagan@edgeble.ai>
+ S:    Maintained
+ F:    Documentation/devicetree/bindings/display/panel/jadard,jd9365da-h3.yaml
+ F:    drivers/gpu/drm/panel/panel-jadard-jd9365da-h3.c
  DRM DRIVER FOR LOGICVC DISPLAY CONTROLLER
  M:    Paul Kocialkowski <paul.kocialkowski@bootlin.com>
  S:    Supported
@@@ -6695,10 -6745,13 +6745,13 @@@ L:   dri-devel@lists.freedesktop.or
  S:    Maintained
  T:    git git://anongit.freedesktop.org/drm/drm-misc
  F:    drivers/gpu/drm/drm_aperture.c
+ F:    drivers/gpu/drm/tiny/ofdrm.c
  F:    drivers/gpu/drm/tiny/simpledrm.c
  F:    drivers/video/aperture.c
+ F:    drivers/video/nomodeset.c
  F:    include/drm/drm_aperture.h
  F:    include/linux/aperture.h
+ F:    include/video/nomodeset.h
  
  DRM DRIVER FOR SIS VIDEO CARDS
  S:    Orphan / Obsolete
@@@ -6827,6 -6880,15 +6880,15 @@@ F:    include/drm/drm
  F:    include/linux/vga*
  F:    include/uapi/drm/drm*
  
+ DRM COMPUTE ACCELERATORS DRIVERS AND FRAMEWORK
+ M:    Oded Gabbay <ogabbay@kernel.org>
+ L:    dri-devel@lists.freedesktop.org
+ S:    Maintained
+ C:    irc://irc.oftc.net/dri-devel
+ T:    git https://git.kernel.org/pub/scm/linux/kernel/git/ogabbay/accel.git
+ F:    Documentation/accel/
+ F:    drivers/accel/
  DRM DRIVERS FOR ALLWINNER A10
  M:    Maxime Ripard <mripard@kernel.org>
  M:    Chen-Yu Tsai <wens@csie.org>
@@@ -7115,7 -7177,7 +7177,7 @@@ F:      drivers/gpu/drm/ttm
  F:    include/drm/ttm/
  
  DRM GPU SCHEDULER
- M:    Andrey Grodzovsky <andrey.grodzovsky@amd.com>
+ M:    Luben Tuikov <luben.tuikov@amd.com>
  L:    dri-devel@lists.freedesktop.org
  S:    Maintained
  T:    git git://anongit.freedesktop.org/drm/drm-misc
@@@ -7363,9 -7425,9 +7425,9 @@@ F:      drivers/edac/thunderx_edac
  
  EDAC-CORE
  M:    Borislav Petkov <bp@alien8.de>
- M:    Mauro Carvalho Chehab <mchehab@kernel.org>
  M:    Tony Luck <tony.luck@intel.com>
  R:    James Morse <james.morse@arm.com>
+ R:    Mauro Carvalho Chehab <mchehab@kernel.org>
  R:    Robert Richter <rric@kernel.org>
  L:    linux-edac@vger.kernel.org
  S:    Supported
@@@ -7482,8 -7544,7 +7544,7 @@@ S:      Maintaine
  F:    drivers/edac/pnd2_edac.[ch]
  
  EDAC-QCOM
- M:    Channagoud Kadabi <ckadabi@codeaurora.org>
- M:    Venkata Narendra Kumar Gutta <vnkgutta@codeaurora.org>
+ M:    Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
  L:    linux-arm-msm@vger.kernel.org
  L:    linux-edac@vger.kernel.org
  S:    Maintained
@@@ -7684,6 -7745,7 +7745,7 @@@ ETAS ES58X CAN/USB DRIVE
  M:    Vincent Mailhol <mailhol.vincent@wanadoo.fr>
  L:    linux-can@vger.kernel.org
  S:    Maintained
+ F:    Documentation/networking/devlink/etas_es58x.rst
  F:    drivers/net/can/usb/etas_es58x/
  
  ETHERNET BRIDGE
@@@ -7789,7 -7851,6 +7851,6 @@@ F:      Documentation/admin-guide/efi-stub.r
  F:    arch/*/include/asm/efi.h
  F:    arch/*/kernel/efi.c
  F:    arch/arm/boot/compressed/efi-header.S
- F:    arch/arm64/kernel/efi-entry.S
  F:    arch/x86/platform/efi/
  F:    drivers/firmware/efi/
  F:    include/linux/efi*.h
@@@ -7835,6 -7896,7 +7896,7 @@@ M:      Chao Yu <chao@kernel.org
  L:    linux-f2fs-devel@lists.sourceforge.net
  S:    Maintained
  W:    https://f2fs.wiki.kernel.org/
+ B:    https://bugzilla.kernel.org/enter_bug.cgi?product=File%20System&component=f2fs
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/jaegeuk/f2fs.git
  F:    Documentation/ABI/testing/sysfs-fs-f2fs
  F:    Documentation/filesystems/f2fs.rst
@@@ -8051,6 -8113,8 +8113,8 @@@ S:      Supporte
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/kees/linux.git for-next/hardening
  F:    include/linux/fortify-string.h
  F:    lib/fortify_kunit.c
+ F:    lib/memcpy_kunit.c
+ F:    lib/strscpy_kunit.c
  F:    lib/test_fortify/*
  F:    scripts/test_fortify.sh
  K:    \b__NO_FORTIFY\b
@@@ -8187,7 -8251,10 +8251,10 @@@ S:    Maintaine
  F:    drivers/i2c/busses/i2c-cpm.c
  
  FREESCALE IMX / MXC FEC DRIVER
- M:    Joakim Zhang <qiangqing.zhang@nxp.com>
+ M:    Wei Fang <wei.fang@nxp.com>
+ R:    Shenwei Wang <shenwei.wang@nxp.com>
+ R:    Clark Wang <xiaoning.wang@nxp.com>
+ R:    NXP Linux Team <linux-imx@nxp.com>
  L:    netdev@vger.kernel.org
  S:    Maintained
  F:    Documentation/devicetree/bindings/net/fsl,fec.yaml
@@@ -8461,6 -8528,9 +8528,9 @@@ FUNCTION HOOKS (FTRACE
  M:    Steven Rostedt <rostedt@goodmis.org>
  M:    Masami Hiramatsu <mhiramat@kernel.org>
  R:    Mark Rutland <mark.rutland@arm.com>
+ L:    linux-kernel@vger.kernel.org
+ L:    linux-trace-kernel@vger.kernel.org
+ Q:    https://patchwork.kernel.org/project/linux-trace-kernel/list/
  S:    Maintained
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/trace/linux-trace.git
  F:    Documentation/trace/ftrace*
@@@ -8746,6 -8816,7 +8816,7 @@@ GPIO IR Transmitte
  M:    Sean Young <sean@mess.org>
  L:    linux-media@vger.kernel.org
  S:    Maintained
+ F:    Documentation/devicetree/bindings/leds/irled/gpio-ir-tx.yaml
  F:    drivers/media/rc/gpio-ir-tx.c
  
  GPIO MOCKUP DRIVER
@@@ -9169,6 -9240,13 +9240,13 @@@ W:    http://www.highpoint-tech.co
  F:    Documentation/scsi/hptiop.rst
  F:    drivers/scsi/hptiop.c
  
+ HIMAX HX83112B TOUCHSCREEN SUPPORT
+ M:    Job Noorman <job@noorman.info>
+ L:    linux-input@vger.kernel.org
+ S:    Maintained
+ F:    Documentation/devicetree/bindings/input/touchscreen/himax,hx83112b.yaml
+ F:    drivers/input/touchscreen/himax_hx83112b.c
  HIPPI
  M:    Jes Sorensen <jes@trained-monkey.org>
  L:    linux-hippi@sunsite.dk
@@@ -9198,6 -9276,7 +9276,7 @@@ HISILICON GPIO DRIVE
  M:    Jay Fang <f.fangjian@huawei.com>
  L:    linux-gpio@vger.kernel.org
  S:    Maintained
+ F:    Documentation/devicetree/bindings/gpio/hisilicon,ascend910-gpio.yaml
  F:    drivers/gpio/gpio-hisi.c
  
  HISILICON HIGH PERFORMANCE RSA ENGINE DRIVER (HPRE)
@@@ -9214,6 -9293,7 +9293,7 @@@ M:      Yicong Yang <yangyicong@hisilicon.co
  L:    linux-i2c@vger.kernel.org
  S:    Maintained
  W:    https://www.hisilicon.com
+ F:    Documentation/devicetree/bindings/i2c/hisilicon,ascend910-i2c.yaml
  F:    drivers/i2c/busses/i2c-hisi.c
  
  HISILICON LPC BUS DRIVER
@@@ -9248,7 -9328,7 +9328,7 @@@ F:      drivers/misc/hisi_hikey_usb.
  
  HISILICON PMU DRIVER
  M:    Shaokun Zhang <zhangshaokun@hisilicon.com>
- M:    Qi Liu <liuqi115@huawei.com>
+ M:    Jonathan Cameron <jonathan.cameron@huawei.com>
  S:    Supported
  W:    http://www.hisilicon.com
  F:    Documentation/admin-guide/perf/hisi-pcie-pmu.rst
@@@ -9297,7 -9377,7 +9377,7 @@@ F:      Documentation/devicetree/bindings/in
  F:    drivers/infiniband/hw/hns/
  
  HISILICON SAS Controller
- M:    John Garry <john.garry@huawei.com>
+ M:    Xiang Chen <chenxiang66@hisilicon.com>
  S:    Supported
  W:    http://www.hisilicon.com
  F:    Documentation/devicetree/bindings/scsi/hisilicon-sas.txt
@@@ -9366,7 -9446,7 +9446,7 @@@ F:      drivers/net/wireless/intersil/hostap
  HP COMPAQ TC1100 TABLET WMI EXTRAS DRIVER
  L:    platform-driver-x86@vger.kernel.org
  S:    Orphan
- F:    drivers/platform/x86/tc1100-wmi.c
+ F:    drivers/platform/x86/hp/tc1100-wmi.c
  
  HPET: High Precision Event Timers driver
  M:    Clemens Ladisch <clemens@ladisch.de>
@@@ -9436,14 -9516,15 +9516,15 @@@ F:   Documentation/devicetree/bindings/ii
  F:    drivers/iio/humidity/hts221*
  
  HUAWEI ETHERNET DRIVER
+ M:    Cai Huoqing <cai.huoqing@linux.dev>
  L:    netdev@vger.kernel.org
- S:    Orphan
+ S:    Maintained
  F:    Documentation/networking/device_drivers/ethernet/huawei/hinic.rst
  F:    drivers/net/ethernet/huawei/hinic/
  
  HUGETLB SUBSYSTEM
  M:    Mike Kravetz <mike.kravetz@oracle.com>
- M:    Muchun Song <songmuchun@bytedance.com>
+ M:    Muchun Song <muchun.song@linux.dev>
  L:    linux-mm@kvack.org
  S:    Maintained
  F:    Documentation/ABI/testing/sysfs-kernel-mm-hugepages
@@@ -9540,6 -9621,7 +9621,7 @@@ F:      include/asm-generic/hyperv-tlfs.
  F:    include/asm-generic/mshyperv.h
  F:    include/clocksource/hyperv_timer.h
  F:    include/linux/hyperv.h
+ F:    include/net/mana
  F:    include/uapi/linux/hyperv.h
  F:    net/vmw_vsock/hyperv_transport.c
  F:    tools/hv/
@@@ -9703,8 -9785,7 +9785,7 @@@ F:      Documentation/devicetree/bindings/i3
  F:    drivers/i3c/master/i3c-master-cdns.c
  
  I3C DRIVER FOR SYNOPSYS DESIGNWARE
- M:    Vitor Soares <vitor.soares@synopsys.com>
- S:    Maintained
+ S:    Orphan
  F:    Documentation/devicetree/bindings/i3c/snps,dw-i3c-master.yaml
  F:    drivers/i3c/master/dw*
  
@@@ -10026,6 -10107,11 +10107,11 @@@ F: Documentation/hwmon/ina2xx.rs
  F:    drivers/hwmon/ina2xx.c
  F:    include/linux/platform_data/ina2xx.h
  
+ INDEX OF FURTHER KERNEL DOCUMENTATION
+ M:    Carlos Bilbao <carlos.bilbao@amd.com>
+ S:    Maintained
+ F:    Documentation/process/kernel-docs.rst
  INDUSTRY PACK SUBSYSTEM (IPACK)
  M:    Samuel Iglesias Gonsalvez <siglesias@igalia.com>
  M:    Jens Taprogge <jens.taprogge@taprogge.org>
@@@ -10055,6 -10141,7 +10141,7 @@@ F:   drivers/infiniband
  F:    include/rdma/
  F:    include/trace/events/ib_mad.h
  F:    include/trace/events/ib_umad.h
+ F:    include/trace/misc/rdma.h
  F:    include/uapi/linux/if_infiniband.h
  F:    include/uapi/rdma/
  F:    samples/bpf/ibumad_kern.c
@@@ -10228,6 -10315,7 +10315,7 @@@ Q:   http://patchwork.freedesktop.org/pro
  B:    https://gitlab.freedesktop.org/drm/intel/-/wikis/How-to-file-i915-bugs
  C:    irc://irc.oftc.net/intel-gfx
  T:    git git://anongit.freedesktop.org/drm-intel
+ F:    Documentation/ABI/testing/sysfs-driver-intel-i915-hwmon
  F:    Documentation/gpu/i915.rst
  F:    drivers/gpu/drm/i915/
  F:    include/drm/i915*
@@@ -10287,7 -10375,7 +10375,7 @@@ T:   git https://github.com/intel/gvt-lin
  F:    drivers/gpu/drm/i915/gvt/
  
  INTEL HID EVENT DRIVER
- M:    Alex Hung <alex.hung@canonical.com>
+ M:    Alex Hung <alexhung@gmail.com>
  L:    platform-driver-x86@vger.kernel.org
  S:    Maintained
  F:    drivers/platform/x86/intel/hid.c
@@@ -10719,6 -10807,18 +10807,18 @@@ F: drivers/iommu/dma-iommu.
  F:    drivers/iommu/iova.c
  F:    include/linux/iova.h
  
+ IOMMUFD
+ M:    Jason Gunthorpe <jgg@nvidia.com>
+ M:    Kevin Tian <kevin.tian@intel.com>
+ L:    iommu@lists.linux.dev
+ S:    Maintained
+ T:    git git://git.kernel.org/pub/scm/linux/kernel/git/jgg/iommufd.git
+ F:    Documentation/userspace-api/iommufd.rst
+ F:    drivers/iommu/iommufd/
+ F:    include/linux/iommufd.h
+ F:    include/uapi/linux/iommufd.h
+ F:    tools/testing/selftests/iommu/
  IOMMU SUBSYSTEM
  M:    Joerg Roedel <joro@8bytes.org>
  M:    Will Deacon <will@kernel.org>
@@@ -10898,6 -10998,13 +10998,13 @@@ F: drivers/isdn/Makefil
  F:    drivers/isdn/hardware/
  F:    drivers/isdn/mISDN/
  
+ ISOFS FILESYSTEM
+ M:    Jan Kara <jack@suse.cz>
+ L:    linux-fsdevel@vger.kernel.org
+ S:    Maintained
+ F:    Documentation/filesystems/isofs.rst
+ F:    fs/isofs/
  IT87 HARDWARE MONITORING DRIVER
  M:    Jean Delvare <jdelvare@suse.com>
  L:    linux-hwmon@vger.kernel.org
@@@ -10959,9 -11066,9 +11066,9 @@@ F:   drivers/hwmon/jc42.
  JFS FILESYSTEM
  M:    Dave Kleikamp <shaggy@kernel.org>
  L:    jfs-discussion@lists.sourceforge.net
- S:    Maintained
+ S:    Odd Fixes
  W:    http://jfs.sourceforge.net/
- T:    git git://github.com/kleikamp/linux-shaggy.git
+ T:    git https://github.com/kleikamp/linux-shaggy.git
  F:    Documentation/admin-guide/jfs.rst
  F:    fs/jfs/
  
@@@ -11116,6 -11223,8 +11223,8 @@@ M:   Kees Cook <keescook@chromium.org
  L:    linux-hardening@vger.kernel.org
  S:    Supported
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/kees/linux.git for-next/hardening
+ F:    Documentation/ABI/testing/sysfs-kernel-oops_count
+ F:    Documentation/ABI/testing/sysfs-kernel-warn_count
  F:    include/linux/overflow.h
  F:    include/linux/randomize_kstack.h
  F:    mm/usercopy.c
@@@ -11134,11 -11243,18 +11243,18 @@@ L:        linux-nfs@vger.kernel.or
  S:    Supported
  W:    http://nfs.sourceforge.net/
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/cel/linux.git
+ F:    fs/exportfs/
  F:    fs/lockd/
  F:    fs/nfs_common/
  F:    fs/nfsd/
  F:    include/linux/lockd/
  F:    include/linux/sunrpc/
+ F:    include/trace/events/rpcgss.h
+ F:    include/trace/events/rpcrdma.h
+ F:    include/trace/events/sunrpc.h
+ F:    include/trace/misc/fs.h
+ F:    include/trace/misc/nfs.h
+ F:    include/trace/misc/sunrpc.h
  F:    include/uapi/linux/nfsd/
  F:    include/uapi/linux/sunrpc/
  F:    net/sunrpc/
@@@ -11326,6 -11442,16 +11442,16 @@@ F: arch/x86/kvm/svm/hyperv.
  F:    arch/x86/kvm/svm/svm_onhyperv.*
  F:    arch/x86/kvm/vmx/evmcs.*
  
+ KVM X86 Xen (KVM/Xen)
+ M:    David Woodhouse <dwmw2@infradead.org>
+ M:    Paul Durrant <paul@xen.org>
+ M:    Sean Christopherson <seanjc@google.com>
+ M:    Paolo Bonzini <pbonzini@redhat.com>
+ L:    kvm@vger.kernel.org
+ S:    Supported
+ T:    git git://git.kernel.org/pub/scm/virt/kvm/kvm.git
+ F:    arch/x86/kvm/xen.*
  KERNFS
  M:    Greg Kroah-Hartman <gregkh@linuxfoundation.org>
  M:    Tejun Heo <tj@kernel.org>
@@@ -11483,6 -11609,9 +11609,9 @@@ M:   Naveen N. Rao <naveen.n.rao@linux.ib
  M:    Anil S Keshavamurthy <anil.s.keshavamurthy@intel.com>
  M:    "David S. Miller" <davem@davemloft.net>
  M:    Masami Hiramatsu <mhiramat@kernel.org>
+ L:    linux-kernel@vger.kernel.org
+ L:    linux-trace-kernel@vger.kernel.org
+ Q:    https://patchwork.kernel.org/project/linux-trace-kernel/list/
  S:    Maintained
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/trace/linux-trace.git
  F:    Documentation/trace/kprobes.rst
@@@ -11860,7 -11989,7 +11989,7 @@@ M:   Eric Piel <eric.piel@tremplin-utc.ne
  S:    Maintained
  F:    Documentation/misc-devices/lis3lv02d.rst
  F:    drivers/misc/lis3lv02d/
- F:    drivers/platform/x86/hp_accel.c
+ F:    drivers/platform/x86/hp/hp_accel.c
  
  LIST KUNIT TEST
  M:    David Gow <davidgow@google.com>
@@@ -12015,6 -12144,21 +12144,21 @@@ F: drivers/*/*loongarch
  F:    Documentation/loongarch/
  F:    Documentation/translations/zh_CN/loongarch/
  
+ LOONGSON-2 SOC SERIES GUTS DRIVER
+ M:    Yinbo Zhu <zhuyinbo@loongson.cn>
+ L:    loongarch@lists.linux.dev
+ S:    Maintained
+ F:    Documentation/devicetree/bindings/hwinfo/loongson,ls2k-chipid.yaml
+ F:    drivers/soc/loongson/loongson2_guts.c
+ LOONGSON-2 SOC SERIES PINCTRL DRIVER
+ M:    zhanghongchen <zhanghongchen@loongson.cn>
+ M:    Yinbo Zhu <zhuyinbo@loongson.cn>
+ L:    linux-gpio@vger.kernel.org
+ S:    Maintained
+ F:    Documentation/devicetree/bindings/pinctrl/loongson,ls2k-pinctrl.yaml
+ F:    drivers/pinctrl/pinctrl-loongson2.c
  LSILOGIC MPT FUSION DRIVERS (FC/SAS/SPI)
  M:    Sathya Prakash <sathya.prakash@broadcom.com>
  M:    Sreekanth Reddy <sreekanth.reddy@broadcom.com>
@@@ -12092,7 -12236,7 +12236,7 @@@ M:   Alexey Kodanev <alexey.kodanev@oracl
  L:    ltp@lists.linux.it (subscribers-only)
  S:    Maintained
  W:    http://linux-test-project.github.io/
- T:    git git://github.com/linux-test-project/ltp.git
+ T:    git https://github.com/linux-test-project/ltp.git
  
  LYNX 28G SERDES PHY DRIVER
  M:    Ioana Ciornei <ioana.ciornei@nxp.com>
@@@ -12317,7 -12461,7 +12461,7 @@@ M:   Marcin Wojtas <mw@semihalf.com
  M:    Russell King <linux@armlinux.org.uk>
  L:    netdev@vger.kernel.org
  S:    Maintained
- F:    Documentation/devicetree/bindings/net/marvell-pp2.txt
+ F:    Documentation/devicetree/bindings/net/marvell,pp2.yaml
  F:    drivers/net/ethernet/marvell/mvpp2/
  
  MARVELL MWIFIEX WIRELESS DRIVER
@@@ -12365,7 -12509,7 +12509,7 @@@ F:   Documentation/networking/device_driv
  F:    drivers/net/ethernet/marvell/octeontx2/af/
  
  MARVELL PRESTERA ETHERNET SWITCH DRIVER
- M:    Taras Chornyi <tchornyi@marvell.com>
+ M:    Taras Chornyi <taras.chornyi@plvision.eu>
  S:    Supported
  W:    https://github.com/Marvell-switching/switchdev-prestera
  F:    drivers/net/ethernet/marvell/prestera/
@@@ -12727,7 -12871,7 +12871,7 @@@ F:   Documentation/admin-guide/media/imx7
  F:    Documentation/devicetree/bindings/media/nxp,imx-mipi-csi2.yaml
  F:    Documentation/devicetree/bindings/media/nxp,imx7-csi.yaml
  F:    drivers/media/platform/nxp/imx-mipi-csis.c
- F:    drivers/staging/media/imx/imx7-media-csi.c
+ F:    drivers/media/platform/nxp/imx7-media-csi.c
  
  MEDIA DRIVERS FOR HELENE
  M:    Abylay Ospan <aospan@netup.ru>
@@@ -12924,6 -13068,7 +13068,7 @@@ M:   Felix Fietkau <nbd@nbd.name
  M:    John Crispin <john@phrozen.org>
  M:    Sean Wang <sean.wang@mediatek.com>
  M:    Mark Lee <Mark-MC.Lee@mediatek.com>
+ M:    Lorenzo Bianconi <lorenzo@kernel.org>
  L:    netdev@vger.kernel.org
  S:    Maintained
  F:    drivers/net/ethernet/mediatek/
@@@ -13295,10 -13440,20 +13440,20 @@@ F:        include/linux/memory_hotplug.
  F:    include/linux/mm.h
  F:    include/linux/mmzone.h
  F:    include/linux/pagewalk.h
- F:    include/linux/vmalloc.h
  F:    mm/
  F:    tools/testing/selftests/vm/
  
+ VMALLOC
+ M:    Andrew Morton <akpm@linux-foundation.org>
+ R:    Uladzislau Rezki <urezki@gmail.com>
+ R:    Christoph Hellwig <hch@infradead.org>
+ L:    linux-mm@kvack.org
+ S:    Maintained
+ W:    http://www.linux-mm.org
+ T:    git://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm
+ F:    include/linux/vmalloc.h
+ F:    mm/vmalloc.c
  MEMORY HOT(UN)PLUG
  M:    David Hildenbrand <david@redhat.com>
  M:    Oscar Salvador <osalvador@suse.de>
@@@ -13386,7 -13541,7 +13541,7 @@@ MESON NAND CONTROLLER DRIVER FOR AMLOGI
  M:    Liang Yang <liang.yang@amlogic.com>
  L:    linux-mtd@lists.infradead.org
  S:    Maintained
- F:    Documentation/devicetree/bindings/mtd/amlogic,meson-nand.txt
+ F:    Documentation/devicetree/bindings/mtd/amlogic,meson-nand.yaml
  F:    drivers/mtd/nand/raw/meson_*
  
  MESON VIDEO DECODER DRIVER FOR AMLOGIC SOCS
@@@ -13467,7 -13622,7 +13622,7 @@@ M:   Eugen Hristev <eugen.hristev@microch
  L:    linux-media@vger.kernel.org
  S:    Supported
  F:    Documentation/devicetree/bindings/media/microchip,csi2dc.yaml
- F:    drivers/media/platform/atmel/microchip-csi2dc.c
+ F:    drivers/media/platform/microchip/microchip-csi2dc.c
  
  MICROCHIP ECC DRIVER
  M:    Tudor Ambarus <tudor.ambarus@microchip.com>
@@@ -13494,8 -13649,10 +13649,10 @@@ L: linux-media@vger.kernel.or
  S:    Supported
  F:    Documentation/devicetree/bindings/media/atmel,isc.yaml
  F:    Documentation/devicetree/bindings/media/microchip,xisc.yaml
- F:    drivers/media/platform/atmel/atmel-isc*
- F:    drivers/media/platform/atmel/atmel-sama*-isc*
+ F:    drivers/staging/media/deprecated/atmel/atmel-isc*
+ F:    drivers/staging/media/deprecated/atmel/atmel-sama*-isc*
+ F:    drivers/media/platform/microchip/microchip-isc*
+ F:    drivers/media/platform/microchip/microchip-sama*-isc*
  F:    include/linux/atmel-isc-media.h
  
  MICROCHIP ISI DRIVER
@@@ -13678,6 -13835,15 +13835,15 @@@ F: drivers/scsi/smartpqi/smartpqi*.[ch
  F:    include/linux/cciss*.h
  F:    include/uapi/linux/cciss*.h
  
+ MICROSOFT MANA RDMA DRIVER
+ M:    Long Li <longli@microsoft.com>
+ M:    Ajay Sharma <sharmaajay@microsoft.com>
+ L:    linux-rdma@vger.kernel.org
+ S:    Supported
+ F:    drivers/infiniband/hw/mana/
+ F:    include/net/mana
+ F:    include/uapi/rdma/mana-abi.h
  MICROSOFT SURFACE AGGREGATOR TABLET-MODE SWITCH
  M:    Maximilian Luz <luzmaximilian@gmail.com>
  L:    platform-driver-x86@vger.kernel.org
@@@ -13953,6 -14119,7 +14119,7 @@@ F:   include/uapi/linux/meye.
  
  MOTORCOMM PHY DRIVER
  M:    Peter Geis <pgwipeout@gmail.com>
+ M:    Frank <Frank.Sae@motor-comm.com>
  L:    netdev@vger.kernel.org
  S:    Maintained
  F:    drivers/net/phy/motorcomm.c
@@@ -15187,6 -15354,13 +15354,13 @@@ S: Maintaine
  T:    git git://linuxtv.org/media_tree.git
  F:    drivers/media/i2c/ov08d10.c
  
+ OMNIVISION OV08X40 SENSOR DRIVER
+ M:    Jason Chen <jason.z.chen@intel.com>
+ L:    linux-media@vger.kernel.org
+ S:    Maintained
+ T:    git git://linuxtv.org/media_tree.git
+ F:    drivers/media/i2c/ov08x40.c
  OMNIVISION OV13858 SENSOR DRIVER
  M:    Sakari Ailus <sakari.ailus@linux.intel.com>
  L:    linux-media@vger.kernel.org
@@@ -15225,6 -15399,14 +15399,14 @@@ S: Maintaine
  T:    git git://linuxtv.org/media_tree.git
  F:    drivers/media/i2c/ov2740.c
  
+ OMNIVISION OV4689 SENSOR DRIVER
+ M:    Mikhail Rudenko <mike.rudenko@gmail.com>
+ L:    linux-media@vger.kernel.org
+ S:    Maintained
+ T:    git git://linuxtv.org/media_tree.git
+ F:    Documentation/devicetree/bindings/media/i2c/ovti,ov4689.yaml
+ F:    drivers/media/i2c/ov5647.c
  OMNIVISION OV5640 SENSOR DRIVER
  M:    Steve Longerbeam <slongerbeam@gmail.com>
  L:    linux-media@vger.kernel.org
@@@ -15349,6 -15531,12 +15531,12 @@@ S: Maintaine
  F:    drivers/mtd/nand/onenand/
  F:    include/linux/mtd/onenand*.h
  
+ ONEXPLAYER FAN DRIVER
+ M:    Joaquín Ignacio Aramendía <samsagax@gmail.com>
+ L:    linux-hwmon@vger.kernel.org
+ S:    Maintained
+ F:    drivers/hwmon/oxp-sensors.c
  ONION OMEGA2+ BOARD
  M:    Harvey Hunt <harveyhuntnexus@gmail.com>
  L:    linux-mips@vger.kernel.org
@@@ -16149,7 -16337,8 +16337,8 @@@ F:   include/linux/peci-cpu.
  F:    include/linux/peci.h
  
  PENSANDO ETHERNET DRIVERS
- M:    Shannon Nelson <snelson@pensando.io>
+ M:    Shannon Nelson <shannon.nelson@amd.com>
+ M:    Brett Creeley <brett.creeley@amd.com>
  M:    drivers@pensando.io
  L:    netdev@vger.kernel.org
  S:    Supported
@@@ -16201,7 -16390,7 +16390,7 @@@ F:   tools/lib/perf
  F:    tools/perf/
  
  PERFORMANCE EVENTS TOOLING ARM64
 -R:    John Garry <john.garry@huawei.com>
 +R:    John Garry <john.g.garry@oracle.com>
  R:    Will Deacon <will@kernel.org>
  R:    James Clark <james.clark@arm.com>
  R:    Mike Leach <mike.leach@linaro.org>
@@@ -16307,7 -16496,7 +16496,7 @@@ M:   Sean Wang <sean.wang@kernel.org
  L:    linux-mediatek@lists.infradead.org (moderated for non-subscribers)
  S:    Maintained
  F:    Documentation/devicetree/bindings/pinctrl/mediatek,mt65xx-pinctrl.yaml
- F:    Documentation/devicetree/bindings/pinctrl/mediatek,mt6797-pinctrl.yaml
+ F:    Documentation/devicetree/bindings/pinctrl/mediatek,mt6779-pinctrl.yaml
  F:    Documentation/devicetree/bindings/pinctrl/mediatek,mt7622-pinctrl.yaml
  F:    Documentation/devicetree/bindings/pinctrl/mediatek,mt8183-pinctrl.yaml
  F:    drivers/pinctrl/mediatek/
@@@ -16380,13 -16569,6 +16569,6 @@@ S:  Supporte
  F:    Documentation/devicetree/bindings/input/pine64,pinephone-keyboard.yaml
  F:    drivers/input/keyboard/pinephone-keyboard.c
  
- PKTCDVD DRIVER
- M:    linux-block@vger.kernel.org
- S:    Orphan
- F:    drivers/block/pktcdvd.c
- F:    include/linux/pktcdvd.h
- F:    include/uapi/linux/pktcdvd.h
  PLANTOWER PMS7003 AIR POLLUTION SENSOR DRIVER
  M:    Tomasz Duszynski <tduszyns@gmail.com>
  S:    Maintained
@@@ -16664,10 -16846,10 +16846,10 @@@ F:        net/psampl
  
  PSTORE FILESYSTEM
  M:    Kees Cook <keescook@chromium.org>
M:    Anton Vorontsov <anton@enomsg.org>
M:    Colin Cross <ccross@android.com>
- M:    Tony Luck <tony.luck@intel.com>
- S:    Maintained
R:    Tony Luck <tony.luck@intel.com>
R:    Guilherme G. Piccoli <gpiccoli@igalia.com>
+ L:    linux-hardening@vger.kernel.org
+ S:    Supported
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/kees/linux.git for-next/pstore
  F:    Documentation/admin-guide/ramoops.rst
  F:    Documentation/admin-guide/pstore-blk.rst
@@@ -16714,7 -16896,6 +16896,6 @@@ M:   Hans Verkuil <hverkuil@xs4all.nl
  L:    linux-media@vger.kernel.org
  S:    Maintained
  T:    git git://linuxtv.org/media_tree.git
- F:    Documentation/admin-guide/media/pulse8-cec.rst
  F:    drivers/media/cec/usb/pulse8/
  
  PURELIFI PLFXLC DRIVER
@@@ -16745,6 -16926,7 +16926,7 @@@ PWM IR Transmitte
  M:    Sean Young <sean@mess.org>
  L:    linux-media@vger.kernel.org
  S:    Maintained
+ F:    Documentation/devicetree/bindings/leds/irled/pwm-ir-tx.yaml
  F:    drivers/media/rc/pwm-ir-tx.c
  
  PWM SUBSYSTEM
@@@ -16809,7 -16991,7 +16991,7 @@@ M:   Srinivas Kandagatla <srinivas.kandag
  M:    Banajit Goswami <bgoswami@quicinc.com>
  L:    alsa-devel@alsa-project.org (moderated for non-subscribers)
  S:    Supported
- F:    Documentation/devicetree/bindings/soc/qcom/qcom,apr.yaml
+ F:    Documentation/devicetree/bindings/soc/qcom/qcom,apr*
  F:    Documentation/devicetree/bindings/sound/qcom,*
  F:    drivers/soc/qcom/apr.c
  F:    include/dt-bindings/sound/qcom,wcd9335.h
@@@ -17167,7 -17349,8 +17349,8 @@@ F:   Documentation/devicetree/bindings/th
  F:    drivers/thermal/qcom/
  
  QUALCOMM VENUS VIDEO ACCELERATOR DRIVER
- M:    Stanimir Varbanov <stanimir.varbanov@linaro.org>
+ M:    Stanimir Varbanov <stanimir.k.varbanov@gmail.com>
+ M:    Vikash Garodia <quic_vgarodia@quicinc.com>
  L:    linux-media@vger.kernel.org
  L:    linux-arm-msm@vger.kernel.org
  S:    Maintained
@@@ -17485,10 -17668,8 +17668,8 @@@ S:  Maintaine
  F:    drivers/net/wireless/realtek/rtw89/
  
  REDPINE WIRELESS DRIVER
- M:    Amitkumar Karwar <amitkarwar@gmail.com>
- M:    Siva Rebbagondla <siva8118@gmail.com>
  L:    linux-wireless@vger.kernel.org
- S:    Maintained
+ S:    Orphan
  F:    drivers/net/wireless/rsi/
  
  REGISTER MAP ABSTRACTION
@@@ -17786,6 -17967,13 +17967,13 @@@ F: Documentation/ABI/*/sysfs-driver-hid
  F:    drivers/hid/hid-roccat*
  F:    include/linux/hid-roccat*
  
+ ROCKCHIP CRYPTO DRIVERS
+ M:    Corentin Labbe <clabbe@baylibre.com>
+ L:    linux-crypto@vger.kernel.org
+ S:    Maintained
+ F:    Documentation/devicetree/bindings/crypto/rockchip,rk3288-crypto.yaml
+ F:    drivers/crypto/rockchip/
  ROCKCHIP I2S TDM DRIVER
  M:    Nicolas Frattaroli <frattaroli.nicolas@gmail.com>
  L:    linux-rockchip@lists.infradead.org
@@@ -18011,7 -18199,7 +18199,7 @@@ L:   linux-fbdev@vger.kernel.or
  S:    Maintained
  F:    drivers/video/fbdev/savage/
  
- S390
+ S390 ARCHITECTURE
  M:    Heiko Carstens <hca@linux.ibm.com>
  M:    Vasily Gorbik <gor@linux.ibm.com>
  M:    Alexander Gordeev <agordeev@linux.ibm.com>
@@@ -18066,6 -18254,15 +18254,15 @@@ L: netdev@vger.kernel.or
  S:    Supported
  F:    drivers/s390/net/
  
+ S390 MM
+ M:    Alexander Gordeev <agordeev@linux.ibm.com>
+ M:    Gerald Schaefer <gerald.schaefer@linux.ibm.com>
+ L:    linux-s390@vger.kernel.org
+ S:    Supported
+ T:    git git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux.git
+ F:    arch/s390/include/asm/pgtable.h
+ F:    arch/s390/mm
  S390 PCI SUBSYSTEM
  M:    Niklas Schnelle <schnelle@linux.ibm.com>
  M:    Gerald Schaefer <gerald.schaefer@linux.ibm.com>
@@@ -18493,6 -18690,7 +18690,7 @@@ K:   \bsecure_computin
  K:    \bTIF_SECCOMP\b
  
  SECURE DIGITAL HOST CONTROLLER INTERFACE (SDHCI) Broadcom BRCMSTB DRIVER
+ M:    Kamal Dasu <kdasu.kdev@gmail.com>
  M:    Al Cooper <alcooperx@gmail.com>
  R:    Broadcom internal kernel review list <bcm-kernel-feedback-list@broadcom.com>
  L:    linux-mmc@vger.kernel.org
@@@ -18503,6 -18701,7 +18701,7 @@@ SECURE DIGITAL HOST CONTROLLER INTERFAC
  M:    Adrian Hunter <adrian.hunter@intel.com>
  L:    linux-mmc@vger.kernel.org
  S:    Supported
+ F:    Documentation/devicetree/bindings/mmc/sdhci-common.yaml
  F:    drivers/mmc/host/sdhci*
  
  SECURE DIGITAL HOST CONTROLLER INTERFACE (SDHCI) MICROCHIP DRIVER
@@@ -18888,7 -19087,7 +19087,7 @@@ M:   Jason A. Donenfeld <Jason@zx2c4.com
  S:    Maintained
  F:    include/linux/siphash.h
  F:    lib/siphash.c
- F:    lib/test_siphash.c
+ F:    lib/siphash_kunit.c
  
  SIS 190 ETHERNET DRIVER
  M:    Francois Romieu <romieu@fr.zoreil.com>
@@@ -18912,7 -19111,7 +19111,7 @@@ F:   drivers/video/fbdev/sis
  F:    include/video/sisfb.h
  
  SIS I2C TOUCHSCREEN DRIVER
- M:    Mika Penttilä <mika.penttila@nextfour.com>
+ M:    Mika Penttilä <mpenttil@redhat.com>
  L:    linux-input@vger.kernel.org
  S:    Maintained
  F:    Documentation/devicetree/bindings/input/touchscreen/sis_i2c.txt
@@@ -19055,7 -19254,7 +19254,7 @@@ M:   Jassi Brar <jaswinder.singh@linaro.o
  M:    Ilias Apalodimas <ilias.apalodimas@linaro.org>
  L:    netdev@vger.kernel.org
  S:    Maintained
- F:    Documentation/devicetree/bindings/net/socionext-netsec.txt
+ F:    Documentation/devicetree/bindings/net/socionext,synquacer-netsec.yaml
  F:    drivers/net/ethernet/socionext/netsec.c
  
  SOCIONEXT (SNI) Synquacer SPI DRIVER
@@@ -19063,7 -19262,7 +19262,7 @@@ M:   Masahisa Kojima <masahisa.kojima@lin
  M:    Jassi Brar <jaswinder.singh@linaro.org>
  L:    linux-spi@vger.kernel.org
  S:    Maintained
- F:    Documentation/devicetree/bindings/spi/spi-synquacer.txt
+ F:    Documentation/devicetree/bindings/spi/socionext,synquacer-spi.yaml
  F:    drivers/spi/spi-synquacer.c
  
  SOCIONEXT SYNQUACER I2C DRIVER
@@@ -19210,7 -19409,7 +19409,7 @@@ M:   Manivannan Sadhasivam <manivannan.sa
  L:    linux-media@vger.kernel.org
  S:    Maintained
  T:    git git://linuxtv.org/media_tree.git
- F:    Documentation/devicetree/bindings/media/i2c/imx290.txt
+ F:    Documentation/devicetree/bindings/media/i2c/sony,imx290.yaml
  F:    drivers/media/i2c/imx290.c
  
  SONY IMX319 SENSOR DRIVER
@@@ -19359,6 -19558,11 +19558,11 @@@ W: https://linuxtv.or
  Q:    http://patchwork.linuxtv.org/project/linux-media/list/
  F:    drivers/media/dvb-frontends/sp2*
  
+ SPANISH DOCUMENTATION
+ M:    Carlos Bilbao <carlos.bilbao@amd.com>
+ S:    Maintained
+ F:    Documentation/translations/sp_SP/
  SPARC + UltraSPARC (sparc/sparc64)
  M:    "David S. Miller" <davem@davemloft.net>
  L:    sparclinux@vger.kernel.org
@@@ -19502,7 -19706,7 +19706,7 @@@ M:   Sylvain Petinot <sylvain.petinot@fos
  L:    linux-media@vger.kernel.org
  S:    Maintained
  T:    git git://linuxtv.org/media_tree.git
- F:    Documentation/devicetree/bindings/media/i2c/st,st-mipid02.txt
+ F:    Documentation/devicetree/bindings/media/i2c/st,st-mipid02.yaml
  F:    drivers/media/i2c/st-mipid02.c
  
  ST STM32 I2C/SMBUS DRIVER
@@@ -19525,6 -19729,16 +19729,16 @@@ S: Maintaine
  F:    Documentation/hwmon/stpddc60.rst
  F:    drivers/hwmon/pmbus/stpddc60.c
  
+ ST VGXY61 DRIVER
+ M:    Benjamin Mugnier <benjamin.mugnier@foss.st.com>
+ M:    Sylvain Petinot <sylvain.petinot@foss.st.com>
+ L:    linux-media@vger.kernel.org
+ S:    Maintained
+ T:    git git://linuxtv.org/media_tree.git
+ F:    Documentation/devicetree/bindings/media/i2c/st,st-vgxy61.yaml
+ F:    Documentation/userspace-api/media/drivers/st-vgxy61.rst
+ F:    drivers/media/i2c/st-vgxy61.c
  ST VL53L0X ToF RANGER(I2C) IIO DRIVER
  M:    Song Qiang <songqiang1304521@gmail.com>
  L:    linux-iio@vger.kernel.org
@@@ -19540,6 -19754,7 +19754,7 @@@ S:   Supporte
  F:    Documentation/process/stable-kernel-rules.rst
  
  STAGING - ATOMISP DRIVER
+ M:    Hans de Goede <hdegoede@redhat.com>
  M:    Mauro Carvalho Chehab <mchehab@kernel.org>
  R:    Sakari Ailus <sakari.ailus@linux.intel.com>
  L:    linux-media@vger.kernel.org
@@@ -19749,6 -19964,13 +19964,13 @@@ W: https://sunplus.atlassian.net/wiki/s
  F:    Documentation/devicetree/bindings/net/sunplus,sp7021-emac.yaml
  F:    drivers/net/ethernet/sunplus/
  
+ SUNPLUS MMC DRIVER
+ M:    Tony Huang <tonyhuang.sunplus@gmail.com>
+ M:    Li-hao Kuo <lhjeff911@gmail.com>
+ S:    Maintained
+ F:    Documentation/devicetree/bindings/mmc/sunplus,mmc.yaml
+ F:    drivers/mmc/host/sunplus-mmc.c
  SUNPLUS OCOTP DRIVER
  M:    Vincent Shih <vincent.sunplus@gmail.com>
  S:    Maintained
@@@ -20000,6 -20222,7 +20222,7 @@@ F:   drivers/clk/clk-sc[mp]i.
  F:    drivers/cpufreq/sc[mp]i-cpufreq.c
  F:    drivers/firmware/arm_scmi/
  F:    drivers/firmware/arm_scpi.c
+ F:    drivers/powercap/arm_scmi_powercap.c
  F:    drivers/regulator/scmi-regulator.c
  F:    drivers/reset/reset-scmi.c
  F:    include/linux/sc[mp]i_protocol.h
@@@ -20334,7 -20557,7 +20557,7 @@@ M:   Chris Zankel <chris@zankel.net
  M:    Max Filippov <jcmvbkbc@gmail.com>
  L:    linux-xtensa@linux-xtensa.org
  S:    Maintained
- T:    git git://github.com/czankel/xtensa-linux.git
+ T:    git https://github.com/jcmvbkbc/linux-xtensa.git
  F:    arch/xtensa/
  F:    drivers/irqchip/irq-xtensa-*
  
@@@ -20684,7 -20907,6 +20907,6 @@@ W:   https://wireless.wiki.kernel.org/en/
  W:    https://wireless.wiki.kernel.org/en/users/Drivers/wl1251
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/luca/wl12xx.git
  F:    drivers/net/wireless/ti/
- F:    include/linux/wl12xx.h
  
  TIMEKEEPING, CLOCKSOURCE CORE, NTP, ALARMTIMER
  M:    John Stultz <jstultz@google.com>
@@@ -20863,6 -21085,9 +21085,9 @@@ F:   drivers/hwmon/pmbus/tps546d24.
  TRACING
  M:    Steven Rostedt <rostedt@goodmis.org>
  M:    Masami Hiramatsu <mhiramat@kernel.org>
+ L:    linux-kernel@vger.kernel.org
+ L:    linux-trace-kernel@vger.kernel.org
+ Q:    https://patchwork.kernel.org/project/linux-trace-kernel/list/
  S:    Maintained
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/trace/linux-trace.git
  F:    Documentation/trace/*
@@@ -21566,7 -21791,7 +21791,7 @@@ M:   Alex Williamson <alex.williamson@red
  R:    Cornelia Huck <cohuck@redhat.com>
  L:    kvm@vger.kernel.org
  S:    Maintained
- T:    git git://github.com/awilliam/linux-vfio.git
+ T:    git https://github.com/awilliam/linux-vfio.git
  F:    Documentation/ABI/testing/sysfs-devices-vfio-dev
  F:    Documentation/driver-api/vfio.rst
  F:    drivers/vfio/
@@@ -21748,6 -21973,12 +21973,12 @@@ F: include/linux/virtio*.
  F:    include/uapi/linux/virtio_*.h
  F:    tools/virtio/
  
+ VISL VIRTUAL STATELESS DECODER DRIVER
+ M:    Daniel Almeida <daniel.almeida@collabora.com>
+ L:    linux-media@vger.kernel.org
+ S:    Supported
+ F:    drivers/media/test-drivers/visl
  IFCVF VIRTIO DATA PATH ACCELERATOR
  R:    Zhu Lingshan <lingshan.zhu@intel.com>
  F:    drivers/vdpa/ifcvf/
diff --combined tools/lib/bpf/Makefile
@@@ -255,7 -255,6 +255,7 @@@ $(INSTALL_GEN_HDRS): $(INSTALL_PFX)/%.h
                $(call do_install,$<,$(prefix)/include/bpf,644)
  
  install_headers: $(BPF_GENERATED) $(INSTALL_SRC_HDRS) $(INSTALL_GEN_HDRS)
 +      $(call QUIET_INSTALL, libbpf_headers)
  
  install_pkgconfig: $(PC_FILE)
        $(call QUIET_INSTALL, $(PC_FILE)) \
@@@ -287,3 -286,20 +287,20 @@@ tags
  
  # Delete partially updated (corrupted) files on error
  .DELETE_ON_ERROR:
+ help:
+       @echo 'libbpf common targets:'
+       @echo '  HINT: use "V=1" to enable verbose build'
+       @echo '  all     - build libraries and pkgconfig'
+       @echo '  clean   - remove all generated files'
+       @echo '  check   - check abi and version info'
+       @echo ''
+       @echo 'libbpf install targets:'
+       @echo '  HINT: use "prefix"(defaults to "/usr/local") or "DESTDIR" (defaults to "/")'
+       @echo '        to adjust target desitantion, e.g. "make prefix=/usr/local install"'
+       @echo '  install          - build and install all headers, libraries and pkgconfig'
+       @echo '  install_headers  - install only headers to include/bpf'
+       @echo ''
+       @echo 'libbpf make targets:'
+       @echo '  tags    - use ctags to make tag information for source code browsing'
+       @echo '  cscope  - use cscope to make interactive source code browsing database'
diff --combined tools/perf/tests/expr.c
@@@ -2,7 -2,6 +2,7 @@@
  #include "util/cputopo.h"
  #include "util/debug.h"
  #include "util/expr.h"
 +#include "util/hashmap.h"
  #include "util/header.h"
  #include "util/smt.h"
  #include "tests.h"
@@@ -131,12 -130,9 +131,9 @@@ static int test__expr(struct test_suit
                        expr__find_ids("FOO + BAR + BAZ + BOZO", "FOO",
                                        ctx) == 0);
        TEST_ASSERT_VAL("find ids", hashmap__size(ctx->ids) == 3);
-       TEST_ASSERT_VAL("find ids", hashmap__find(ctx->ids, "BAR",
-                                                   (void **)&val_ptr));
-       TEST_ASSERT_VAL("find ids", hashmap__find(ctx->ids, "BAZ",
-                                                   (void **)&val_ptr));
-       TEST_ASSERT_VAL("find ids", hashmap__find(ctx->ids, "BOZO",
-                                                   (void **)&val_ptr));
+       TEST_ASSERT_VAL("find ids", hashmap__find(ctx->ids, "BAR", &val_ptr));
+       TEST_ASSERT_VAL("find ids", hashmap__find(ctx->ids, "BAZ", &val_ptr));
+       TEST_ASSERT_VAL("find ids", hashmap__find(ctx->ids, "BOZO", &val_ptr));
  
        expr__ctx_clear(ctx);
        ctx->sctx.runtime = 3;
                        expr__find_ids("EVENT1\\,param\\=?@ + EVENT2\\,param\\=?@",
                                        NULL, ctx) == 0);
        TEST_ASSERT_VAL("find ids", hashmap__size(ctx->ids) == 2);
-       TEST_ASSERT_VAL("find ids", hashmap__find(ctx->ids, "EVENT1,param=3@",
-                                                   (void **)&val_ptr));
-       TEST_ASSERT_VAL("find ids", hashmap__find(ctx->ids, "EVENT2,param=3@",
-                                                   (void **)&val_ptr));
+       TEST_ASSERT_VAL("find ids", hashmap__find(ctx->ids, "EVENT1,param=3@", &val_ptr));
+       TEST_ASSERT_VAL("find ids", hashmap__find(ctx->ids, "EVENT2,param=3@", &val_ptr));
  
        expr__ctx_clear(ctx);
        TEST_ASSERT_VAL("find ids",
                        expr__find_ids("dash\\-event1 - dash\\-event2",
                                       NULL, ctx) == 0);
        TEST_ASSERT_VAL("find ids", hashmap__size(ctx->ids) == 2);
-       TEST_ASSERT_VAL("find ids", hashmap__find(ctx->ids, "dash-event1",
-                                                   (void **)&val_ptr));
-       TEST_ASSERT_VAL("find ids", hashmap__find(ctx->ids, "dash-event2",
-                                                   (void **)&val_ptr));
+       TEST_ASSERT_VAL("find ids", hashmap__find(ctx->ids, "dash-event1", &val_ptr));
+       TEST_ASSERT_VAL("find ids", hashmap__find(ctx->ids, "dash-event2", &val_ptr));
  
        /* Only EVENT1 or EVENT2 need be measured depending on the value of smt_on. */
        {
                TEST_ASSERT_VAL("find ids", hashmap__size(ctx->ids) == 1);
                TEST_ASSERT_VAL("find ids", hashmap__find(ctx->ids,
                                                          smton ? "EVENT1" : "EVENT2",
-                                                         (void **)&val_ptr));
+                                                         &val_ptr));
  
                expr__ctx_clear(ctx);
                TEST_ASSERT_VAL("find ids",
                TEST_ASSERT_VAL("find ids", hashmap__size(ctx->ids) == 1);
                TEST_ASSERT_VAL("find ids", hashmap__find(ctx->ids,
                                                          corewide ? "EVENT1" : "EVENT2",
-                                                         (void **)&val_ptr));
+                                                         &val_ptr));
  
        }
        /* The expression is a constant 1.0 without needing to evaluate EVENT1. */
                        expr__find_ids("source_count(EVENT1)",
                        NULL, ctx) == 0);
        TEST_ASSERT_VAL("source count", hashmap__size(ctx->ids) == 1);
-       TEST_ASSERT_VAL("source count", hashmap__find(ctx->ids, "EVENT1",
-                                                       (void **)&val_ptr));
+       TEST_ASSERT_VAL("source count", hashmap__find(ctx->ids, "EVENT1", &val_ptr));
  
        expr__ctx_free(ctx);
  
@@@ -12,7 -12,6 +12,7 @@@
  #include <perf/evlist.h>
  #include "util/evlist.h"
  #include "util/expr.h"
 +#include "util/hashmap.h"
  #include "util/parse-events.h"
  #include "metricgroup.h"
  #include "stat.h"
@@@ -890,7 -889,7 +890,7 @@@ static int test__parsing_callback(cons
                goto out_err;
        }
  
 -      err = evlist__alloc_stats(evlist, false);
 +      err = evlist__alloc_stats(/*config=*/NULL, evlist, /*alloc_raw=*/false);
        if (err)
                goto out_err;
        /*
@@@ -987,10 -986,10 +987,10 @@@ static int metric_parse_fake(const cha
         */
        i = 1;
        hashmap__for_each_entry(ctx->ids, cur, bkt)
-               expr__add_id_val(ctx, strdup(cur->key), i++);
+               expr__add_id_val(ctx, strdup(cur->pkey), i++);
  
        hashmap__for_each_entry(ctx->ids, cur, bkt) {
-               if (check_parse_fake(cur->key)) {
+               if (check_parse_fake(cur->pkey)) {
                        pr_err("check_parse_fake failed\n");
                        goto out;
                }
                 */
                i = 1024;
                hashmap__for_each_entry(ctx->ids, cur, bkt)
-                       expr__add_id_val(ctx, strdup(cur->key), i--);
+                       expr__add_id_val(ctx, strdup(cur->pkey), i--);
                if (expr__parse(&result, ctx, str)) {
                        pr_err("expr__parse failed\n");
                        ret = -1;
  #include "util.h"
  #include "llvm-utils.h"
  #include "c++/clang-c.h"
 -#ifdef HAVE_LIBBPF_SUPPORT
 -#include <bpf/hashmap.h>
 -#else
  #include "util/hashmap.h"
 -#endif
  #include "asm/bug.h"
  
  #include <internal/xyarray.h>
@@@ -314,7 -318,7 +314,7 @@@ static void bpf_program_hash_free(void
                return;
  
        hashmap__for_each_entry(bpf_program_hash, cur, bkt)
-               clear_prog_priv(cur->key, cur->value);
+               clear_prog_priv(cur->pkey, cur->pvalue);
  
        hashmap__free(bpf_program_hash);
        bpf_program_hash = NULL;
@@@ -335,13 -339,12 +335,12 @@@ void bpf__clear(void
        bpf_map_hash_free();
  }
  
- static size_t ptr_hash(const void *__key, void *ctx __maybe_unused)
+ static size_t ptr_hash(const long __key, void *ctx __maybe_unused)
  {
-       return (size_t) __key;
+       return __key;
  }
  
- static bool ptr_equal(const void *key1, const void *key2,
-                         void *ctx __maybe_unused)
+ static bool ptr_equal(long key1, long key2, void *ctx __maybe_unused)
  {
        return key1 == key2;
  }
@@@ -1181,7 -1184,7 +1180,7 @@@ static void bpf_map_hash_free(void
                return;
  
        hashmap__for_each_entry(bpf_map_hash, cur, bkt)
-               bpf_map_priv__clear(cur->key, cur->value);
+               bpf_map_priv__clear(cur->pkey, cur->pvalue);
  
        hashmap__free(bpf_map_hash);
        bpf_map_hash = NULL;
diff --combined tools/perf/util/evsel.c
@@@ -12,6 -12,7 +12,6 @@@
  #include <linux/bitops.h>
  #include <api/fs/fs.h>
  #include <api/fs/tracing_path.h>
 -#include <traceevent/event-parse.h>
  #include <linux/hw_breakpoint.h>
  #include <linux/perf_event.h>
  #include <linux/compiler.h>
  #include "string2.h"
  #include "memswap.h"
  #include "util.h"
 -#ifdef HAVE_LIBBPF_SUPPORT
 -#include <bpf/hashmap.h>
 -#else
  #include "util/hashmap.h"
 -#endif
  #include "pmu-hybrid.h"
  #include "off_cpu.h"
  #include "../perf-sys.h"
  #include "util/parse-branch-options.h"
  #include <internal/xyarray.h>
  #include <internal/lib.h>
 +#include <internal/threadmap.h>
  
  #include <linux/ctype.h>
  
 +#ifdef HAVE_LIBTRACEEVENT
 +#include <traceevent/event-parse.h>
 +#endif
 +
  struct perf_missing_features perf_missing_features;
  
  static clockid_t clockid;
@@@ -442,9 -442,7 +442,9 @@@ struct evsel *evsel__clone(struct evse
                        goto out_err;
        }
        evsel->cgrp = cgroup__get(orig->cgrp);
 +#ifdef HAVE_LIBTRACEEVENT
        evsel->tp_format = orig->tp_format;
 +#endif
        evsel->handler = orig->handler;
        evsel->core.leader = orig->core.leader;
  
        evsel->collect_stat = orig->collect_stat;
        evsel->weak_group = orig->weak_group;
        evsel->use_config_name = orig->use_config_name;
 +      evsel->pmu = orig->pmu;
  
        if (evsel__copy_config_terms(evsel, orig) < 0)
                goto out_err;
@@@ -484,7 -481,6 +484,7 @@@ out_err
  /*
   * Returns pointer with encoded error via <linux/err.h> interface.
   */
 +#ifdef HAVE_LIBTRACEEVENT
  struct evsel *evsel__newtp_idx(const char *sys, const char *name, int idx)
  {
        struct evsel *evsel = zalloc(perf_evsel__object.size);
@@@ -522,7 -518,6 +522,7 @@@ out_free
  out_err:
        return ERR_PTR(err);
  }
 +#endif
  
  const char *const evsel__hw_names[PERF_COUNT_HW_MAX] = {
        "cycles",
@@@ -1530,8 -1525,13 +1530,8 @@@ void evsel__compute_deltas(struct evse
        if (!evsel->prev_raw_counts)
                return;
  
 -      if (cpu_map_idx == -1) {
 -              tmp = evsel->prev_raw_counts->aggr;
 -              evsel->prev_raw_counts->aggr = *count;
 -      } else {
 -              tmp = *perf_counts(evsel->prev_raw_counts, cpu_map_idx, thread);
 -              *perf_counts(evsel->prev_raw_counts, cpu_map_idx, thread) = *count;
 -      }
 +      tmp = *perf_counts(evsel->prev_raw_counts, cpu_map_idx, thread);
 +      *perf_counts(evsel->prev_raw_counts, cpu_map_idx, thread) = *count;
  
        count->val = count->val - tmp.val;
        count->ena = count->ena - tmp.ena;
@@@ -1966,16 -1966,17 +1966,16 @@@ bool evsel__detect_missing_features(str
                perf_missing_features.mmap2 = true;
                pr_debug2_peo("switching off mmap2\n");
                return true;
 -      } else if ((evsel->core.attr.exclude_guest || evsel->core.attr.exclude_host) &&
 -                 (evsel->pmu == NULL || evsel->pmu->missing_features.exclude_guest)) {
 -              if (evsel->pmu == NULL) {
 +      } else if (evsel->core.attr.exclude_guest || evsel->core.attr.exclude_host) {
 +              if (evsel->pmu == NULL)
                        evsel->pmu = evsel__find_pmu(evsel);
 -                      if (evsel->pmu)
 -                              evsel->pmu->missing_features.exclude_guest = true;
 -                      else {
 -                              /* we cannot find PMU, disable attrs now */
 -                              evsel->core.attr.exclude_host = false;
 -                              evsel->core.attr.exclude_guest = false;
 -                      }
 +
 +              if (evsel->pmu)
 +                      evsel->pmu->missing_features.exclude_guest = true;
 +              else {
 +                      /* we cannot find PMU, disable attrs now */
 +                      evsel->core.attr.exclude_host = false;
 +                      evsel->core.attr.exclude_guest = false;
                }
  
                if (evsel->exclude_GH) {
@@@ -2327,8 -2328,11 +2327,8 @@@ u64 evsel__bitfield_swap_branch_flags(u
         * as it has variable bit-field sizes. Instead the
         * macro takes the bit-field position/size,
         * swaps it based on the host endianness.
 -       *
 -       * tep_is_bigendian() is used here instead of
 -       * bigendian() to avoid python test fails.
         */
 -      if (tep_is_bigendian()) {
 +      if (host_is_bigendian()) {
                new_val = bitfield_swap(value, 0, 1);
                new_val |= bitfield_swap(value, 1, 1);
                new_val |= bitfield_swap(value, 2, 1);
@@@ -2765,7 -2769,6 +2765,7 @@@ u16 evsel__id_hdr_size(struct evsel *ev
        return size;
  }
  
 +#ifdef HAVE_LIBTRACEEVENT
  struct tep_format_field *evsel__field(struct evsel *evsel, const char *name)
  {
        return tep_find_field(evsel->tp_format, name);
@@@ -2784,10 -2787,8 +2784,10 @@@ void *evsel__rawptr(struct evsel *evsel
        if (field->flags & TEP_FIELD_IS_DYNAMIC) {
                offset = *(int *)(sample->raw_data + field->offset);
                offset &= 0xffff;
 +#ifdef HAVE_LIBTRACEEVENT_TEP_FIELD_IS_RELATIVE
                if (field->flags & TEP_FIELD_IS_RELATIVE)
                        offset += field->offset + field->size;
 +#endif
        }
  
        return sample->raw_data + offset;
@@@ -2841,7 -2842,6 +2841,7 @@@ u64 evsel__intval(struct evsel *evsel, 
  
        return field ? format_field__intval(field, sample, evsel->needs_swap) : 0;
  }
 +#endif
  
  bool evsel__fallback(struct evsel *evsel, int err, char *msg, size_t msgsize)
  {
@@@ -3123,13 -3123,13 +3123,13 @@@ void evsel__zero_per_pkg(struct evsel *
  
        if (evsel->per_pkg_mask) {
                hashmap__for_each_entry(evsel->per_pkg_mask, cur, bkt)
-                       free((char *)cur->key);
+                       free((void *)cur->pkey);
  
                hashmap__clear(evsel->per_pkg_mask);
        }
  }
  
 -bool evsel__is_hybrid(struct evsel *evsel)
 +bool evsel__is_hybrid(const struct evsel *evsel)
  {
        return evsel->pmu_name && perf_pmu__is_hybrid(evsel->pmu_name);
  }
diff --combined tools/perf/util/expr.c
@@@ -11,7 -11,6 +11,7 @@@
  #include "expr.h"
  #include "expr-bison.h"
  #include "expr-flex.h"
 +#include "util/hashmap.h"
  #include "smt.h"
  #include "tsc.h"
  #include <linux/err.h>
@@@ -47,7 -46,7 +47,7 @@@ struct expr_id_data 
        } kind;
  };
  
- static size_t key_hash(const void *key, void *ctx __maybe_unused)
+ static size_t key_hash(long key, void *ctx __maybe_unused)
  {
        const char *str = (const char *)key;
        size_t hash = 0;
@@@ -60,8 -59,7 +60,7 @@@
        return hash;
  }
  
- static bool key_equal(const void *key1, const void *key2,
-                   void *ctx __maybe_unused)
+ static bool key_equal(long key1, long key2, void *ctx __maybe_unused)
  {
        return !strcmp((const char *)key1, (const char *)key2);
  }
@@@ -85,8 -83,8 +84,8 @@@ void ids__free(struct hashmap *ids
                return;
  
        hashmap__for_each_entry(ids, cur, bkt) {
-               free((char *)cur->key);
-               free(cur->value);
+               free((void *)cur->pkey);
+               free((void *)cur->pvalue);
        }
  
        hashmap__free(ids);
@@@ -98,8 -96,7 +97,7 @@@ int ids__insert(struct hashmap *ids, co
        char *old_key = NULL;
        int ret;
  
-       ret = hashmap__set(ids, id, data_ptr,
-                          (const void **)&old_key, (void **)&old_data);
+       ret = hashmap__set(ids, id, data_ptr, &old_key, &old_data);
        if (ret)
                free(data_ptr);
        free(old_key);
@@@ -128,8 -125,7 +126,7 @@@ struct hashmap *ids__union(struct hashm
                ids2 = tmp;
        }
        hashmap__for_each_entry(ids2, cur, bkt) {
-               ret = hashmap__set(ids1, cur->key, cur->value,
-                               (const void **)&old_key, (void **)&old_data);
+               ret = hashmap__set(ids1, cur->key, cur->value, &old_key, &old_data);
                free(old_key);
                free(old_data);
  
@@@ -170,8 -166,7 +167,7 @@@ int expr__add_id_val_source_count(struc
        data_ptr->val.source_count = source_count;
        data_ptr->kind = EXPR_ID_DATA__VALUE;
  
-       ret = hashmap__set(ctx->ids, id, data_ptr,
-                          (const void **)&old_key, (void **)&old_data);
+       ret = hashmap__set(ctx->ids, id, data_ptr, &old_key, &old_data);
        if (ret)
                free(data_ptr);
        free(old_key);
@@@ -206,8 -201,7 +202,7 @@@ int expr__add_ref(struct expr_parse_ct
        data_ptr->ref.metric_expr = ref->metric_expr;
        data_ptr->kind = EXPR_ID_DATA__REF;
  
-       ret = hashmap__set(ctx->ids, name, data_ptr,
-                          (const void **)&old_key, (void **)&old_data);
+       ret = hashmap__set(ctx->ids, name, data_ptr, &old_key, &old_data);
        if (ret)
                free(data_ptr);
  
  int expr__get_id(struct expr_parse_ctx *ctx, const char *id,
                 struct expr_id_data **data)
  {
-       return hashmap__find(ctx->ids, id, (void **)data) ? 0 : -1;
+       return hashmap__find(ctx->ids, id, data) ? 0 : -1;
  }
  
  bool expr__subset_of_ids(struct expr_parse_ctx *haystack,
        struct expr_id_data *data;
  
        hashmap__for_each_entry(needles->ids, cur, bkt) {
-               if (expr__get_id(haystack, cur->key, &data))
+               if (expr__get_id(haystack, cur->pkey, &data))
                        return false;
        }
        return true;
@@@ -283,8 -277,7 +278,7 @@@ void expr__del_id(struct expr_parse_ct
        struct expr_id_data *old_val = NULL;
        char *old_key = NULL;
  
-       hashmap__delete(ctx->ids, id,
-                       (const void **)&old_key, (void **)&old_val);
+       hashmap__delete(ctx->ids, id, &old_key, &old_val);
        free(old_key);
        free(old_val);
  }
@@@ -315,8 -308,8 +309,8 @@@ void expr__ctx_clear(struct expr_parse_
        size_t bkt;
  
        hashmap__for_each_entry(ctx->ids, cur, bkt) {
-               free((char *)cur->key);
-               free(cur->value);
+               free((void *)cur->pkey);
+               free(cur->pvalue);
        }
        hashmap__clear(ctx->ids);
  }
@@@ -331,8 -324,8 +325,8 @@@ void expr__ctx_free(struct expr_parse_c
  
        free(ctx->sctx.user_requested_cpu_list);
        hashmap__for_each_entry(ctx->ids, cur, bkt) {
-               free((char *)cur->key);
-               free(cur->value);
+               free((void *)cur->pkey);
+               free(cur->pvalue);
        }
        hashmap__free(ctx->ids);
        free(ctx);
@@@ -12,7 -12,6 +12,7 @@@
  #include "strbuf.h"
  #include "pmu.h"
  #include "pmu-hybrid.h"
 +#include "print-events.h"
  #include "expr.h"
  #include "rblist.h"
  #include <string.h>
@@@ -29,7 -28,6 +29,7 @@@
  #include "util.h"
  #include <asm/bug.h>
  #include "cgroup.h"
 +#include "util/hashmap.h"
  
  struct metric_event *metricgroup__lookup(struct rblist *metric_events,
                                         struct evsel *evsel,
@@@ -290,7 -288,7 +290,7 @@@ static int setup_metric_events(struct h
                 * combined or shared groups, this metric may not care
                 * about this event.
                 */
-               if (hashmap__find(ids, metric_id, (void **)&val_ptr)) {
+               if (hashmap__find(ids, metric_id, &val_ptr)) {
                        metric_events[matched_events++] = ev;
  
                        if (matched_events >= ids_size)
@@@ -354,65 -352,51 +354,65 @@@ static bool match_pe_metric(const struc
               match_metric(pe->metric_name, metric);
  }
  
 +/** struct mep - RB-tree node for building printing information. */
  struct mep {
 +      /** nd - RB-tree element. */
        struct rb_node nd;
 -      const char *name;
 -      struct strlist *metrics;
 +      /** @metric_group: Owned metric group name, separated others with ';'. */
 +      char *metric_group;
 +      const char *metric_name;
 +      const char *metric_desc;
 +      const char *metric_long_desc;
 +      const char *metric_expr;
 +      const char *metric_unit;
  };
  
  static int mep_cmp(struct rb_node *rb_node, const void *entry)
  {
        struct mep *a = container_of(rb_node, struct mep, nd);
        struct mep *b = (struct mep *)entry;
 +      int ret;
 +
 +      ret = strcmp(a->metric_group, b->metric_group);
 +      if (ret)
 +              return ret;
  
 -      return strcmp(a->name, b->name);
 +      return strcmp(a->metric_name, b->metric_name);
  }
  
 -static struct rb_node *mep_new(struct rblist *rl __maybe_unused,
 -                                      const void *entry)
 +static struct rb_node *mep_new(struct rblist *rl __maybe_unused, const void *entry)
  {
        struct mep *me = malloc(sizeof(struct mep));
  
        if (!me)
                return NULL;
 +
        memcpy(me, entry, sizeof(struct mep));
 -      me->name = strdup(me->name);
 -      if (!me->name)
 -              goto out_me;
 -      me->metrics = strlist__new(NULL, NULL);
 -      if (!me->metrics)
 -              goto out_name;
        return &me->nd;
 -out_name:
 -      zfree(&me->name);
 -out_me:
 +}
 +
 +static void mep_delete(struct rblist *rl __maybe_unused,
 +                     struct rb_node *nd)
 +{
 +      struct mep *me = container_of(nd, struct mep, nd);
 +
 +      zfree(&me->metric_group);
        free(me);
 -      return NULL;
  }
  
 -static struct mep *mep_lookup(struct rblist *groups, const char *name)
 +static struct mep *mep_lookup(struct rblist *groups, const char *metric_group,
 +                            const char *metric_name)
  {
        struct rb_node *nd;
        struct mep me = {
 -              .name = name
 +              .metric_group = strdup(metric_group),
 +              .metric_name = metric_name,
        };
        nd = rblist__find(groups, &me);
 -      if (nd)
 +      if (nd) {
 +              free(me.metric_group);
                return container_of(nd, struct mep, nd);
 +      }
        rblist__add_node(groups, &me);
        nd = rblist__find(groups, &me);
        if (nd)
        return NULL;
  }
  
 -static void mep_delete(struct rblist *rl __maybe_unused,
 -                     struct rb_node *nd)
 -{
 -      struct mep *me = container_of(nd, struct mep, nd);
 -
 -      strlist__delete(me->metrics);
 -      zfree(&me->name);
 -      free(me);
 -}
 -
 -static void metricgroup__print_strlist(struct strlist *metrics, bool raw)
 -{
 -      struct str_node *sn;
 -      int n = 0;
 -
 -      strlist__for_each_entry (sn, metrics) {
 -              if (raw)
 -                      printf("%s%s", n > 0 ? " " : "", sn->s);
 -              else
 -                      printf("  %s\n", sn->s);
 -              n++;
 -      }
 -      if (raw)
 -              putchar('\n');
 -}
 -
 -static int metricgroup__print_pmu_event(const struct pmu_event *pe,
 -                                      bool metricgroups, char *filter,
 -                                      bool raw, bool details,
 -                                      struct rblist *groups,
 -                                      struct strlist *metriclist)
 +static int metricgroup__add_to_mep_groups(const struct pmu_event *pe,
 +                                      struct rblist *groups)
  {
        const char *g;
        char *omg, *mg;
  
 -      g = pe->metric_group;
 -      if (!g && pe->metric_name) {
 -              if (pe->name)
 -                      return 0;
 -              g = "No_group";
 -      }
 -
 -      if (!g)
 -              return 0;
 -
 -      mg = strdup(g);
 -
 +      mg = strdup(pe->metric_group ?: "No_group");
        if (!mg)
                return -ENOMEM;
        omg = mg;
        while ((g = strsep(&mg, ";")) != NULL) {
                struct mep *me;
 -              char *s;
  
                g = skip_spaces(g);
 -              if (*g == 0)
 -                      g = "No_group";
 -              if (filter && !strstr(g, filter))
 -                      continue;
 -              if (raw)
 -                      s = (char *)pe->metric_name;
 -              else {
 -                      if (asprintf(&s, "%s\n%*s%s]",
 -                                   pe->metric_name, 8, "[", pe->desc) < 0)
 -                              return -1;
 -                      if (details) {
 -                              if (asprintf(&s, "%s\n%*s%s]",
 -                                           s, 8, "[", pe->metric_expr) < 0)
 -                                      return -1;
 -                      }
 -              }
 -
 -              if (!s)
 -                      continue;
 +              if (strlen(g))
 +                      me = mep_lookup(groups, g, pe->metric_name);
 +              else
 +                      me = mep_lookup(groups, "No_group", pe->metric_name);
  
 -              if (!metricgroups) {
 -                      strlist__add(metriclist, s);
 -              } else {
 -                      me = mep_lookup(groups, g);
 -                      if (!me)
 -                              continue;
 -                      strlist__add(me->metrics, s);
 +              if (me) {
 +                      me->metric_desc = pe->desc;
 +                      me->metric_long_desc = pe->long_desc;
 +                      me->metric_expr = pe->metric_expr;
 +                      me->metric_unit = pe->unit;
                }
 -
 -              if (!raw)
 -                      free(s);
        }
        free(omg);
  
        return 0;
  }
  
 -struct metricgroup_print_sys_idata {
 -      struct strlist *metriclist;
 -      char *filter;
 -      struct rblist *groups;
 -      bool metricgroups;
 -      bool raw;
 -      bool details;
 -};
 -
  struct metricgroup_iter_data {
        pmu_event_iter_fn fn;
        void *data;
@@@ -473,26 -527,60 +473,26 @@@ static int metricgroup__sys_event_iter(
  
                return d->fn(pe, table, d->data);
        }
 -
        return 0;
  }
  
 -static int metricgroup__print_sys_event_iter(const struct pmu_event *pe,
 -                                           const struct pmu_events_table *table __maybe_unused,
 -                                           void *data)
 -{
 -      struct metricgroup_print_sys_idata *d = data;
 -
 -      return metricgroup__print_pmu_event(pe, d->metricgroups, d->filter, d->raw,
 -                                   d->details, d->groups, d->metriclist);
 -}
 -
 -struct metricgroup_print_data {
 -      const char *pmu_name;
 -      struct strlist *metriclist;
 -      char *filter;
 -      struct rblist *groups;
 -      bool metricgroups;
 -      bool raw;
 -      bool details;
 -};
 -
 -static int metricgroup__print_callback(const struct pmu_event *pe,
 -                                     const struct pmu_events_table *table __maybe_unused,
 -                                     void *vdata)
 +static int metricgroup__add_to_mep_groups_callback(const struct pmu_event *pe,
 +                                              const struct pmu_events_table *table __maybe_unused,
 +                                              void *vdata)
  {
 -      struct metricgroup_print_data *data = vdata;
 -
 -      if (!pe->metric_expr)
 -              return 0;
 +      struct rblist *groups = vdata;
  
 -      if (data->pmu_name && perf_pmu__is_hybrid(pe->pmu) && strcmp(data->pmu_name, pe->pmu))
 +      if (!pe->metric_name)
                return 0;
  
 -      return metricgroup__print_pmu_event(pe, data->metricgroups, data->filter,
 -                                          data->raw, data->details, data->groups,
 -                                          data->metriclist);
 +      return metricgroup__add_to_mep_groups(pe, groups);
  }
  
 -void metricgroup__print(bool metrics, bool metricgroups, char *filter,
 -                      bool raw, bool details, const char *pmu_name)
 +void metricgroup__print(const struct print_callbacks *print_cb, void *print_state)
  {
        struct rblist groups;
 -      struct rb_node *node, *next;
 -      struct strlist *metriclist = NULL;
        const struct pmu_events_table *table;
 -
 -      if (!metricgroups) {
 -              metriclist = strlist__new(NULL, NULL);
 -              if (!metriclist)
 -                      return;
 -      }
 +      struct rb_node *node, *next;
  
        rblist__init(&groups);
        groups.node_new = mep_new;
        groups.node_delete = mep_delete;
        table = pmu_events_table__find();
        if (table) {
 -              struct metricgroup_print_data data = {
 -                      .pmu_name = pmu_name,
 -                      .metriclist = metriclist,
 -                      .metricgroups = metricgroups,
 -                      .filter = filter,
 -                      .raw = raw,
 -                      .details = details,
 -                      .groups = &groups,
 -              };
 -
                pmu_events_table_for_each_event(table,
 -                                              metricgroup__print_callback,
 -                                              &data);
 +                                              metricgroup__add_to_mep_groups_callback,
 +                                              &groups);
        }
        {
                struct metricgroup_iter_data data = {
 -                      .fn = metricgroup__print_sys_event_iter,
 -                      .data = (void *) &(struct metricgroup_print_sys_idata){
 -                              .metriclist = metriclist,
 -                              .metricgroups = metricgroups,
 -                              .filter = filter,
 -                              .raw = raw,
 -                              .details = details,
 -                              .groups = &groups,
 -                      },
 +                      .fn = metricgroup__add_to_mep_groups_callback,
 +                      .data = &groups,
                };
 -
                pmu_for_each_sys_event(metricgroup__sys_event_iter, &data);
        }
  
 -      if (!filter || !rblist__empty(&groups)) {
 -              if (metricgroups && !raw)
 -                      printf("\nMetric Groups:\n\n");
 -              else if (metrics && !raw)
 -                      printf("\nMetrics:\n\n");
 -      }
 -
        for (node = rb_first_cached(&groups.entries); node; node = next) {
                struct mep *me = container_of(node, struct mep, nd);
  
 -              if (metricgroups)
 -                      printf("%s%s%s", me->name, metrics && !raw ? ":" : "", raw ? " " : "\n");
 -              if (metrics)
 -                      metricgroup__print_strlist(me->metrics, raw);
 +              print_cb->print_metric(print_state,
 +                              me->metric_group,
 +                              me->metric_name,
 +                              me->metric_desc,
 +                              me->metric_long_desc,
 +                              me->metric_expr,
 +                              me->metric_unit);
                next = rb_next(node);
                rblist__remove_node(&groups, node);
        }
 -      if (!metricgroups)
 -              metricgroup__print_strlist(metriclist, raw);
 -      strlist__delete(metriclist);
  }
  
  static const char *code_characters = ",-=@";
@@@ -651,7 -764,7 +651,7 @@@ static int metricgroup__build_event_str
  #define RETURN_IF_NON_ZERO(x) do { if (x) return x; } while (0)
  
        hashmap__for_each_entry(ctx->ids, cur, bkt) {
-               const char *sep, *rsep, *id = cur->key;
+               const char *sep, *rsep, *id = cur->pkey;
                enum perf_tool_event ev;
  
                pr_debug("found event %s\n", id);
@@@ -832,14 -945,14 +832,14 @@@ static int resolve_metric(struct list_h
        hashmap__for_each_entry(root_metric->pctx->ids, cur, bkt) {
                struct pmu_event pe;
  
-               if (metricgroup__find_metric(cur->key, table, &pe)) {
+               if (metricgroup__find_metric(cur->pkey, table, &pe)) {
                        pending = realloc(pending,
                                        (pending_cnt + 1) * sizeof(struct to_resolve));
                        if (!pending)
                                return -ENOMEM;
  
                        memcpy(&pending[pending_cnt].pe, &pe, sizeof(pe));
-                       pending[pending_cnt].key = cur->key;
+                       pending[pending_cnt].key = cur->pkey;
                        pending_cnt++;
                }
        }
@@@ -1320,7 -1433,7 +1320,7 @@@ static int build_combined_expr_ctx(cons
        list_for_each_entry(m, metric_list, nd) {
                if (m->has_constraint && !m->modifier) {
                        hashmap__for_each_entry(m->pctx->ids, cur, bkt) {
-                               dup = strdup(cur->key);
+                               dup = strdup(cur->pkey);
                                if (!dup) {
                                        ret = -ENOMEM;
                                        goto err_out;
@@@ -14,7 -14,6 +14,7 @@@
  #include "units.h"
  #include <linux/zalloc.h>
  #include "iostat.h"
 +#include "util/hashmap.h"
  
  /*
   * AGGR_GLOBAL: Use CPU 0
@@@ -399,7 -398,7 +399,7 @@@ void perf_stat__collect_metric_expr(str
  
                i = 0;
                hashmap__for_each_entry(ctx->ids, cur, bkt) {
-                       const char *metric_name = (const char *)cur->key;
+                       const char *metric_name = cur->pkey;
  
                        found = false;
                        if (leader) {
diff --combined tools/perf/util/stat.c
  #include "evlist.h"
  #include "evsel.h"
  #include "thread_map.h"
 -#ifdef HAVE_LIBBPF_SUPPORT
 -#include <bpf/hashmap.h>
 -#else
  #include "util/hashmap.h"
 -#endif
  #include <linux/zalloc.h>
  
  void update_stats(struct stats *stats, u64 val)
@@@ -126,65 -130,18 +126,65 @@@ static void perf_stat_evsel_id_init(str
        }
  }
  
 +static void evsel__reset_aggr_stats(struct evsel *evsel)
 +{
 +      struct perf_stat_evsel *ps = evsel->stats;
 +      struct perf_stat_aggr *aggr = ps->aggr;
 +
 +      if (aggr)
 +              memset(aggr, 0, sizeof(*aggr) * ps->nr_aggr);
 +}
 +
  static void evsel__reset_stat_priv(struct evsel *evsel)
  {
        struct perf_stat_evsel *ps = evsel->stats;
  
        init_stats(&ps->res_stats);
 +      evsel__reset_aggr_stats(evsel);
 +}
 +
 +static int evsel__alloc_aggr_stats(struct evsel *evsel, int nr_aggr)
 +{
 +      struct perf_stat_evsel *ps = evsel->stats;
 +
 +      if (ps == NULL)
 +              return 0;
 +
 +      ps->nr_aggr = nr_aggr;
 +      ps->aggr = calloc(nr_aggr, sizeof(*ps->aggr));
 +      if (ps->aggr == NULL)
 +              return -ENOMEM;
 +
 +      return 0;
 +}
 +
 +int evlist__alloc_aggr_stats(struct evlist *evlist, int nr_aggr)
 +{
 +      struct evsel *evsel;
 +
 +      evlist__for_each_entry(evlist, evsel) {
 +              if (evsel__alloc_aggr_stats(evsel, nr_aggr) < 0)
 +                      return -1;
 +      }
 +      return 0;
  }
  
 -static int evsel__alloc_stat_priv(struct evsel *evsel)
 +static int evsel__alloc_stat_priv(struct evsel *evsel, int nr_aggr)
  {
 -      evsel->stats = zalloc(sizeof(struct perf_stat_evsel));
 -      if (evsel->stats == NULL)
 +      struct perf_stat_evsel *ps;
 +
 +      ps = zalloc(sizeof(*ps));
 +      if (ps == NULL)
                return -ENOMEM;
 +
 +      evsel->stats = ps;
 +
 +      if (nr_aggr && evsel__alloc_aggr_stats(evsel, nr_aggr) < 0) {
 +              evsel->stats = NULL;
 +              free(ps);
 +              return -ENOMEM;
 +      }
 +
        perf_stat_evsel_id_init(evsel);
        evsel__reset_stat_priv(evsel);
        return 0;
@@@ -194,10 -151,8 +194,10 @@@ static void evsel__free_stat_priv(struc
  {
        struct perf_stat_evsel *ps = evsel->stats;
  
 -      if (ps)
 +      if (ps) {
 +              zfree(&ps->aggr);
                zfree(&ps->group_data);
 +      }
        zfree(&evsel->stats);
  }
  
@@@ -226,9 -181,9 +226,9 @@@ static void evsel__reset_prev_raw_count
                perf_counts__reset(evsel->prev_raw_counts);
  }
  
 -static int evsel__alloc_stats(struct evsel *evsel, bool alloc_raw)
 +static int evsel__alloc_stats(struct evsel *evsel, int nr_aggr, bool alloc_raw)
  {
 -      if (evsel__alloc_stat_priv(evsel) < 0 ||
 +      if (evsel__alloc_stat_priv(evsel, nr_aggr) < 0 ||
            evsel__alloc_counts(evsel) < 0 ||
            (alloc_raw && evsel__alloc_prev_raw_counts(evsel) < 0))
                return -ENOMEM;
        return 0;
  }
  
 -int evlist__alloc_stats(struct evlist *evlist, bool alloc_raw)
 +int evlist__alloc_stats(struct perf_stat_config *config,
 +                      struct evlist *evlist, bool alloc_raw)
  {
        struct evsel *evsel;
 +      int nr_aggr = 0;
 +
 +      if (config && config->aggr_map)
 +              nr_aggr = config->aggr_map->nr;
  
        evlist__for_each_entry(evlist, evsel) {
 -              if (evsel__alloc_stats(evsel, alloc_raw))
 +              if (evsel__alloc_stats(evsel, nr_aggr, alloc_raw))
                        goto out_free;
        }
  
@@@ -278,14 -228,6 +278,14 @@@ void evlist__reset_stats(struct evlist 
        }
  }
  
 +void evlist__reset_aggr_stats(struct evlist *evlist)
 +{
 +      struct evsel *evsel;
 +
 +      evlist__for_each_entry(evlist, evsel)
 +              evsel__reset_aggr_stats(evsel);
 +}
 +
  void evlist__reset_prev_raw_counts(struct evlist *evlist)
  {
        struct evsel *evsel;
@@@ -304,6 -246,8 +304,6 @@@ static void evsel__copy_prev_raw_counts
                                *perf_counts(evsel->prev_raw_counts, idx, thread);
                }
        }
 -
 -      evsel->counts->aggr = evsel->prev_raw_counts->aggr;
  }
  
  void evlist__copy_prev_raw_counts(struct evlist *evlist)
                evsel__copy_prev_raw_counts(evsel);
  }
  
- static size_t pkg_id_hash(const void *__key, void *ctx __maybe_unused)
 -void evlist__save_aggr_prev_raw_counts(struct evlist *evlist)
 -{
 -      struct evsel *evsel;
 -
 -      /*
 -       * To collect the overall statistics for interval mode,
 -       * we copy the counts from evsel->prev_raw_counts to
 -       * evsel->counts. The perf_stat_process_counter creates
 -       * aggr values from per cpu values, but the per cpu values
 -       * are 0 for AGGR_GLOBAL. So we use a trick that saves the
 -       * previous aggr value to the first member of perf_counts,
 -       * then aggr calculation in process_counter_values can work
 -       * correctly.
 -       */
 -      evlist__for_each_entry(evlist, evsel) {
 -              *perf_counts(evsel->prev_raw_counts, 0, 0) =
 -                      evsel->prev_raw_counts->aggr;
 -      }
 -}
 -
+ static size_t pkg_id_hash(long __key, void *ctx __maybe_unused)
  {
        uint64_t *key = (uint64_t *) __key;
  
        return *key & 0xffffffff;
  }
  
- static bool pkg_id_equal(const void *__key1, const void *__key2,
-                        void *ctx __maybe_unused)
+ static bool pkg_id_equal(long __key1, long __key2, void *ctx __maybe_unused)
  {
        uint64_t *key1 = (uint64_t *) __key1;
        uint64_t *key2 = (uint64_t *) __key2;
@@@ -383,40 -346,21 +382,40 @@@ static int check_per_pkg(struct evsel *
                return -ENOMEM;
  
        *key = (uint64_t)d << 32 | s;
-       if (hashmap__find(mask, (void *)key, NULL)) {
+       if (hashmap__find(mask, key, NULL)) {
                *skip = true;
                free(key);
        } else
-               ret = hashmap__add(mask, (void *)key, (void *)1);
+               ret = hashmap__add(mask, key, 1);
  
        return ret;
  }
  
 +static bool evsel__count_has_error(struct evsel *evsel,
 +                                 struct perf_counts_values *count,
 +                                 struct perf_stat_config *config)
 +{
 +      /* the evsel was failed already */
 +      if (evsel->err || evsel->counts->scaled == -1)
 +              return true;
 +
 +      /* this is meaningful for CPU aggregation modes only */
 +      if (config->aggr_mode == AGGR_GLOBAL)
 +              return false;
 +
 +      /* it's considered ok when it actually ran */
 +      if (count->ena != 0 && count->run != 0)
 +              return false;
 +
 +      return true;
 +}
 +
  static int
  process_counter_values(struct perf_stat_config *config, struct evsel *evsel,
                       int cpu_map_idx, int thread,
                       struct perf_counts_values *count)
  {
 -      struct perf_counts_values *aggr = &evsel->counts->aggr;
 +      struct perf_stat_evsel *ps = evsel->stats;
        static struct perf_counts_values zero;
        bool skip = false;
  
        if (skip)
                count = &zero;
  
 -      switch (config->aggr_mode) {
 -      case AGGR_THREAD:
 -      case AGGR_CORE:
 -      case AGGR_DIE:
 -      case AGGR_SOCKET:
 -      case AGGR_NODE:
 -      case AGGR_NONE:
 -              if (!evsel->snapshot)
 -                      evsel__compute_deltas(evsel, cpu_map_idx, thread, count);
 -              perf_counts_values__scale(count, config->scale, NULL);
 -              if ((config->aggr_mode == AGGR_NONE) && (!evsel->percore)) {
 -                      perf_stat__update_shadow_stats(evsel, count->val,
 -                                                     cpu_map_idx, &rt_stat);
 -              }
 +      if (!evsel->snapshot)
 +              evsel__compute_deltas(evsel, cpu_map_idx, thread, count);
 +      perf_counts_values__scale(count, config->scale, NULL);
 +
 +      if (config->aggr_mode == AGGR_THREAD) {
 +              struct perf_counts_values *aggr_counts = &ps->aggr[thread].counts;
 +
 +              /*
 +               * Skip value 0 when enabling --per-thread globally,
 +               * otherwise too many 0 output.
 +               */
 +              if (count->val == 0 && config->system_wide)
 +                      return 0;
  
 -              if (config->aggr_mode == AGGR_THREAD) {
 -                      perf_stat__update_shadow_stats(evsel, count->val,
 -                                                     thread, &rt_stat);
 +              ps->aggr[thread].nr++;
 +
 +              aggr_counts->val += count->val;
 +              aggr_counts->ena += count->ena;
 +              aggr_counts->run += count->run;
 +              return 0;
 +      }
 +
 +      if (ps->aggr) {
 +              struct perf_cpu cpu = perf_cpu_map__cpu(evsel->core.cpus, cpu_map_idx);
 +              struct aggr_cpu_id aggr_id = config->aggr_get_id(config, cpu);
 +              struct perf_stat_aggr *ps_aggr;
 +              int i;
 +
 +              for (i = 0; i < ps->nr_aggr; i++) {
 +                      if (!aggr_cpu_id__equal(&aggr_id, &config->aggr_map->map[i]))
 +                              continue;
 +
 +                      ps_aggr = &ps->aggr[i];
 +                      ps_aggr->nr++;
 +
 +                      /*
 +                       * When any result is bad, make them all to give consistent output
 +                       * in interval mode.  But per-task counters can have 0 enabled time
 +                       * when some tasks are idle.
 +                       */
 +                      if (evsel__count_has_error(evsel, count, config) && !ps_aggr->failed) {
 +                              ps_aggr->counts.val = 0;
 +                              ps_aggr->counts.ena = 0;
 +                              ps_aggr->counts.run = 0;
 +                              ps_aggr->failed = true;
 +                      }
 +
 +                      if (!ps_aggr->failed) {
 +                              ps_aggr->counts.val += count->val;
 +                              ps_aggr->counts.ena += count->ena;
 +                              ps_aggr->counts.run += count->run;
 +                      }
 +                      break;
                }
 -              break;
 -      case AGGR_GLOBAL:
 -              aggr->val += count->val;
 -              aggr->ena += count->ena;
 -              aggr->run += count->run;
 -      case AGGR_UNSET:
 -      case AGGR_MAX:
 -      default:
 -              break;
        }
  
        return 0;
@@@ -508,10 -426,13 +507,10 @@@ static int process_counter_maps(struct 
  int perf_stat_process_counter(struct perf_stat_config *config,
                              struct evsel *counter)
  {
 -      struct perf_counts_values *aggr = &counter->counts->aggr;
        struct perf_stat_evsel *ps = counter->stats;
 -      u64 *count = counter->counts->aggr.values;
 +      u64 *count;
        int ret;
  
 -      aggr->val = aggr->ena = aggr->run = 0;
 -
        if (counter->per_pkg)
                evsel__zero_per_pkg(counter);
  
        if (config->aggr_mode != AGGR_GLOBAL)
                return 0;
  
 -      if (!counter->snapshot)
 -              evsel__compute_deltas(counter, -1, -1, aggr);
 -      perf_counts_values__scale(aggr, config->scale, &counter->counts->scaled);
 -
 +      /*
 +       * GLOBAL aggregation mode only has a single aggr counts,
 +       * so we can use ps->aggr[0] as the actual output.
 +       */
 +      count = ps->aggr[0].counts.values;
        update_stats(&ps->res_stats, *count);
  
        if (verbose > 0) {
                        evsel__name(counter), count[0], count[1], count[2]);
        }
  
 -      /*
 -       * Save the full runtime - to allow normalization during printout:
 -       */
 -      perf_stat__update_shadow_stats(counter, *count, 0, &rt_stat);
 +      return 0;
 +}
 +
 +static int evsel__merge_aggr_counters(struct evsel *evsel, struct evsel *alias)
 +{
 +      struct perf_stat_evsel *ps_a = evsel->stats;
 +      struct perf_stat_evsel *ps_b = alias->stats;
 +      int i;
 +
 +      if (ps_a->aggr == NULL && ps_b->aggr == NULL)
 +              return 0;
 +
 +      if (ps_a->nr_aggr != ps_b->nr_aggr) {
 +              pr_err("Unmatched aggregation mode between aliases\n");
 +              return -1;
 +      }
 +
 +      for (i = 0; i < ps_a->nr_aggr; i++) {
 +              struct perf_counts_values *aggr_counts_a = &ps_a->aggr[i].counts;
 +              struct perf_counts_values *aggr_counts_b = &ps_b->aggr[i].counts;
 +
 +              /* NB: don't increase aggr.nr for aliases */
 +
 +              aggr_counts_a->val += aggr_counts_b->val;
 +              aggr_counts_a->ena += aggr_counts_b->ena;
 +              aggr_counts_a->run += aggr_counts_b->run;
 +      }
  
        return 0;
  }
 +/* events should have the same name, scale, unit, cgroup but on different PMUs */
 +static bool evsel__is_alias(struct evsel *evsel_a, struct evsel *evsel_b)
 +{
 +      if (strcmp(evsel__name(evsel_a), evsel__name(evsel_b)))
 +              return false;
 +
 +      if (evsel_a->scale != evsel_b->scale)
 +              return false;
 +
 +      if (evsel_a->cgrp != evsel_b->cgrp)
 +              return false;
 +
 +      if (strcmp(evsel_a->unit, evsel_b->unit))
 +              return false;
 +
 +      if (evsel__is_clock(evsel_a) != evsel__is_clock(evsel_b))
 +              return false;
 +
 +      return !!strcmp(evsel_a->pmu_name, evsel_b->pmu_name);
 +}
 +
 +static void evsel__merge_aliases(struct evsel *evsel)
 +{
 +      struct evlist *evlist = evsel->evlist;
 +      struct evsel *alias;
 +
 +      alias = list_prepare_entry(evsel, &(evlist->core.entries), core.node);
 +      list_for_each_entry_continue(alias, &evlist->core.entries, core.node) {
 +              /* Merge the same events on different PMUs. */
 +              if (evsel__is_alias(evsel, alias)) {
 +                      evsel__merge_aggr_counters(evsel, alias);
 +                      alias->merged_stat = true;
 +              }
 +      }
 +}
 +
 +static bool evsel__should_merge_hybrid(const struct evsel *evsel,
 +                                     const struct perf_stat_config *config)
 +{
 +      return config->hybrid_merge && evsel__is_hybrid(evsel);
 +}
 +
 +static void evsel__merge_stats(struct evsel *evsel, struct perf_stat_config *config)
 +{
 +      /* this evsel is already merged */
 +      if (evsel->merged_stat)
 +              return;
 +
 +      if (evsel->auto_merge_stats || evsel__should_merge_hybrid(evsel, config))
 +              evsel__merge_aliases(evsel);
 +}
 +
 +/* merge the same uncore and hybrid events if requested */
 +void perf_stat_merge_counters(struct perf_stat_config *config, struct evlist *evlist)
 +{
 +      struct evsel *evsel;
 +
 +      if (config->no_merge)
 +              return;
 +
 +      evlist__for_each_entry(evlist, evsel)
 +              evsel__merge_stats(evsel, config);
 +}
 +
 +static void evsel__update_percore_stats(struct evsel *evsel, struct aggr_cpu_id *core_id)
 +{
 +      struct perf_stat_evsel *ps = evsel->stats;
 +      struct perf_counts_values counts = { 0, };
 +      struct aggr_cpu_id id;
 +      struct perf_cpu cpu;
 +      int idx;
 +
 +      /* collect per-core counts */
 +      perf_cpu_map__for_each_cpu(cpu, idx, evsel->core.cpus) {
 +              struct perf_stat_aggr *aggr = &ps->aggr[idx];
 +
 +              id = aggr_cpu_id__core(cpu, NULL);
 +              if (!aggr_cpu_id__equal(core_id, &id))
 +                      continue;
 +
 +              counts.val += aggr->counts.val;
 +              counts.ena += aggr->counts.ena;
 +              counts.run += aggr->counts.run;
 +      }
 +
 +      /* update aggregated per-core counts for each CPU */
 +      perf_cpu_map__for_each_cpu(cpu, idx, evsel->core.cpus) {
 +              struct perf_stat_aggr *aggr = &ps->aggr[idx];
 +
 +              id = aggr_cpu_id__core(cpu, NULL);
 +              if (!aggr_cpu_id__equal(core_id, &id))
 +                      continue;
 +
 +              aggr->counts.val = counts.val;
 +              aggr->counts.ena = counts.ena;
 +              aggr->counts.run = counts.run;
 +
 +              aggr->used = true;
 +      }
 +}
 +
 +/* we have an aggr_map for cpu, but want to aggregate the counters per-core */
 +static void evsel__process_percore(struct evsel *evsel)
 +{
 +      struct perf_stat_evsel *ps = evsel->stats;
 +      struct aggr_cpu_id core_id;
 +      struct perf_cpu cpu;
 +      int idx;
 +
 +      if (!evsel->percore)
 +              return;
 +
 +      perf_cpu_map__for_each_cpu(cpu, idx, evsel->core.cpus) {
 +              struct perf_stat_aggr *aggr = &ps->aggr[idx];
 +
 +              if (aggr->used)
 +                      continue;
 +
 +              core_id = aggr_cpu_id__core(cpu, NULL);
 +              evsel__update_percore_stats(evsel, &core_id);
 +      }
 +}
 +
 +/* process cpu stats on per-core events */
 +void perf_stat_process_percore(struct perf_stat_config *config, struct evlist *evlist)
 +{
 +      struct evsel *evsel;
 +
 +      if (config->aggr_mode != AGGR_NONE)
 +              return;
 +
 +      evlist__for_each_entry(evlist, evsel)
 +              evsel__process_percore(evsel);
 +}
 +
 +static void evsel__update_shadow_stats(struct evsel *evsel)
 +{
 +      struct perf_stat_evsel *ps = evsel->stats;
 +      int i;
 +
 +      if (ps->aggr == NULL)
 +              return;
 +
 +      for (i = 0; i < ps->nr_aggr; i++) {
 +              struct perf_counts_values *aggr_counts = &ps->aggr[i].counts;
 +
 +              perf_stat__update_shadow_stats(evsel, aggr_counts->val, i, &rt_stat);
 +      }
 +}
 +
 +void perf_stat_process_shadow_stats(struct perf_stat_config *config __maybe_unused,
 +                                  struct evlist *evlist)
 +{
 +      struct evsel *evsel;
 +
 +      evlist__for_each_entry(evlist, evsel)
 +              evsel__update_shadow_stats(evsel);
 +}
  
  int perf_event__process_stat_event(struct perf_session *session,
                                   union perf_event *event)