* [PATCH v6 000/164] pwm: Improve lifetime tracking for pwm_chips @ 2024-02-14 9:30 Uwe Kleine-König 2024-02-14 9:33 ` [PATCH v6 162/164] pwm: Ensure a struct pwm has the same lifetime as its pwm_chip Uwe Kleine-König ` (3 more replies) 0 siblings, 4 replies; 5+ messages in thread From: Uwe Kleine-König @ 2024-02-14 9:30 UTC (permalink / raw) To: linux-pwm, Jonathan Corbet, Jonathan Cameron, James Clark, Andy Shevchenko, Mark Brown, Hector Martin, Sven Peter, Claudiu Beznea, Nicolas Ferre, Alexandre Belloni, Florian Fainelli, Ray Jui, Scott Branden, Alexander Shiyan, Benson Leung, Philipp Zabel, Shawn Guo, Sascha Hauer, Paul Cercueil, Vladimir Zapolskiy, Mika Westerberg, Andy Shevchenko, Linus Walleij, Hans de Goede, Ilpo Järvinen, Matthias Brugger, AngeloGioacchino Del Regno, Neil Armstrong, Kevin Hilman, Conor Dooley, Daire McNamara, Jonathan Neuschäfer, Heiko Stuebner, Krzysztof Kozlowski, Palmer Dabbelt, Paul Walmsley, Michael Walle, Orson Zhai, Baolin Wang, Chunyan Zhang, Fabrice Gasnier, Maxime Coquelin, Alexandre Torgue, Chen-Yu Tsai, Jernej Skrabec, Samuel Holland, Hammer Hsieh, Thierry Reding, Jonathan Hunter, Nobuhiro Iwamatsu, Sean Anderson, Michal Simek, Bartosz Golaszewski, Andrzej Hajda, Robert Foss, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie, Daniel Vetter, Pavel Machek, Lee Jones, Anjelique Melendez, Bjorn Andersson, Kees Cook, Rob Herring, Johan Hovold, Alex Elder, Greg Kroah-Hartman Cc: kernel, linux-doc, Alyssa Rosenzweig, asahi, linux-arm-kernel, Broadcom internal kernel review list, linux-rpi-kernel, Guenter Roeck, chrome-platform, Fabio Estevam, NXP Linux Team, linux-mips, linux-gpio, platform-driver-x86, linux-mediatek, Jerome Brunet, Martin Blumenstingl, linux-amlogic, linux-riscv, linux-rockchip, Alim Akhtar, linux-samsung-soc, linux-stm32, linux-sunxi, linux-tegra, Douglas Anderson, Laurent Pinchart, Jonas Karlman, dri-devel, linux-leds, greybus-dev, linux-staging, Gustavo A. R. Silva, linux-hardening Hello, this is v6 of the series introducing better lifetime tracking for pwmchips that addresses (for now theoretic) lifetime issues of pwm chips. Addressing these is a necessary precondition to introduce chardev support for PWMs. Locking got more complicated due to non-sleeping chips, so I dropped the character device patch because it got still more incomplete now. Also I'm not yet entirely sure about patches #162 and #163 and I expect them to change before they can go in. My plan for the next merge window is to get the patches in up to #160. After that the addition of chardev support (including correct locking) can continue without having to touch the lowlevel driver. So the idea of this series is to get the driver adaptions out of the way as this requires some cross-tree coordination. The patches that touch files outside of drivers/pwm include: - gpio: mvebu: Make use of devm_pwmchip_alloc() function It already has an Ack by Linus Walleij. - drm/bridge: ti-sn65dsi86: Make use of pwmchip_parent() accessor - drm/bridge: ti-sn65dsi86: Make use of devm_pwmchip_alloc() function The 2nd already has an Ack by Douglas Anderson which I tend to assume good enough to merge this via my pwm tree, too. An Ack for the first patch would be nice. - leds: qcom-lpg: Make use of devm_pwmchip_alloc() function Already has an Ack by Lee Jones. - staging: greybus: pwm: Change prototype of helpers to prepare further changes - staging: greybus: pwm: Make use of pwmchip_parent() accessor - staging: greybus: pwm: Rely on pwm framework to pass a valid hwpwm - staging: greybus: pwm: Drop unused gb_connection_set_data() - staging: greybus: pwm: Rework how the number of PWM lines is determined - staging: greybus: pwm: Make use of devm_pwmchip_alloc() function The greybus patches already got an Ack by Greg Kroah-Hartman in an earlier series, but I dropped it as the patches changed considerably. For the patches that already have an Ack by the respective maintainers I'll assume this is good enough to merge the patches via the pwm tree. Please object if you don't agree. For the others an Ack with that semantic would be nice. If you want to merge via your tree, that would need some coordination. The adaptions depend on patches #1 - #3, so this would involve an immutable branch or waiting until these patches reached your tree via the mainline tree. The series rebases fine on today's next, so at least for now there are no conflicts that git cannot resolve automatically. The biggest changes compared to v5 are: - Make pwmchip_parent's parameter const - Use pwmchip_parent also in drivers/pwm/sysfs.c and drivers/pwm/core.c - Several bug fixes in the conversions I found during the rework - Provide a non-devm pwmchip_alloc() function earlier (for the greybus pwm driver) - Increase alignment of driver private data to ARCH_DMA_MINALIGN bytes - Split several patches to make the easier reviewable The series is available via git at https://git.kernel.org/pub/scm/linux/kernel/git/ukleinek/linux.git pwm-lifetime-tracking if you want to give it a test. I'll keep this branch updated for the feedback I get here. Best regards Uwe Uwe Kleine-König (164): pwm: Provide an inline function to get the parent device of a given chip pwm: Provide wrappers for storing and getting driver private data pwm: Provide pwmchip_alloc() function and a devm variant of it pwm: ab8500: Make use of pwmchip_parent() accessor pwm: ab8500: Introduce a local pwm_chip variable in .probe() pwm: ab8500: Make use of devm_pwmchip_alloc() function pwm: apple: Make use of devm_pwmchip_alloc() function pwm: atmel: Change prototype of a helper to prepare further changes pwm: atmel: Make use of pwmchip_parent() accessor pwm: atmel: Make use of devm_pwmchip_alloc() function pwm: atmel-hlcdc: Prepare removing pwm_chip from driver data pwm: atmel-hlcdc: Make use of devm_pwmchip_alloc() function pwm: atmel-tcb: Make use of pwmchip_parent() accessor pwm: atmel-tcb: Prepare removing pwm_chip from driver data pwm: atmel-tcb: Make use of devm_pwmchip_alloc() function pwm: bcm2835: Make use of devm_pwmchip_alloc() function pwm: bcm-iproc: Make use of devm_pwmchip_alloc() function pwm: bcm-kona: Make use of pwmchip_parent() accessor pwm: bcm-kona: Make use of devm_pwmchip_alloc() function pwm: berlin: Prepare removing pwm_chip from driver data pwm: berlin: Make use of devm_pwmchip_alloc() function pwm: brcmstb: Make use of devm_pwmchip_alloc() function pwm: clk: Prepare removing pwm_chip from driver data pwm: clk: Make use of devm_pwmchip_alloc() function pwm: clps711x: Make use of devm_pwmchip_alloc() function pwm: crc: Simplify code to determine the pwmchip's parent device pwm: crc: Make use of pwmchip_parent() accessor pwm: crc: Make use of devm_pwmchip_alloc() function pwm: cros-ec: Change prototype of helpers to prepare further changes pwm: cros-ec: Make use of pwmchip_parent() accessor pwm: cros-ec: Make use of devm_pwmchip_alloc() function pwm: dwc: Prepare removing pwm_chip from driver data pwm: dwc: Make use of devm_pwmchip_alloc() function pwm: dwc-core: Make use of pwmchip_parent() accessor pwm: ep93xx: Make use of pwmchip_parent() accessor pwm: ep93xx: Make use of devm_pwmchip_alloc() function pwm: fsl-ftm: Change prototype of a helper to prepare further changes pwm: fsl-ftm: Make use of pwmchip_parent() accessor pwm: fsl-ftm: Prepare removing pwm_chip from driver data pwm: fsl-ftm: Make use of devm_pwmchip_alloc() function pwm: hibvt: Consistently name driver data hi_pwm_chip pwm: hibvt: Make use of devm_pwmchip_alloc() function pwm: img: Drop write-only variable from driver private data pwm: img: Make use of pwmchip_parent() accessor pwm: img: Prepare removing pwm_chip from driver data pwm: img: Make use of devm_pwmchip_alloc() function pwm: imx1: Make use of devm_pwmchip_alloc() function pwm: imx27: Make use of pwmchip_parent() accessor pwm: imx27: Make use of devm_pwmchip_alloc() function pwm: imx-tpm: Make use of devm_pwmchip_alloc() function pwm: intel-lgm: Make use of devm_pwmchip_alloc() function pwm: iqs620a: Create a wrapper for converting a pwm_chip to driver data pwm: iqs620a: Prepare removing pwm_chip from driver data pwm: iqs620a: Make use of devm_pwmchip_alloc() function pwm: jz4740: Change prototype of a helper to prepare further changes pwm: jz4740: Make use of pwmchip_parent() accessor pwm: jz4740: Make use of devm_pwmchip_alloc() function pwm: keembay: Make use of devm_pwmchip_alloc() function pwm: lp3943: Make use of devm_pwmchip_alloc() function pwm: lpc18xx-sct: Drop hardly used member from driver private data pwm: lpc18xx-sct: Make use of pwmchip_parent() accessor pwm: lpc18xx-sct: Prepare removing pwm_chip from driver data pwm: lpc18xx-sct: Make use of devm_pwmchip_alloc() function pwm: lpc32xx: Make use of devm_pwmchip_alloc() function pwm: lpss: Make use of pwmchip_parent() accessor pwm: lpss: Don't set driver data pwm: lpss-*: Make use of devm_pwmchip_alloc() function pwm: mediatek: Make use of pwmchip_parent() accessor pwm: mediatek: Make use of devm_pwmchip_alloc() function pwm: meson: Change prototype of a few helpers to prepare further changes pwm: meson: Make use of pwmchip_parent() accessor pwm: meson: Make use of devm_pwmchip_alloc() function pwm: microchip-core: Make use of devm_pwmchip_alloc() function pwm: mtk-disp: Make use of pwmchip_parent() accessor pwm: mtk-disp: Make use of devm_pwmchip_alloc() function pwm: mxs: Make use of devm_pwmchip_alloc() function pwm: ntxec: Make use of devm_pwmchip_alloc() function pwm: omap-dmtimer: Make use of pwmchip_parent() accessor pwm: omap-dmtimer: Prepare removing pwm_chip from driver data pwm: omap-dmtimer: Make use of devm_pwmchip_alloc() function pwm: pca9685: Prepare removing pwm_chip from driver data pwm: pca9685: Make use of pwmchip_parent() accessor pwm: pca9685: Make use of devm_pwmchip_alloc() function pwm: pxa: Make use of devm_pwmchip_alloc() function pwm: raspberrypi-poe: Make use of pwmchip_parent() accessor pwm: raspberrypi-poe: Make use of devm_pwmchip_alloc() function pwm: rcar: Make use of pwmchip_parent() accessor pwm: rcar: Prepare removing pwm_chip from driver data pwm: rcar: Make use of devm_pwmchip_alloc() function pwm: renesas-tpu: Make use of devm_pwmchip_alloc() function pwm: rochchip: Prepare removing pwm_chip from driver data pwm: rockchip: Make use of devm_pwmchip_alloc() function pwm: rz-mtu3: Make use of pwmchip_parent() accessor pwm: rz-mtu3: Prepare removing pwm_chip from driver data pwm: rz-mtu3: Make use of devm_pwmchip_alloc() function pwm: samsung: Simplify code to determine the pwmchip's parent device pwm: samsung: Change prototype of helpers to prepare further changes pwm: samsung: Make use of pwmchip_parent() accessor pwm: samsung: Simplify by using devm functions in probe pwm: samsung: Simplify using dev_err_probe() pwm: samsung: Make use of devm_pwmchip_alloc() function pwm: sifive: Simplify code to determine the pwmchip's parent device pwm: sifive: Prepare removing pwm_chip from driver data pwm: sifive: Make use of pwmchip_parent() accessor pwm: sifive: Make use of devm_pwmchip_alloc() function pwm: sl28cpld: Make use of devm_pwmchip_alloc() function pwm: spear: Make use of devm_pwmchip_alloc() function pwm: sprd: Rework how the available channels are counted pwm: sprd: Drop duplicated tracking of the parent device pwm: sprd: Make use of devm_pwmchip_alloc() function pwm: sti: Prepare removing pwm_chip from driver data pwm: sti: Make use of devm_pwmchip_alloc() function pwm: stm32: Simplify code to determine the pwmchip's parent device pwm: stm32: Change prototype of a helper to prepare further changes pwm: stm32: Prepare removing pwm_chip from driver data pwm: stm32: Change prototype of helper that detects npwm to prepare further changes pwm: stm32: Make use of devm_pwmchip_alloc() function pwm: stm32-lp: Simplify code to determine the pwmchip's parent device pwm: stm32-lp: Prepare removing pwm_chip from driver data pwm: stm32-lp: Make use of pwmchip_parent() accessor pwm: stm32-lp: Make use of devm_pwmchip_alloc() function pwm: stmpe: Make use of pwmchip_parent() accessor pwm: stmpe: Make use of devm_pwmchip_alloc() function pwm: sun4i: Make use of pwmchip_parent() accessor pwm: sun4i: Prepare removing pwm_chip from driver data pwm: sun4i: Consistently name driver data sun4ichip pwm: sun4i: Make use of devm_pwmchip_alloc() function pwm: sunplus: Make use of devm_pwmchip_alloc() function pwm: tegra: Drop duplicated tracking of the parent device pwm: tegra: Prepare removing pwm_chip from driver data pwm: tegra: Make use of devm_pwmchip_alloc() function pwm: tiecap: Simplify code to determine the pwmchip's parent device pwm: tiecap: Change prototype of helpers to prepare further changes pwm: tiecap: Make use of pwmchip_parent() accessor pwm: tiecap: Make use of devm_pwmchip_alloc() function pwm: tiehrpwm: Simplify code to determine the pwmchip's parent device pwm: tiehrpwm: Change prototype of helpers to prepare further changes pwm: tiehrpwm: Make use of pwmchip_parent() accessor pwm: tiehrpwm: Make use of devm_pwmchip_alloc() function pwm: twl: Make use of pwmchip_parent() accessor pwm: twl: Make use of devm_pwmchip_alloc() function pwm: twl-led: Make use of pwmchip_parent() accessor pwm: twl-led: Make use of devm_pwmchip_alloc() function pwm: visconti: Make use of devm_pwmchip_alloc() function pwm: vt8500: Change prototype of a helper to prepare further changes pwm: vt8500: Introduce a local pwm_chip variable in .probe() pwm: vt8500: Make use of pwmchip_parent() accessor pwm: vt8500: Make use of devm_pwmchip_alloc() function pwm: xilinx: Prepare removing pwm_chip from driver data pwm: xilinx: Make use of devm_pwmchip_alloc() function gpio: mvebu: Make use of devm_pwmchip_alloc() function drm/bridge: ti-sn65dsi86: Make use of pwmchip_parent() accessor drm/bridge: ti-sn65dsi86: Make use of devm_pwmchip_alloc() function leds: qcom-lpg: Make use of devm_pwmchip_alloc() function staging: greybus: pwm: Change prototype of helpers to prepare further changes staging: greybus: pwm: Make use of pwmchip_parent() accessor staging: greybus: pwm: Rely on pwm framework to pass a valid hwpwm staging: greybus: pwm: Drop unused gb_connection_set_data() staging: greybus: pwm: Rework how the number of PWM lines is determined staging: greybus: pwm: Make use of devm_pwmchip_alloc() function pwm: Ensure that pwm_chips are allocated using pwmchip_alloc() pwm: Ensure a struct pwm has the same lifetime as its pwm_chip pwm: Ensure the memory backing a PWM chip isn't freed while used pwm: Make pwmchip_[sg]et_drvdata() a wrapper around dev_set_drvdata() .../driver-api/driver-model/devres.rst | 1 + Documentation/driver-api/pwm.rst | 11 +- drivers/gpio/gpio-mvebu.c | 18 +- drivers/gpu/drm/bridge/ti-sn65dsi86.c | 31 +-- drivers/leds/rgb/leds-qcom-lpg.c | 16 +- drivers/pinctrl/intel/pinctrl-intel.c | 6 +- drivers/pwm/Kconfig | 4 - drivers/pwm/Makefile | 3 +- drivers/pwm/core.c | 184 +++++++++++++----- drivers/pwm/pwm-ab8500.c | 36 ++-- drivers/pwm/pwm-apple.c | 18 +- drivers/pwm/pwm-atmel-hlcdc.c | 37 ++-- drivers/pwm/pwm-atmel-tcb.c | 32 +-- drivers/pwm/pwm-atmel.c | 34 ++-- drivers/pwm/pwm-bcm-iproc.c | 19 +- drivers/pwm/pwm-bcm-kona.c | 23 ++- drivers/pwm/pwm-bcm2835.c | 19 +- drivers/pwm/pwm-berlin.c | 29 +-- drivers/pwm/pwm-brcmstb.c | 17 +- drivers/pwm/pwm-clk.c | 27 +-- drivers/pwm/pwm-clps711x.c | 17 +- drivers/pwm/pwm-crc.c | 22 +-- drivers/pwm/pwm-cros-ec.c | 58 +++--- drivers/pwm/pwm-dwc-core.c | 26 +-- drivers/pwm/pwm-dwc.c | 17 +- drivers/pwm/pwm-dwc.h | 9 +- drivers/pwm/pwm-ep93xx.c | 21 +- drivers/pwm/pwm-fsl-ftm.c | 49 ++--- drivers/pwm/pwm-hibvt.c | 70 ++++--- drivers/pwm/pwm-img.c | 60 +++--- drivers/pwm/pwm-imx-tpm.c | 34 ++-- drivers/pwm/pwm-imx1.c | 20 +- drivers/pwm/pwm-imx27.c | 26 +-- drivers/pwm/pwm-intel-lgm.c | 17 +- drivers/pwm/pwm-iqs620a.c | 30 +-- drivers/pwm/pwm-jz4740.c | 36 ++-- drivers/pwm/pwm-keembay.c | 17 +- drivers/pwm/pwm-lp3943.c | 17 +- drivers/pwm/pwm-lpc18xx-sct.c | 34 ++-- drivers/pwm/pwm-lpc32xx.c | 21 +- drivers/pwm/pwm-lpss-pci.c | 10 +- drivers/pwm/pwm-lpss-platform.c | 10 +- drivers/pwm/pwm-lpss.c | 34 ++-- drivers/pwm/pwm-lpss.h | 1 - drivers/pwm/pwm-mediatek.c | 29 +-- drivers/pwm/pwm-meson.c | 57 +++--- drivers/pwm/pwm-microchip-core.c | 17 +- drivers/pwm/pwm-mtk-disp.c | 25 ++- drivers/pwm/pwm-mxs.c | 32 +-- drivers/pwm/pwm-ntxec.c | 14 +- drivers/pwm/pwm-omap-dmtimer.c | 47 +++-- drivers/pwm/pwm-pca9685.c | 161 +++++++-------- drivers/pwm/pwm-pxa.c | 21 +- drivers/pwm/pwm-raspberrypi-poe.c | 20 +- drivers/pwm/pwm-rcar.c | 27 ++- drivers/pwm/pwm-renesas-tpu.c | 20 +- drivers/pwm/pwm-rockchip.c | 24 +-- drivers/pwm/pwm-rz-mtu3.c | 60 +++--- drivers/pwm/pwm-samsung.c | 94 ++++----- drivers/pwm/pwm-sifive.c | 30 +-- drivers/pwm/pwm-sl28cpld.c | 13 +- drivers/pwm/pwm-spear.c | 18 +- drivers/pwm/pwm-sprd.c | 58 +++--- drivers/pwm/pwm-sti.c | 61 +++--- drivers/pwm/pwm-stm32-lp.c | 31 ++- drivers/pwm/pwm-stm32.c | 56 +++--- drivers/pwm/pwm-stmpe.c | 58 +++--- drivers/pwm/pwm-sun4i.c | 100 +++++----- drivers/pwm/pwm-sunplus.c | 17 +- drivers/pwm/pwm-tegra.c | 50 ++--- drivers/pwm/pwm-tiecap.c | 55 +++--- drivers/pwm/pwm-tiehrpwm.c | 72 +++---- drivers/pwm/pwm-twl-led.c | 55 +++--- drivers/pwm/pwm-twl.c | 50 +++-- drivers/pwm/pwm-visconti.c | 17 +- drivers/pwm/pwm-vt8500.c | 43 ++-- drivers/pwm/pwm-xilinx.c | 34 ++-- drivers/pwm/sysfs.c | 45 +---- drivers/staging/greybus/pwm.c | 133 ++++++------- include/linux/platform_data/x86/pwm-lpss.h | 4 +- include/linux/pwm.h | 56 ++++-- 81 files changed, 1502 insertions(+), 1423 deletions(-) base-commit: ab105bfee27776dd946f8003d1e895fbf7674a3f -- 2.43.0 ^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH v6 162/164] pwm: Ensure a struct pwm has the same lifetime as its pwm_chip 2024-02-14 9:30 [PATCH v6 000/164] pwm: Improve lifetime tracking for pwm_chips Uwe Kleine-König @ 2024-02-14 9:33 ` Uwe Kleine-König 2024-02-15 11:46 ` [PATCH v6 000/164] pwm: Improve lifetime tracking for pwm_chips Uwe Kleine-König ` (2 subsequent siblings) 3 siblings, 0 replies; 5+ messages in thread From: Uwe Kleine-König @ 2024-02-14 9:33 UTC (permalink / raw) To: Kees Cook, linux-pwm; +Cc: Gustavo A. R. Silva, kernel, linux-hardening It's required to not free the memory underlying a requested PWM while a consumer still has a reference to it. While currently a pwm_chip doesn't life long enough in all cases, linking the struct pwm to the pwm_chip results in the right lifetime as soon as the pwmchip is living long enough. This happens with the following commits. Note this is a breaking change for all pwm drivers that don't use pwmchip_alloc(). Reviewed-by: Gustavo A. R. Silva <gustavoars@kernel.org> # for struct_size() and __counted_by() Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de> --- drivers/pwm/core.c | 27 ++++++++++----------------- include/linux/pwm.h | 2 +- 2 files changed, 11 insertions(+), 18 deletions(-) diff --git a/drivers/pwm/core.c b/drivers/pwm/core.c index cae93ccc32ed..c8303da06b62 100644 --- a/drivers/pwm/core.c +++ b/drivers/pwm/core.c @@ -458,7 +458,7 @@ EXPORT_SYMBOL_GPL(of_pwm_single_xlate); static void *pwmchip_priv(struct pwm_chip *chip) { - return (void *)chip + ALIGN(sizeof(*chip), PWMCHIP_ALIGN); + return (void *)chip + ALIGN(struct_size(chip, pwms, chip->npwm), PWMCHIP_ALIGN); } /* This is the counterpart to pwmchip_alloc */ @@ -472,8 +472,9 @@ struct pwm_chip *pwmchip_alloc(struct device *parent, unsigned int npwm, size_t { struct pwm_chip *chip; size_t alloc_size; + unsigned int i; - alloc_size = size_add(ALIGN(sizeof(*chip), PWMCHIP_ALIGN), sizeof_priv); + alloc_size = size_add(ALIGN(struct_size(chip, pwms, npwm), PWMCHIP_ALIGN), sizeof_priv); chip = kzalloc(alloc_size, GFP_KERNEL); if (!chip) @@ -485,6 +486,13 @@ struct pwm_chip *pwmchip_alloc(struct device *parent, unsigned int npwm, size_t pwmchip_set_drvdata(chip, pwmchip_priv(chip)); + for (i = 0; i < chip->npwm; i++) { + struct pwm_device *pwm = &chip->pwms[i]; + + pwm->chip = chip; + pwm->hwpwm = i; + } + return chip; } EXPORT_SYMBOL_GPL(pwmchip_alloc); @@ -556,7 +564,6 @@ static bool pwm_ops_check(const struct pwm_chip *chip) */ int __pwmchip_add(struct pwm_chip *chip, struct module *owner) { - unsigned int i; int ret; if (!chip || !pwmchip_parent(chip) || !chip->ops || !chip->npwm) @@ -576,28 +583,16 @@ int __pwmchip_add(struct pwm_chip *chip, struct module *owner) chip->owner = owner; - chip->pwms = kcalloc(chip->npwm, sizeof(*chip->pwms), GFP_KERNEL); - if (!chip->pwms) - return -ENOMEM; - mutex_lock(&pwm_lock); ret = idr_alloc(&pwm_chips, chip, 0, 0, GFP_KERNEL); if (ret < 0) { mutex_unlock(&pwm_lock); - kfree(chip->pwms); return ret; } chip->id = ret; - for (i = 0; i < chip->npwm; i++) { - struct pwm_device *pwm = &chip->pwms[i]; - - pwm->chip = chip; - pwm->hwpwm = i; - } - mutex_unlock(&pwm_lock); if (IS_ENABLED(CONFIG_OF)) @@ -627,8 +622,6 @@ void pwmchip_remove(struct pwm_chip *chip) idr_remove(&pwm_chips, chip->id); mutex_unlock(&pwm_lock); - - kfree(chip->pwms); } EXPORT_SYMBOL_GPL(pwmchip_remove); diff --git a/include/linux/pwm.h b/include/linux/pwm.h index 94a642a88817..fbd8f5db938a 100644 --- a/include/linux/pwm.h +++ b/include/linux/pwm.h @@ -290,7 +290,7 @@ struct pwm_chip { /* only used internally by the PWM framework */ bool uses_pwmchip_alloc; void *driver_data; - struct pwm_device *pwms; + struct pwm_device pwms[] __counted_by(npwm); }; static inline struct device *pwmchip_parent(const struct pwm_chip *chip) -- 2.43.0 ^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH v6 000/164] pwm: Improve lifetime tracking for pwm_chips 2024-02-14 9:30 [PATCH v6 000/164] pwm: Improve lifetime tracking for pwm_chips Uwe Kleine-König 2024-02-14 9:33 ` [PATCH v6 162/164] pwm: Ensure a struct pwm has the same lifetime as its pwm_chip Uwe Kleine-König @ 2024-02-15 11:46 ` Uwe Kleine-König 2024-03-25 1:54 ` patchwork-bot+chrome-platform 2024-03-25 2:13 ` patchwork-bot+chrome-platform 3 siblings, 0 replies; 5+ messages in thread From: Uwe Kleine-König @ 2024-02-15 11:46 UTC (permalink / raw) To: linux-pwm, Jonathan Corbet, Jonathan Cameron, James Clark, Andy Shevchenko, Mark Brown, Hector Martin, Sven Peter, Claudiu Beznea, Nicolas Ferre, Alexandre Belloni, Florian Fainelli, Ray Jui, Scott Branden, Alexander Shiyan, Benson Leung, Philipp Zabel, Shawn Guo, Sascha Hauer, Paul Cercueil, Vladimir Zapolskiy, Mika Westerberg, Andy Shevchenko, Linus Walleij, Hans de Goede, Ilpo Järvinen, Matthias Brugger, AngeloGioacchino Del Regno, Neil Armstrong, Kevin Hilman, Conor Dooley, Daire McNamara, Jonathan Neuschäfer, Heiko Stuebner, Krzysztof Kozlowski, Palmer Dabbelt, Paul Walmsley, Michael Walle, Orson Zhai, Baolin Wang, Chunyan Zhang, Fabrice Gasnier, Maxime Coquelin, Alexandre Torgue, Chen-Yu Tsai, Jernej Skrabec, Samuel Holland, Hammer Hsieh, Thierry Reding, Jonathan Hunter, Nobuhiro Iwamatsu, Sean Anderson, Michal Simek, Bartosz Golaszewski, Andrzej Hajda, Robert Foss, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie, Daniel Vetter, Pavel Machek, Lee Jones, Anjelique Melendez, Bjorn Andersson, Kees Cook, Rob Herring, Johan Hovold, Alex Elder, Greg Kroah-Hartman Cc: Douglas Anderson, linux-doc, dri-devel, platform-driver-x86, Laurent Pinchart, Alim Akhtar, Guenter Roeck, linux-riscv, Fabio Estevam, linux-stm32, Alyssa Rosenzweig, Jerome Brunet, chrome-platform, linux-samsung-soc, linux-staging, linux-rockchip, Broadcom internal kernel review list, NXP Linux Team, linux-leds, linux-sunxi, Jonas Karlman, Martin Blumenstingl, linux-gpio, linux-mediatek, linux-rpi-kernel, linux-tegra, linux-amlogic, linux-arm-kernel, greybus-dev, Gustavo A. R. Silva, linux-mips, asahi, kernel, linux-hardening [-- Attachment #1: Type: text/plain, Size: 2539 bytes --] Hello, On Wed, Feb 14, 2024 at 10:30:47AM +0100, Uwe Kleine-König wrote: > this is v6 of the series introducing better lifetime tracking for > pwmchips that addresses (for now theoretic) lifetime issues of pwm > chips. Addressing these is a necessary precondition to introduce chardev > support for PWMs. > > Locking got more complicated due to non-sleeping chips, so I dropped > the character device patch because it got still more incomplete now. > Also I'm not yet entirely sure about patches #162 and #163 and I expect > them to change before they can go in. My plan for the next merge window > is to get the patches in up to #160. After that the addition of chardev > support (including correct locking) can continue without having to touch > the lowlevel driver. So the idea of this series is to get the driver > adaptions out of the way as this requires some cross-tree coordination. > > The patches that touch files outside of drivers/pwm include: > > - gpio: mvebu: Make use of devm_pwmchip_alloc() function > It already has an Ack by Linus Walleij. > > - drm/bridge: ti-sn65dsi86: Make use of pwmchip_parent() accessor > - drm/bridge: ti-sn65dsi86: Make use of devm_pwmchip_alloc() function > The 2nd already has an Ack by Douglas Anderson which I tend to assume > good enough to merge this via my pwm tree, too. An Ack for the first > patch would be nice. > > - leds: qcom-lpg: Make use of devm_pwmchip_alloc() function > Already has an Ack by Lee Jones. > > - staging: greybus: pwm: Change prototype of helpers to prepare further changes > - staging: greybus: pwm: Make use of pwmchip_parent() accessor > - staging: greybus: pwm: Rely on pwm framework to pass a valid hwpwm > - staging: greybus: pwm: Drop unused gb_connection_set_data() > - staging: greybus: pwm: Rework how the number of PWM lines is determined > - staging: greybus: pwm: Make use of devm_pwmchip_alloc() function > The greybus patches already got an Ack by Greg Kroah-Hartman in an > earlier series, but I dropped it as the patches changed considerably. After getting the needed acks, I pushed out this series in https://git.kernel.org/pub/scm/linux/kernel/git/ukleinek/linux.git pwm/for-next up to patch #161. (But don't let you stop looking at the changes, reviews are still welcome.) Best regards Uwe -- Pengutronix e.K. | Uwe Kleine-König | Industrial Linux Solutions | https://www.pengutronix.de/ | [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 488 bytes --] ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH v6 000/164] pwm: Improve lifetime tracking for pwm_chips 2024-02-14 9:30 [PATCH v6 000/164] pwm: Improve lifetime tracking for pwm_chips Uwe Kleine-König 2024-02-14 9:33 ` [PATCH v6 162/164] pwm: Ensure a struct pwm has the same lifetime as its pwm_chip Uwe Kleine-König 2024-02-15 11:46 ` [PATCH v6 000/164] pwm: Improve lifetime tracking for pwm_chips Uwe Kleine-König @ 2024-03-25 1:54 ` patchwork-bot+chrome-platform 2024-03-25 2:13 ` patchwork-bot+chrome-platform 3 siblings, 0 replies; 5+ messages in thread From: patchwork-bot+chrome-platform @ 2024-03-25 1:54 UTC (permalink / raw) To: =?utf-8?q?Uwe_Kleine-K=C3=B6nig_=3Cu=2Ekleine-koenig=40pengutronix=2Ede=3E?= Cc: linux-pwm, corbet, Jonathan.Cameron, james.clark, andriy.shevchenko, broonie, marcan, sven, claudiu.beznea, nicolas.ferre, alexandre.belloni, florian.fainelli, rjui, sbranden, shc_work, bleung, p.zabel, shawnguo, s.hauer, paul, vz, mika.westerberg, andy, linus.walleij, hdegoede, ilpo.jarvinen, matthias.bgg, angelogioacchino.delregno, neil.armstrong, khilman, conor.dooley, daire.mcnamara, j.neuschaefer, heiko, krzysztof.kozlowski, palmer, paul.walmsley, mwalle, orsonzhai, baolin.wang, zhang.lyra, fabrice.gasnier, mcoquelin.stm32, alexandre.torgue, wens, jernej.skrabec, samuel, hammerh0314, thierry.reding, jonathanh, nobuhiro1.iwamatsu, sean.anderson, michal.simek, brgl, andrzej.hajda, rfoss, maarten.lankhorst, mripard, tzimmermann, airlied, daniel, pavel, lee, quic_amelende, quic_bjorande, keescook, robh, johan, elder, gregkh, kernel, linux-doc, alyssa, asahi, linux-arm-kernel, bcm-kernel-feedback-list, linux-rpi-kernel, groeck, chrome-platform, festevam, linux-imx, linux-mips, linux-gpio, platform-driver-x86, linux-mediatek, jbrunet, martin.blumenstingl, linux-amlogic, linux-riscv, linux-rockchip, alim.akhtar, linux-samsung-soc, linux-stm32, linux-sunxi, linux-tegra, dianders, Laurent.pinchart, jonas, dri-devel, linux-leds, greybus-dev, linux-staging, gustavoars, linux-hardening Hello: This series was applied to chrome-platform/linux.git (for-kernelci) by Uwe Kleine-König <u.kleine-koenig@pengutronix.de>: On Wed, 14 Feb 2024 10:30:47 +0100 you wrote: > Hello, > > this is v6 of the series introducing better lifetime tracking for > pwmchips that addresses (for now theoretic) lifetime issues of pwm > chips. Addressing these is a necessary precondition to introduce chardev > support for PWMs. > > [...] Here is the summary with links: - [v6,001/164] pwm: Provide an inline function to get the parent device of a given chip https://git.kernel.org/chrome-platform/c/4e59267c7a20 - [v6,003/164] pwm: Provide pwmchip_alloc() function and a devm variant of it https://git.kernel.org/chrome-platform/c/024913dbf99f - [v6,029/164] pwm: cros-ec: Change prototype of helpers to prepare further changes https://git.kernel.org/chrome-platform/c/7256c2e79b8e - [v6,030/164] pwm: cros-ec: Make use of pwmchip_parent() accessor https://git.kernel.org/chrome-platform/c/19a568a8d3c4 - [v6,031/164] pwm: cros-ec: Make use of devm_pwmchip_alloc() function https://git.kernel.org/chrome-platform/c/452be9421eda You are awesome, thank you! -- Deet-doot-dot, I am a bot. https://korg.docs.kernel.org/patchwork/pwbot.html ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH v6 000/164] pwm: Improve lifetime tracking for pwm_chips 2024-02-14 9:30 [PATCH v6 000/164] pwm: Improve lifetime tracking for pwm_chips Uwe Kleine-König ` (2 preceding siblings ...) 2024-03-25 1:54 ` patchwork-bot+chrome-platform @ 2024-03-25 2:13 ` patchwork-bot+chrome-platform 3 siblings, 0 replies; 5+ messages in thread From: patchwork-bot+chrome-platform @ 2024-03-25 2:13 UTC (permalink / raw) To: =?utf-8?q?Uwe_Kleine-K=C3=B6nig_=3Cu=2Ekleine-koenig=40pengutronix=2Ede=3E?= Cc: linux-pwm, corbet, Jonathan.Cameron, james.clark, andriy.shevchenko, broonie, marcan, sven, claudiu.beznea, nicolas.ferre, alexandre.belloni, florian.fainelli, rjui, sbranden, shc_work, bleung, p.zabel, shawnguo, s.hauer, paul, vz, mika.westerberg, andy, linus.walleij, hdegoede, ilpo.jarvinen, matthias.bgg, angelogioacchino.delregno, neil.armstrong, khilman, conor.dooley, daire.mcnamara, j.neuschaefer, heiko, krzysztof.kozlowski, palmer, paul.walmsley, mwalle, orsonzhai, baolin.wang, zhang.lyra, fabrice.gasnier, mcoquelin.stm32, alexandre.torgue, wens, jernej.skrabec, samuel, hammerh0314, thierry.reding, jonathanh, nobuhiro1.iwamatsu, sean.anderson, michal.simek, brgl, andrzej.hajda, rfoss, maarten.lankhorst, mripard, tzimmermann, airlied, daniel, pavel, lee, quic_amelende, quic_bjorande, keescook, robh, johan, elder, gregkh, kernel, linux-doc, alyssa, asahi, linux-arm-kernel, bcm-kernel-feedback-list, linux-rpi-kernel, groeck, chrome-platform, festevam, linux-imx, linux-mips, linux-gpio, platform-driver-x86, linux-mediatek, jbrunet, martin.blumenstingl, linux-amlogic, linux-riscv, linux-rockchip, alim.akhtar, linux-samsung-soc, linux-stm32, linux-sunxi, linux-tegra, dianders, Laurent.pinchart, jonas, dri-devel, linux-leds, greybus-dev, linux-staging, gustavoars, linux-hardening Hello: This series was applied to chrome-platform/linux.git (for-next) by Uwe Kleine-König <u.kleine-koenig@pengutronix.de>: On Wed, 14 Feb 2024 10:30:47 +0100 you wrote: > Hello, > > this is v6 of the series introducing better lifetime tracking for > pwmchips that addresses (for now theoretic) lifetime issues of pwm > chips. Addressing these is a necessary precondition to introduce chardev > support for PWMs. > > [...] Here is the summary with links: - [v6,001/164] pwm: Provide an inline function to get the parent device of a given chip https://git.kernel.org/chrome-platform/c/4e59267c7a20 - [v6,003/164] pwm: Provide pwmchip_alloc() function and a devm variant of it https://git.kernel.org/chrome-platform/c/024913dbf99f - [v6,029/164] pwm: cros-ec: Change prototype of helpers to prepare further changes https://git.kernel.org/chrome-platform/c/7256c2e79b8e - [v6,030/164] pwm: cros-ec: Make use of pwmchip_parent() accessor https://git.kernel.org/chrome-platform/c/19a568a8d3c4 - [v6,031/164] pwm: cros-ec: Make use of devm_pwmchip_alloc() function https://git.kernel.org/chrome-platform/c/452be9421eda You are awesome, thank you! -- Deet-doot-dot, I am a bot. https://korg.docs.kernel.org/patchwork/pwbot.html ^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2024-03-25 2:13 UTC | newest] Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2024-02-14 9:30 [PATCH v6 000/164] pwm: Improve lifetime tracking for pwm_chips Uwe Kleine-König 2024-02-14 9:33 ` [PATCH v6 162/164] pwm: Ensure a struct pwm has the same lifetime as its pwm_chip Uwe Kleine-König 2024-02-15 11:46 ` [PATCH v6 000/164] pwm: Improve lifetime tracking for pwm_chips Uwe Kleine-König 2024-03-25 1:54 ` patchwork-bot+chrome-platform 2024-03-25 2:13 ` patchwork-bot+chrome-platform
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).