[PATCH v3 0/7] syscore: Pass context data to callbacks
Thierry Reding
thierry.reding at gmail.com
Thu Oct 30 03:33:29 AEDT 2025
From: Thierry Reding <treding at nvidia.com>
Hi Greg, Rafael,
sorry, this took a while to rework because I had to find a large enough
block of free time to push through. I played around a bit with different
ideas based on our discussion and ended up with a mix between Rafael's
and my proposal. struct syscore_ops is now split out and can be made
const. struct syscore is introduced to contain the variable data such
as the list head and the driver data. It also has a pointer to the ops
structure. Registration APIs are changed accordingly. I initially wanted
to avoid this churn, but then realized I was already touching all of the
files anyway, so might as well make it all consistent. As a result the
series is about twice as large in terms of LOC, but that's mostly due to
the structure split.
For anyone who hasn't seen this yet, here's the full cover letter:
Hi,
Something that's been bugging me over the years is how some drivers have
had to adopt file-scoped variables to pass data into something like the
syscore operations. This is often harmless, but usually leads to drivers
not being able to deal with multiple instances, or additional frameworks
or data structures needing to be created to handle multiple instances.
This series proposes to "objectify" struct syscore_ops by passing driver
specific data to the syscore callbacks. The contextual data is stored in
a new struct syscore before registering the structure with the framework
and the structure can be embedded in driver-specific data to make it per
instance.
Patch 1 contains the bulk of these changes. It's fairly intrusive
because it does the conversion of the function signature all in one
patch. An alternative would've been to introduce new callbacks such that
these changes could be staged in. However, the amount of changes here
are not quite numerous enough to justify that, in my opinion, and
syscore isn't very frequently used, so the risk of another user getting
added while this is merged is rather small. All in all I think merging
this in one go is the simplest way.
Patches 2-7 are conversions of some existing drivers to take advantage
of this new parameter and tie the code to per-instance data.
Given that the recipient list for this is huge, I'm limiting this to
Greg (because it's at the core a... core change) and a set of larger
lists for architectures and subsystems that are impacted.
Changes in v3:
- add separate syscore structure containing the modifiable fields,
including driver-specific data, as well as a pointer to the constified
syscore_ops structure
- change registration/unregistration API to make these changes more
obvious
Changes in v2:
- kerneldoc fixes
Thanks,
Thierry
Thierry Reding (7):
syscore: Pass context data to callbacks
MIPS: PCI: Use contextual data instead of global variable
bus: mvebu-mbus: Use contextual data instead of global variable
clk: ingenic: tcu: Use contextual data instead of global variable
clk: mvebu: Use contextual data instead of global variable
irqchip/irq-imx-gpcv2: Use contextual data instead of global variable
soc/tegra: pmc: Use contextual data instead of global variable
arch/arm/mach-exynos/mcpm-exynos.c | 12 ++--
arch/arm/mach-exynos/suspend.c | 48 +++++++------
arch/arm/mach-pxa/generic.h | 6 +-
arch/arm/mach-pxa/irq.c | 10 ++-
arch/arm/mach-pxa/mfp-pxa2xx.c | 10 ++-
arch/arm/mach-pxa/mfp-pxa3xx.c | 10 ++-
arch/arm/mach-pxa/pxa25x.c | 4 +-
arch/arm/mach-pxa/pxa27x.c | 4 +-
arch/arm/mach-pxa/pxa3xx.c | 4 +-
arch/arm/mach-pxa/smemc.c | 12 ++--
arch/arm/mach-s3c/irq-pm-s3c64xx.c | 12 ++--
arch/arm/mach-s5pv210/pm.c | 10 ++-
arch/arm/mach-versatile/integrator_ap.c | 12 ++--
arch/arm/mm/cache-b15-rac.c | 12 ++--
arch/loongarch/kernel/smp.c | 12 ++--
arch/mips/alchemy/common/dbdma.c | 12 ++--
arch/mips/alchemy/common/irq.c | 24 ++++---
arch/mips/alchemy/common/usb.c | 12 ++--
arch/mips/pci/pci-alchemy.c | 30 +++------
arch/powerpc/platforms/cell/spu_base.c | 10 ++-
arch/powerpc/platforms/powermac/pic.c | 12 ++--
arch/powerpc/sysdev/fsl_lbc.c | 12 ++--
arch/powerpc/sysdev/fsl_pci.c | 12 ++--
arch/powerpc/sysdev/ipic.c | 12 ++--
arch/powerpc/sysdev/mpic.c | 14 ++--
arch/powerpc/sysdev/mpic_timer.c | 10 ++-
arch/sh/mm/pmb.c | 10 ++-
arch/x86/events/amd/ibs.c | 12 ++--
arch/x86/hyperv/hv_init.c | 12 ++--
arch/x86/kernel/amd_gart_64.c | 10 ++-
arch/x86/kernel/apic/apic.c | 12 ++--
arch/x86/kernel/apic/io_apic.c | 17 +++--
arch/x86/kernel/cpu/aperfmperf.c | 20 +++---
arch/x86/kernel/cpu/intel_epb.c | 16 +++--
arch/x86/kernel/cpu/mce/core.c | 14 ++--
arch/x86/kernel/cpu/microcode/core.c | 15 ++++-
arch/x86/kernel/cpu/mtrr/legacy.c | 12 ++--
arch/x86/kernel/cpu/umwait.c | 10 ++-
arch/x86/kernel/i8237.c | 10 ++-
arch/x86/kernel/i8259.c | 14 ++--
arch/x86/kernel/kvm.c | 12 ++--
drivers/acpi/pci_link.c | 10 ++-
drivers/acpi/sleep.c | 12 ++--
drivers/base/firmware_loader/main.c | 12 ++--
drivers/base/syscore.c | 82 ++++++++++++-----------
drivers/bus/mvebu-mbus.c | 19 +++---
drivers/clk/at91/pmc.c | 12 ++--
drivers/clk/imx/clk-vf610.c | 12 ++--
drivers/clk/ingenic/jz4725b-cgu.c | 2 +-
drivers/clk/ingenic/jz4740-cgu.c | 2 +-
drivers/clk/ingenic/jz4755-cgu.c | 2 +-
drivers/clk/ingenic/jz4760-cgu.c | 2 +-
drivers/clk/ingenic/jz4770-cgu.c | 2 +-
drivers/clk/ingenic/jz4780-cgu.c | 2 +-
drivers/clk/ingenic/pm.c | 14 ++--
drivers/clk/ingenic/pm.h | 2 +-
drivers/clk/ingenic/tcu.c | 59 ++++++++--------
drivers/clk/ingenic/x1000-cgu.c | 2 +-
drivers/clk/ingenic/x1830-cgu.c | 2 +-
drivers/clk/mvebu/common.c | 19 ++++--
drivers/clk/rockchip/clk-rk3288.c | 12 ++--
drivers/clk/samsung/clk-s5pv210-audss.c | 12 ++--
drivers/clk/samsung/clk.c | 12 ++--
drivers/clk/tegra/clk-tegra210.c | 12 ++--
drivers/clocksource/timer-armada-370-xp.c | 12 ++--
drivers/cpuidle/cpuidle-psci.c | 12 ++--
drivers/gpio/gpio-mxc.c | 12 ++--
drivers/gpio/gpio-pxa.c | 12 ++--
drivers/gpio/gpio-sa1100.c | 12 ++--
drivers/hv/vmbus_drv.c | 14 ++--
drivers/iommu/amd/init.c | 12 ++--
drivers/iommu/intel/iommu.c | 12 ++--
drivers/irqchip/exynos-combiner.c | 14 ++--
drivers/irqchip/irq-armada-370-xp.c | 12 ++--
drivers/irqchip/irq-bcm7038-l1.c | 12 ++--
drivers/irqchip/irq-gic-v3-its.c | 12 ++--
drivers/irqchip/irq-i8259.c | 12 ++--
drivers/irqchip/irq-imx-gpcv2.c | 30 +++------
drivers/irqchip/irq-loongson-eiointc.c | 12 ++--
drivers/irqchip/irq-loongson-htpic.c | 10 ++-
drivers/irqchip/irq-loongson-htvec.c | 12 ++--
drivers/irqchip/irq-loongson-pch-lpc.c | 12 ++--
drivers/irqchip/irq-loongson-pch-pic.c | 12 ++--
drivers/irqchip/irq-mchp-eic.c | 12 ++--
drivers/irqchip/irq-mst-intc.c | 12 ++--
drivers/irqchip/irq-mtk-cirq.c | 12 ++--
drivers/irqchip/irq-renesas-rzg2l.c | 12 ++--
drivers/irqchip/irq-sa11x0.c | 12 ++--
drivers/irqchip/irq-sifive-plic.c | 12 ++--
drivers/irqchip/irq-sun6i-r.c | 18 +++--
drivers/irqchip/irq-tegra.c | 12 ++--
drivers/irqchip/irq-vic.c | 12 ++--
drivers/leds/trigger/ledtrig-cpu.c | 14 ++--
drivers/macintosh/via-pmu.c | 12 ++--
drivers/power/reset/sc27xx-poweroff.c | 10 ++-
drivers/sh/clk/core.c | 10 ++-
drivers/sh/intc/core.c | 12 ++--
drivers/soc/bcm/brcmstb/biuctrl.c | 12 ++--
drivers/soc/tegra/pmc.c | 21 ++++--
drivers/thermal/intel/intel_hfi.c | 12 ++--
drivers/xen/xen-acpi-processor.c | 12 ++--
include/linux/syscore_ops.h | 15 +++--
kernel/cpu_pm.c | 12 ++--
kernel/irq/generic-chip.c | 14 ++--
kernel/irq/pm.c | 11 ++-
kernel/printk/printk.c | 11 ++-
kernel/time/sched_clock.c | 22 ++++--
kernel/time/timekeeping.c | 22 ++++--
virt/kvm/kvm_main.c | 18 +++--
109 files changed, 930 insertions(+), 523 deletions(-)
--
2.51.0
More information about the Linuxppc-dev
mailing list