* Re: [PATCH] bus: Make remove callback return void
From: Vinod Koul @ 2021-07-06 10:45 UTC (permalink / raw)
To: Uwe Kleine-König
Cc: nvdimm, Alexey Kardashevskiy, Samuel Iglesias Gonsalvez,
Jens Taprogge, Ulf Hansson, Jaroslav Kysela, linux-fpga,
Benjamin Tissoires, Paul Mackerras, Srinivas Pandruvada,
K. Y. Srinivasan, Mike Christie, Wei Liu, Maxim Levitsky,
Samuel Holland, linux-acpi, linux-pci, xen-devel, Tomas Winkler,
Julien Grall, Ohad Ben-Cohen, Alex Williamson, Alex Elder,
linux-parisc, Geoff Levand, Greg Kroah-Hartman, linux-usb,
Rafael J. Wysocki, linux-kernel, linux-spi, Thorsten Scherer,
kernel, Jon Mason, linux-ntb, Wu Hao, David Woodhouse,
Krzysztof Wilczyński, Alexandre Belloni, Manohar Vanga,
linux-wireless, Dominik Brodowski, virtualization,
James E.J. Bottomley, target-devel, Srinivas Kandagatla,
linux-i2c, Kai-Heng Feng, Stefano Stabellini, Stephen Hemminger,
Ira Weiny, Helge Deller, Rafał Miłecki,
industrypack-devel, linux-mips, Len Brown, alsa-devel,
linux-arm-msm, linux-media, Maxime Ripard, Johan Hovold,
greybus-dev, Bjorn Helgaas, Dave Jiang, Boris Ostrovsky,
Mika Westerberg, linux-arm-kernel, Johannes Thumshirn,
Mathieu Poirier, Stephen Boyd, Cornelia Huck, Wolfram Sang,
Joey Pabalan, Yehezkel Bernat, Pali Rohár, Bodo Stroesser,
Alison Schofield, Heikki Krogerus, Tyrel Datwyler,
Alexander Shishkin, Tom Rix, Jason Wang, SeongJae Park,
linux-hyperv, platform-driver-x86, Frank Li, netdev,
Qinglang Miao, Jiri Slaby, Rob Herring, Lorenzo Pieralisi,
Mark Gross, linux-staging, Dexuan Cui, Jernej Skrabec,
Kishon Vijay Abraham I, Chen-Yu Tsai, linux-input, Allen Hubbe,
Alex Dubov, Haiyang Zhang, Jiri Kosina, Vladimir Zapolskiy,
Ben Widawsky, Moritz Fischer, linux-cxl, Michael Buesch,
Dan Williams, Mauro Carvalho Chehab, Cristian Marussi,
Thomas Bogendoerfer, Martin K. Petersen, Martyn Welch,
Dmitry Torokhov, linux-mmc, linux-sunxi, Stefan Richter,
Sudeep Holla, David S. Miller, Sven Van Asbroeck, kvm,
Michael S. Tsirkin, linux-remoteproc, Bjorn Andersson,
Kirti Wankhede, Andreas Noever, linux-i3c, linux1394-devel,
Lee Jones, Arnd Bergmann, linux-scsi, Vishal Verma, Russell King,
Andy Gross, linux-serial, Jakub Kicinski, Michael Jamet,
William Breathitt Gray, Hans de Goede, Hannes Reinecke,
Adrian Hunter, Juergen Gross, linuxppc-dev, Takashi Iwai,
Alexandre Bounine, Mark Brown, Marc Zyngier, dmaengine,
Johannes Berg, Maximilian Luz
In-Reply-To: <20210706095037.1425211-1-u.kleine-koenig@pengutronix.de>
On 06-07-21, 11:50, Uwe Kleine-König wrote:
> The driver core ignores the return value of this callback because there
> is only little it can do when a device disappears.
>
> This is the final bit of a long lasting cleanup quest where several
> buses were converted to also return void from their remove callback.
> Additionally some resource leaks were fixed that were caused by drivers
> returning an error code in the expectation that the driver won't go
> away.
>
> With struct bus_type::remove returning void it's prevented that newly
> implemented buses return an ignored error code and so don't anticipate
> wrong expectations for driver authors.
Acked-By: Vinod Koul <vkoul@kernel.org>
--
~Vinod
^ permalink raw reply
* Re: [PATCH] bus: Make remove callback return void
From: Johan Hovold @ 2021-07-06 10:49 UTC (permalink / raw)
To: Uwe Kleine-König
Cc: nvdimm, Alexey Kardashevskiy, Samuel Iglesias Gonsalvez,
Jens Taprogge, Ulf Hansson, Jaroslav Kysela, linux-fpga,
Benjamin Tissoires, Paul Mackerras, Srinivas Pandruvada,
K. Y. Srinivasan, Mike Christie, Wei Liu, Maxim Levitsky,
Samuel Holland, linux-acpi, linux-pci, xen-devel, Tomas Winkler,
Julien Grall, Ohad Ben-Cohen, Alex Williamson, Alex Elder,
linux-parisc, Geoff Levand, Greg Kroah-Hartman, linux-usb,
Rafael J. Wysocki, linux-kernel, linux-spi, Thorsten Scherer,
kernel, Jon Mason, linux-ntb, Wu Hao, David Woodhouse,
Krzysztof Wilczyński, Alexandre Belloni, Manohar Vanga,
linux-wireless, Dominik Brodowski, virtualization,
James E.J. Bottomley, target-devel, Srinivas Kandagatla,
linux-i2c, Kai-Heng Feng, Stefano Stabellini, Stephen Hemminger,
Ira Weiny, Helge Deller, Rafał Miłecki,
industrypack-devel, linux-mips, Len Brown, alsa-devel,
linux-arm-msm, linux-media, Maxime Ripard, greybus-dev,
Bjorn Helgaas, Dave Jiang, Boris Ostrovsky, Mika Westerberg,
linux-arm-kernel, Johannes Thumshirn, Mathieu Poirier,
Stephen Boyd, Cornelia Huck, Wolfram Sang, Joey Pabalan,
Yehezkel Bernat, Pali Rohár, Bodo Stroesser,
Alison Schofield, Heikki Krogerus, Tyrel Datwyler,
Alexander Shishkin, Tom Rix, Jason Wang, SeongJae Park,
linux-hyperv, platform-driver-x86, Frank Li, netdev,
Qinglang Miao, Jiri Slaby, Rob Herring, Lorenzo Pieralisi,
Mark Gross, linux-staging, Dexuan Cui, Jernej Skrabec,
Kishon Vijay Abraham I, Chen-Yu Tsai, linux-input, Allen Hubbe,
Alex Dubov, Haiyang Zhang, Jiri Kosina, Vladimir Zapolskiy,
Ben Widawsky, Moritz Fischer, linux-cxl, Michael Buesch,
Dan Williams, Mauro Carvalho Chehab, Cristian Marussi,
Thomas Bogendoerfer, Martin K. Petersen, Martyn Welch,
Dmitry Torokhov, linux-mmc, linux-sunxi, Stefan Richter,
Sudeep Holla, David S. Miller, Sven Van Asbroeck, kvm,
Michael S. Tsirkin, linux-remoteproc, Bjorn Andersson,
Kirti Wankhede, Andreas Noever, linux-i3c, linux1394-devel,
Lee Jones, Arnd Bergmann, linux-scsi, Vishal Verma, Russell King,
Andy Gross, linux-serial, Jakub Kicinski, Michael Jamet,
William Breathitt Gray, Hans de Goede, Hannes Reinecke,
Adrian Hunter, Juergen Gross, linuxppc-dev, Takashi Iwai,
Alexandre Bounine, Vinod Koul, Mark Brown, Marc Zyngier,
dmaengine, Johannes Berg, Maximilian Luz
In-Reply-To: <20210706095037.1425211-1-u.kleine-koenig@pengutronix.de>
On Tue, Jul 06, 2021 at 11:50:37AM +0200, Uwe Kleine-König wrote:
> The driver core ignores the return value of this callback because there
> is only little it can do when a device disappears.
>
> This is the final bit of a long lasting cleanup quest where several
> buses were converted to also return void from their remove callback.
> Additionally some resource leaks were fixed that were caused by drivers
> returning an error code in the expectation that the driver won't go
> away.
>
> With struct bus_type::remove returning void it's prevented that newly
> implemented buses return an ignored error code and so don't anticipate
> wrong expectations for driver authors.
>
> Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
> drivers/staging/greybus/gbphy.c | 4 +---
> drivers/usb/serial/bus.c | 4 +---
> include/linux/device/bus.h | 2 +-
Acked-by: Johan Hovold <johan@kernel.org>
^ permalink raw reply
* Re: [PATCH] bus: Make remove callback return void
From: Juergen Gross @ 2021-07-06 10:46 UTC (permalink / raw)
To: Uwe Kleine-König, Greg Kroah-Hartman
Cc: nvdimm, Alexey Kardashevskiy, Samuel Iglesias Gonsalvez,
Jens Taprogge, Ulf Hansson, Jaroslav Kysela, Benjamin Tissoires,
Paul Mackerras, Srinivas Pandruvada, K. Y. Srinivasan,
Mike Christie, Wei Liu, Maxim Levitsky, Samuel Holland,
linux-acpi, linux-pci, xen-devel, Tomas Winkler, Julien Grall,
Ohad Ben-Cohen, Alex Williamson, Alex Elder, linux-parisc,
Geoff Levand, linux-fpga, linux-usb, Rafael J. Wysocki,
linux-kernel, linux-spi, Thorsten Scherer, kernel, Jon Mason,
linux-ntb, Wu Hao, David Woodhouse, Krzysztof Wilczyński,
Alexandre Belloni, Manohar Vanga, linux-wireless,
Dominik Brodowski, virtualization, James E.J. Bottomley,
target-devel, Srinivas Kandagatla, linux-i2c, Kai-Heng Feng,
Stefano Stabellini, Stephen Hemminger, Ira Weiny, Helge Deller,
Rafał Miłecki, industrypack-devel, linux-mips,
Len Brown, alsa-devel, linux-arm-msm, linux-media, Maxime Ripard,
Johan Hovold, greybus-dev, Bjorn Helgaas, Dave Jiang,
Boris Ostrovsky, Mika Westerberg, linux-arm-kernel,
Johannes Thumshirn, Mathieu Poirier, Stephen Boyd, Cornelia Huck,
Wolfram Sang, Joey Pabalan, Yehezkel Bernat, Pali Rohár,
Bodo Stroesser, Alison Schofield, Heikki Krogerus, Tyrel Datwyler,
Alexander Shishkin, Tom Rix, Jason Wang, SeongJae Park,
linux-hyperv, platform-driver-x86, Frank Li, netdev,
Qinglang Miao, Jiri Slaby, Rob Herring, Lorenzo Pieralisi,
Mark Gross, linux-staging, Dexuan Cui, Jernej Skrabec,
Kishon Vijay Abraham I, Chen-Yu Tsai, linux-input, Allen Hubbe,
Alex Dubov, Haiyang Zhang, Jiri Kosina, Vladimir Zapolskiy,
Ben Widawsky, Moritz Fischer, linux-cxl, Michael Buesch,
Dan Williams, Mauro Carvalho Chehab, Cristian Marussi,
Thomas Bogendoerfer, Martin K. Petersen, Martyn Welch,
Dmitry Torokhov, linux-mmc, linux-sunxi, Stefan Richter,
Sudeep Holla, David S. Miller, Sven Van Asbroeck, kvm,
Michael S. Tsirkin, linux-remoteproc, Bjorn Andersson,
Kirti Wankhede, Andreas Noever, linux-i3c, linux1394-devel,
Lee Jones, Arnd Bergmann, linux-scsi, Vishal Verma, Russell King,
Andy Gross, linux-serial, Jakub Kicinski, Michael Jamet,
William Breathitt Gray, Hans de Goede, Hannes Reinecke,
Adrian Hunter, linuxppc-dev, Takashi Iwai, Alexandre Bounine,
Vinod Koul, Mark Brown, Marc Zyngier, dmaengine, Johannes Berg,
Maximilian Luz
In-Reply-To: <20210706095037.1425211-1-u.kleine-koenig@pengutronix.de>
[-- Attachment #1.1.1: Type: text/plain, Size: 813 bytes --]
On 06.07.21 11:50, Uwe Kleine-König wrote:
> The driver core ignores the return value of this callback because there
> is only little it can do when a device disappears.
>
> This is the final bit of a long lasting cleanup quest where several
> buses were converted to also return void from their remove callback.
> Additionally some resource leaks were fixed that were caused by drivers
> returning an error code in the expectation that the driver won't go
> away.
>
> With struct bus_type::remove returning void it's prevented that newly
> implemented buses return an ignored error code and so don't anticipate
> wrong expectations for driver authors.
>
> Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
Xen-bits:
Acked-by: Juergen Gross <jgross@suse.com>
Juergen
[-- Attachment #1.1.2: OpenPGP public key --]
[-- Type: application/pgp-keys, Size: 3135 bytes --]
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 495 bytes --]
^ permalink raw reply
* Re: [PATCH] bus: Make remove callback return void
From: Cornelia Huck @ 2021-07-06 10:57 UTC (permalink / raw)
To: Uwe Kleine-König, Greg Kroah-Hartman
Cc: nvdimm, Alexey Kardashevskiy, Samuel Iglesias Gonsalvez,
Jens Taprogge, Ulf Hansson, Jaroslav Kysela, Benjamin Tissoires,
Paul Mackerras, Srinivas Pandruvada, K. Y. Srinivasan,
Mike Christie, Wei Liu, Maxim Levitsky, Samuel Holland,
linux-acpi, linux-pci, xen-devel, Tomas Winkler, Julien Grall,
Ohad Ben-Cohen, Alex Williamson, Alex Elder, linux-parisc,
Geoff Levand, linux-fpga, linux-usb, Rafael J. Wysocki,
linux-kernel, linux-spi, Thorsten Scherer, kernel, Jon Mason,
linux-ntb, Wu Hao, David Woodhouse, Krzysztof Wilczyński,
Alexandre Belloni, Manohar Vanga, linux-wireless,
Dominik Brodowski, virtualization, James E.J. Bottomley,
target-devel, Srinivas Kandagatla, linux-i2c, Kai-Heng Feng,
Stefano Stabellini, Stephen Hemminger, Ira Weiny, Helge Deller,
Rafał Miłecki, industrypack-devel, linux-mips,
Len Brown, alsa-devel, linux-arm-msm, linux-media, Maxime Ripard,
Johan Hovold, greybus-dev, Bjorn Helgaas, Dave Jiang,
Boris Ostrovsky, Mika Westerberg, linux-arm-kernel,
Johannes Thumshirn, Mathieu Poirier, Stephen Boyd, Wolfram Sang,
Joey Pabalan, Yehezkel Bernat, Pali Rohár, Bodo Stroesser,
Alison Schofield, Heikki Krogerus, Tyrel Datwyler,
Alexander Shishkin, Tom Rix, Jason Wang, SeongJae Park,
linux-hyperv, platform-driver-x86, Frank Li, netdev,
Qinglang Miao, Jiri Slaby, Rob Herring, Lorenzo Pieralisi,
Mark Gross, linux-staging, Dexuan Cui, Jernej Skrabec,
Kishon Vijay Abraham I, Chen-Yu Tsai, linux-input, Allen Hubbe,
Alex Dubov, Haiyang Zhang, Jiri Kosina, Vladimir Zapolskiy,
Ben Widawsky, Moritz Fischer, linux-cxl, Michael Buesch,
Dan Williams, Mauro Carvalho Chehab, Cristian Marussi,
Thomas Bogendoerfer, Martin K. Petersen, Martyn Welch,
Dmitry Torokhov, linux-mmc, linux-sunxi, Stefan Richter,
Sudeep Holla, David S. Miller, Sven Van Asbroeck, kvm,
Michael S. Tsirkin, linux-remoteproc, Bjorn Andersson,
Kirti Wankhede, Andreas Noever, linux-i3c, linux1394-devel,
Lee Jones, Arnd Bergmann, linux-scsi, Vishal Verma, Russell King,
Andy Gross, linux-serial, Jakub Kicinski, Michael Jamet,
William Breathitt Gray, Hans de Goede, Hannes Reinecke,
Adrian Hunter, Juergen Gross, linuxppc-dev, Takashi Iwai,
Alexandre Bounine, Vinod Koul, Mark Brown, Marc Zyngier,
dmaengine, Johannes Berg, Maximilian Luz
In-Reply-To: <20210706095037.1425211-1-u.kleine-koenig@pengutronix.de>
On Tue, Jul 06 2021, Uwe Kleine-König <u.kleine-koenig@pengutronix.de> wrote:
> The driver core ignores the return value of this callback because there
> is only little it can do when a device disappears.
>
> This is the final bit of a long lasting cleanup quest where several
> buses were converted to also return void from their remove callback.
> Additionally some resource leaks were fixed that were caused by drivers
> returning an error code in the expectation that the driver won't go
> away.
>
> With struct bus_type::remove returning void it's prevented that newly
> implemented buses return an ignored error code and so don't anticipate
> wrong expectations for driver authors.
Yay!
>
> Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
> ---
> Hello,
>
> this patch depends on "PCI: endpoint: Make struct pci_epf_driver::remove
> return void" that is not yet applied, see
> https://lore.kernel.org/r/20210223090757.57604-1-u.kleine-koenig@pengutronix.de.
>
> I tested it using allmodconfig on amd64 and arm, but I wouldn't be
> surprised if I still missed to convert a driver. So it would be great to
> get this into next early after the merge window closes.
I'm afraid you missed the s390-specific busses in drivers/s390/cio/
(css/ccw/ccwgroup).
^ permalink raw reply
* Re: [PATCH] bus: Make remove callback return void
From: Alexandre Belloni @ 2021-07-06 10:43 UTC (permalink / raw)
To: Uwe Kleine-König
Cc: nvdimm, Alexey Kardashevskiy, Samuel Iglesias Gonsalvez,
Jens Taprogge, Ulf Hansson, Jaroslav Kysela, linux-fpga,
Benjamin Tissoires, Paul Mackerras, Srinivas Pandruvada,
K. Y. Srinivasan, Mike Christie, Wei Liu, Maxim Levitsky,
Samuel Holland, linux-acpi, linux-pci, xen-devel, Tomas Winkler,
Julien Grall, Ohad Ben-Cohen, Alex Williamson, Alex Elder,
linux-parisc, Geoff Levand, Greg Kroah-Hartman, linux-usb,
Rafael J. Wysocki, linux-kernel, linux-spi, Thorsten Scherer,
kernel, Jon Mason, linux-ntb, Wu Hao, David Woodhouse,
Krzysztof Wilczyński, linux-hyperv, Manohar Vanga,
linux-wireless, Dominik Brodowski, virtualization,
James E.J. Bottomley, target-devel, Srinivas Kandagatla,
linux-i2c, Kai-Heng Feng, Stefano Stabellini, Stephen Hemminger,
Ira Weiny, Helge Deller, Rafał Miłecki,
industrypack-devel, linux-mips, Len Brown, linux-arm-msm,
linux-media, Maxime Ripard, Johan Hovold, greybus-dev,
Bjorn Helgaas, Dave Jiang, Boris Ostrovsky, Mika Westerberg,
linux-arm-kernel, Johannes Thumshirn, Mathieu Poirier,
Stephen Boyd, Cornelia Huck, Wolfram Sang, Joey Pabalan,
Yehezkel Bernat, Pali Rohár, Bodo Stroesser,
Alison Schofield, Heikki Krogerus, Tyrel Datwyler,
Alexander Shishkin, Tom Rix, Jason Wang, SeongJae Park,
alsa-devel, platform-driver-x86, Frank Li, netdev, Qinglang Miao,
Jiri Slaby, Rob Herring, Lorenzo Pieralisi, Mark Gross,
linux-staging, Dexuan Cui, Jernej Skrabec, Kishon Vijay Abraham I,
Chen-Yu Tsai, linux-input, Allen Hubbe, Alex Dubov, Haiyang Zhang,
Jiri Kosina, Vladimir Zapolskiy, Ben Widawsky, Moritz Fischer,
linux-cxl, Michael Buesch, Dan Williams, Mauro Carvalho Chehab,
Cristian Marussi, Thomas Bogendoerfer, Martin K. Petersen,
Martyn Welch, Dmitry Torokhov, linux-mmc, linux-sunxi,
Stefan Richter, Sudeep Holla, David S. Miller, Sven Van Asbroeck,
kvm, Michael S. Tsirkin, linux-remoteproc, Bjorn Andersson,
Kirti Wankhede, Andreas Noever, linux-i3c, linux1394-devel,
Lee Jones, Arnd Bergmann, linux-scsi, Vishal Verma, Russell King,
Andy Gross, linux-serial, Jakub Kicinski, Michael Jamet,
William Breathitt Gray, Hans de Goede, Hannes Reinecke,
Adrian Hunter, Juergen Gross, linuxppc-dev, Takashi Iwai,
Alexandre Bounine, Vinod Koul, Mark Brown, Marc Zyngier,
dmaengine, Johannes Berg, Maximilian Luz
In-Reply-To: <20210706095037.1425211-1-u.kleine-koenig@pengutronix.de>
On 06/07/2021 11:50:37+0200, Uwe Kleine-König wrote:
> The driver core ignores the return value of this callback because there
> is only little it can do when a device disappears.
>
> This is the final bit of a long lasting cleanup quest where several
> buses were converted to also return void from their remove callback.
> Additionally some resource leaks were fixed that were caused by drivers
> returning an error code in the expectation that the driver won't go
> away.
>
> With struct bus_type::remove returning void it's prevented that newly
> implemented buses return an ignored error code and so don't anticipate
> wrong expectations for driver authors.
>
> Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
Acked-by: Alexandre Belloni <alexandre.belloni@bootlin.com>
> ---
> Hello,
>
> this patch depends on "PCI: endpoint: Make struct pci_epf_driver::remove
> return void" that is not yet applied, see
> https://lore.kernel.org/r/20210223090757.57604-1-u.kleine-koenig@pengutronix.de.
>
> I tested it using allmodconfig on amd64 and arm, but I wouldn't be
> surprised if I still missed to convert a driver. So it would be great to
> get this into next early after the merge window closes.
>
> I send this mail to all people that get_maintainer.pl emits for this
> patch. I wonder how many recipents will refuse this mail because of the
> long Cc: list :-)
>
> Best regards
> Uwe
>
> arch/arm/common/locomo.c | 3 +--
> arch/arm/common/sa1111.c | 4 +---
> arch/arm/mach-rpc/ecard.c | 4 +---
> arch/mips/sgi-ip22/ip22-gio.c | 3 +--
> arch/parisc/kernel/drivers.c | 5 ++---
> arch/powerpc/platforms/ps3/system-bus.c | 3 +--
> arch/powerpc/platforms/pseries/ibmebus.c | 3 +--
> arch/powerpc/platforms/pseries/vio.c | 3 +--
> drivers/acpi/bus.c | 3 +--
> drivers/amba/bus.c | 4 +---
> drivers/base/auxiliary.c | 4 +---
> drivers/base/isa.c | 4 +---
> drivers/base/platform.c | 4 +---
> drivers/bcma/main.c | 6 ++----
> drivers/bus/sunxi-rsb.c | 4 +---
> drivers/cxl/core.c | 3 +--
> drivers/dax/bus.c | 4 +---
> drivers/dma/idxd/sysfs.c | 4 +---
> drivers/firewire/core-device.c | 4 +---
> drivers/firmware/arm_scmi/bus.c | 4 +---
> drivers/firmware/google/coreboot_table.c | 4 +---
> drivers/fpga/dfl.c | 4 +---
> drivers/hid/hid-core.c | 4 +---
> drivers/hid/intel-ish-hid/ishtp/bus.c | 4 +---
> drivers/hv/vmbus_drv.c | 5 +----
> drivers/hwtracing/intel_th/core.c | 4 +---
> drivers/i2c/i2c-core-base.c | 5 +----
> drivers/i3c/master.c | 4 +---
> drivers/input/gameport/gameport.c | 3 +--
> drivers/input/serio/serio.c | 3 +--
> drivers/ipack/ipack.c | 4 +---
> drivers/macintosh/macio_asic.c | 4 +---
> drivers/mcb/mcb-core.c | 4 +---
> drivers/media/pci/bt8xx/bttv-gpio.c | 3 +--
> drivers/memstick/core/memstick.c | 3 +--
> drivers/mfd/mcp-core.c | 3 +--
> drivers/misc/mei/bus.c | 4 +---
> drivers/misc/tifm_core.c | 3 +--
> drivers/mmc/core/bus.c | 4 +---
> drivers/mmc/core/sdio_bus.c | 4 +---
> drivers/net/netdevsim/bus.c | 3 +--
> drivers/ntb/core.c | 4 +---
> drivers/ntb/ntb_transport.c | 4 +---
> drivers/nvdimm/bus.c | 3 +--
> drivers/pci/endpoint/pci-epf-core.c | 4 +---
> drivers/pci/pci-driver.c | 3 +--
> drivers/pcmcia/ds.c | 4 +---
> drivers/platform/surface/aggregator/bus.c | 4 +---
> drivers/platform/x86/wmi.c | 4 +---
> drivers/pnp/driver.c | 3 +--
> drivers/rapidio/rio-driver.c | 4 +---
> drivers/rpmsg/rpmsg_core.c | 4 +---
> drivers/scsi/scsi_debug.c | 3 +--
> drivers/siox/siox-core.c | 4 +---
> drivers/slimbus/core.c | 4 +---
> drivers/soc/qcom/apr.c | 4 +---
> drivers/spi/spi.c | 4 +---
> drivers/spmi/spmi.c | 3 +--
> drivers/ssb/main.c | 4 +---
> drivers/staging/fieldbus/anybuss/host.c | 4 +---
> drivers/staging/greybus/gbphy.c | 4 +---
> drivers/target/loopback/tcm_loop.c | 5 ++---
> drivers/thunderbolt/domain.c | 4 +---
> drivers/tty/serdev/core.c | 4 +---
> drivers/usb/common/ulpi.c | 4 +---
> drivers/usb/serial/bus.c | 4 +---
> drivers/usb/typec/bus.c | 4 +---
> drivers/vdpa/vdpa.c | 4 +---
> drivers/vfio/mdev/mdev_driver.c | 4 +---
> drivers/virtio/virtio.c | 3 +--
> drivers/vme/vme.c | 4 +---
> drivers/xen/xenbus/xenbus.h | 2 +-
> drivers/xen/xenbus/xenbus_probe.c | 4 +---
> include/linux/device/bus.h | 2 +-
> sound/aoa/soundbus/core.c | 4 +---
> 75 files changed, 78 insertions(+), 204 deletions(-)
>
> diff --git a/arch/arm/common/locomo.c b/arch/arm/common/locomo.c
> index e45f4e4e06b6..24d21ba63030 100644
> --- a/arch/arm/common/locomo.c
> +++ b/arch/arm/common/locomo.c
> @@ -834,14 +834,13 @@ static int locomo_bus_probe(struct device *dev)
> return ret;
> }
>
> -static int locomo_bus_remove(struct device *dev)
> +static void locomo_bus_remove(struct device *dev)
> {
> struct locomo_dev *ldev = LOCOMO_DEV(dev);
> struct locomo_driver *drv = LOCOMO_DRV(dev->driver);
>
> if (drv->remove)
> drv->remove(ldev);
> - return 0;
> }
>
> struct bus_type locomo_bus_type = {
> diff --git a/arch/arm/common/sa1111.c b/arch/arm/common/sa1111.c
> index ff5e0d04cb89..092a2ebc0c28 100644
> --- a/arch/arm/common/sa1111.c
> +++ b/arch/arm/common/sa1111.c
> @@ -1364,15 +1364,13 @@ static int sa1111_bus_probe(struct device *dev)
> return ret;
> }
>
> -static int sa1111_bus_remove(struct device *dev)
> +static void sa1111_bus_remove(struct device *dev)
> {
> struct sa1111_dev *sadev = to_sa1111_device(dev);
> struct sa1111_driver *drv = SA1111_DRV(dev->driver);
>
> if (drv->remove)
> drv->remove(sadev);
> -
> - return 0;
> }
>
> struct bus_type sa1111_bus_type = {
> diff --git a/arch/arm/mach-rpc/ecard.c b/arch/arm/mach-rpc/ecard.c
> index 827b50f1c73e..53813f9464a2 100644
> --- a/arch/arm/mach-rpc/ecard.c
> +++ b/arch/arm/mach-rpc/ecard.c
> @@ -1052,7 +1052,7 @@ static int ecard_drv_probe(struct device *dev)
> return ret;
> }
>
> -static int ecard_drv_remove(struct device *dev)
> +static void ecard_drv_remove(struct device *dev)
> {
> struct expansion_card *ec = ECARD_DEV(dev);
> struct ecard_driver *drv = ECARD_DRV(dev->driver);
> @@ -1067,8 +1067,6 @@ static int ecard_drv_remove(struct device *dev)
> ec->ops = &ecard_default_ops;
> barrier();
> ec->irq_data = NULL;
> -
> - return 0;
> }
>
> /*
> diff --git a/arch/mips/sgi-ip22/ip22-gio.c b/arch/mips/sgi-ip22/ip22-gio.c
> index de0768a49ee8..dfc52f661ad0 100644
> --- a/arch/mips/sgi-ip22/ip22-gio.c
> +++ b/arch/mips/sgi-ip22/ip22-gio.c
> @@ -143,14 +143,13 @@ static int gio_device_probe(struct device *dev)
> return error;
> }
>
> -static int gio_device_remove(struct device *dev)
> +static void gio_device_remove(struct device *dev)
> {
> struct gio_device *gio_dev = to_gio_device(dev);
> struct gio_driver *drv = to_gio_driver(dev->driver);
>
> if (dev->driver && drv->remove)
> drv->remove(gio_dev);
> - return 0;
> }
>
> static void gio_device_shutdown(struct device *dev)
> diff --git a/arch/parisc/kernel/drivers.c b/arch/parisc/kernel/drivers.c
> index 80fa0650736b..776d624a7207 100644
> --- a/arch/parisc/kernel/drivers.c
> +++ b/arch/parisc/kernel/drivers.c
> @@ -133,14 +133,13 @@ static int parisc_driver_probe(struct device *dev)
> return rc;
> }
>
> -static int __exit parisc_driver_remove(struct device *dev)
> +static void __exit parisc_driver_remove(struct device *dev)
> {
> struct parisc_device *pa_dev = to_parisc_device(dev);
> struct parisc_driver *pa_drv = to_parisc_driver(dev->driver);
> +
> if (pa_drv->remove)
> pa_drv->remove(pa_dev);
> -
> - return 0;
> }
>
>
> diff --git a/arch/powerpc/platforms/ps3/system-bus.c b/arch/powerpc/platforms/ps3/system-bus.c
> index 1a5665875165..cc5774c64fae 100644
> --- a/arch/powerpc/platforms/ps3/system-bus.c
> +++ b/arch/powerpc/platforms/ps3/system-bus.c
> @@ -381,7 +381,7 @@ static int ps3_system_bus_probe(struct device *_dev)
> return result;
> }
>
> -static int ps3_system_bus_remove(struct device *_dev)
> +static void ps3_system_bus_remove(struct device *_dev)
> {
> struct ps3_system_bus_device *dev = ps3_dev_to_system_bus_dev(_dev);
> struct ps3_system_bus_driver *drv;
> @@ -399,7 +399,6 @@ static int ps3_system_bus_remove(struct device *_dev)
> __func__, __LINE__, drv->core.name);
>
> pr_debug(" <- %s:%d: %s\n", __func__, __LINE__, dev_name(&dev->core));
> - return 0;
> }
>
> static void ps3_system_bus_shutdown(struct device *_dev)
> diff --git a/arch/powerpc/platforms/pseries/ibmebus.c b/arch/powerpc/platforms/pseries/ibmebus.c
> index c6c79ef55e13..7ee3ed7d6cc2 100644
> --- a/arch/powerpc/platforms/pseries/ibmebus.c
> +++ b/arch/powerpc/platforms/pseries/ibmebus.c
> @@ -366,14 +366,13 @@ static int ibmebus_bus_device_probe(struct device *dev)
> return error;
> }
>
> -static int ibmebus_bus_device_remove(struct device *dev)
> +static void ibmebus_bus_device_remove(struct device *dev)
> {
> struct platform_device *of_dev = to_platform_device(dev);
> struct platform_driver *drv = to_platform_driver(dev->driver);
>
> if (dev->driver && drv->remove)
> drv->remove(of_dev);
> - return 0;
> }
>
> static void ibmebus_bus_device_shutdown(struct device *dev)
> diff --git a/arch/powerpc/platforms/pseries/vio.c b/arch/powerpc/platforms/pseries/vio.c
> index e00f3725ec96..58283cecbd52 100644
> --- a/arch/powerpc/platforms/pseries/vio.c
> +++ b/arch/powerpc/platforms/pseries/vio.c
> @@ -1257,7 +1257,7 @@ static int vio_bus_probe(struct device *dev)
> }
>
> /* convert from struct device to struct vio_dev and pass to driver. */
> -static int vio_bus_remove(struct device *dev)
> +static void vio_bus_remove(struct device *dev)
> {
> struct vio_dev *viodev = to_vio_dev(dev);
> struct vio_driver *viodrv = to_vio_driver(dev->driver);
> @@ -1276,7 +1276,6 @@ static int vio_bus_remove(struct device *dev)
> vio_cmo_bus_remove(viodev);
>
> put_device(devptr);
> - return 0;
> }
>
> static void vio_bus_shutdown(struct device *dev)
> diff --git a/drivers/acpi/bus.c b/drivers/acpi/bus.c
> index ee24246d88fd..51f374e42869 100644
> --- a/drivers/acpi/bus.c
> +++ b/drivers/acpi/bus.c
> @@ -1018,7 +1018,7 @@ static int acpi_device_probe(struct device *dev)
> return 0;
> }
>
> -static int acpi_device_remove(struct device *dev)
> +static void acpi_device_remove(struct device *dev)
> {
> struct acpi_device *acpi_dev = to_acpi_device(dev);
> struct acpi_driver *acpi_drv = acpi_dev->driver;
> @@ -1033,7 +1033,6 @@ static int acpi_device_remove(struct device *dev)
> acpi_dev->driver_data = NULL;
>
> put_device(dev);
> - return 0;
> }
>
> struct bus_type acpi_bus_type = {
> diff --git a/drivers/amba/bus.c b/drivers/amba/bus.c
> index 939ca220bf78..962041148482 100644
> --- a/drivers/amba/bus.c
> +++ b/drivers/amba/bus.c
> @@ -219,7 +219,7 @@ static int amba_probe(struct device *dev)
> return ret;
> }
>
> -static int amba_remove(struct device *dev)
> +static void amba_remove(struct device *dev)
> {
> struct amba_device *pcdev = to_amba_device(dev);
> struct amba_driver *drv = to_amba_driver(dev->driver);
> @@ -236,8 +236,6 @@ static int amba_remove(struct device *dev)
>
> amba_put_disable_pclk(pcdev);
> dev_pm_domain_detach(dev, true);
> -
> - return 0;
> }
>
> static void amba_shutdown(struct device *dev)
> diff --git a/drivers/base/auxiliary.c b/drivers/base/auxiliary.c
> index adc199dfba3c..0c86f5bed9f4 100644
> --- a/drivers/base/auxiliary.c
> +++ b/drivers/base/auxiliary.c
> @@ -79,7 +79,7 @@ static int auxiliary_bus_probe(struct device *dev)
> return ret;
> }
>
> -static int auxiliary_bus_remove(struct device *dev)
> +static void auxiliary_bus_remove(struct device *dev)
> {
> struct auxiliary_driver *auxdrv = to_auxiliary_drv(dev->driver);
> struct auxiliary_device *auxdev = to_auxiliary_dev(dev);
> @@ -87,8 +87,6 @@ static int auxiliary_bus_remove(struct device *dev)
> if (auxdrv->remove)
> auxdrv->remove(auxdev);
> dev_pm_domain_detach(dev, true);
> -
> - return 0;
> }
>
> static void auxiliary_bus_shutdown(struct device *dev)
> diff --git a/drivers/base/isa.c b/drivers/base/isa.c
> index aa4737667026..55e3ee2da98f 100644
> --- a/drivers/base/isa.c
> +++ b/drivers/base/isa.c
> @@ -46,14 +46,12 @@ static int isa_bus_probe(struct device *dev)
> return 0;
> }
>
> -static int isa_bus_remove(struct device *dev)
> +static void isa_bus_remove(struct device *dev)
> {
> struct isa_driver *isa_driver = dev->platform_data;
>
> if (isa_driver && isa_driver->remove)
> isa_driver->remove(dev, to_isa_dev(dev)->id);
> -
> - return 0;
> }
>
> static void isa_bus_shutdown(struct device *dev)
> diff --git a/drivers/base/platform.c b/drivers/base/platform.c
> index 8640578f45e9..a94b7f454881 100644
> --- a/drivers/base/platform.c
> +++ b/drivers/base/platform.c
> @@ -1438,7 +1438,7 @@ static int platform_probe(struct device *_dev)
> return ret;
> }
>
> -static int platform_remove(struct device *_dev)
> +static void platform_remove(struct device *_dev)
> {
> struct platform_driver *drv = to_platform_driver(_dev->driver);
> struct platform_device *dev = to_platform_device(_dev);
> @@ -1450,8 +1450,6 @@ static int platform_remove(struct device *_dev)
> dev_warn(_dev, "remove callback returned a non-zero value. This will be ignored.\n");
> }
> dev_pm_domain_detach(_dev, true);
> -
> - return 0;
> }
>
> static void platform_shutdown(struct device *_dev)
> diff --git a/drivers/bcma/main.c b/drivers/bcma/main.c
> index 6535614a7dc1..e076630d17bd 100644
> --- a/drivers/bcma/main.c
> +++ b/drivers/bcma/main.c
> @@ -27,7 +27,7 @@ static DEFINE_MUTEX(bcma_buses_mutex);
>
> static int bcma_bus_match(struct device *dev, struct device_driver *drv);
> static int bcma_device_probe(struct device *dev);
> -static int bcma_device_remove(struct device *dev);
> +static void bcma_device_remove(struct device *dev);
> static int bcma_device_uevent(struct device *dev, struct kobj_uevent_env *env);
>
> static ssize_t manuf_show(struct device *dev, struct device_attribute *attr, char *buf)
> @@ -614,7 +614,7 @@ static int bcma_device_probe(struct device *dev)
> return err;
> }
>
> -static int bcma_device_remove(struct device *dev)
> +static void bcma_device_remove(struct device *dev)
> {
> struct bcma_device *core = container_of(dev, struct bcma_device, dev);
> struct bcma_driver *adrv = container_of(dev->driver, struct bcma_driver,
> @@ -623,8 +623,6 @@ static int bcma_device_remove(struct device *dev)
> if (adrv->remove)
> adrv->remove(core);
> put_device(dev);
> -
> - return 0;
> }
>
> static int bcma_device_uevent(struct device *dev, struct kobj_uevent_env *env)
> diff --git a/drivers/bus/sunxi-rsb.c b/drivers/bus/sunxi-rsb.c
> index d46db132d085..6f225dddc74f 100644
> --- a/drivers/bus/sunxi-rsb.c
> +++ b/drivers/bus/sunxi-rsb.c
> @@ -169,13 +169,11 @@ static int sunxi_rsb_device_probe(struct device *dev)
> return drv->probe(rdev);
> }
>
> -static int sunxi_rsb_device_remove(struct device *dev)
> +static void sunxi_rsb_device_remove(struct device *dev)
> {
> const struct sunxi_rsb_driver *drv = to_sunxi_rsb_driver(dev->driver);
>
> drv->remove(to_sunxi_rsb_device(dev));
> -
> - return 0;
> }
>
> static struct bus_type sunxi_rsb_bus = {
> diff --git a/drivers/cxl/core.c b/drivers/cxl/core.c
> index a2e4d54fc7bc..2b90b7c3b9d7 100644
> --- a/drivers/cxl/core.c
> +++ b/drivers/cxl/core.c
> @@ -1034,13 +1034,12 @@ static int cxl_bus_probe(struct device *dev)
> return to_cxl_drv(dev->driver)->probe(dev);
> }
>
> -static int cxl_bus_remove(struct device *dev)
> +static void cxl_bus_remove(struct device *dev)
> {
> struct cxl_driver *cxl_drv = to_cxl_drv(dev->driver);
>
> if (cxl_drv->remove)
> cxl_drv->remove(dev);
> - return 0;
> }
>
> struct bus_type cxl_bus_type = {
> diff --git a/drivers/dax/bus.c b/drivers/dax/bus.c
> index 5aee26e1bbd6..6cc4da4c713d 100644
> --- a/drivers/dax/bus.c
> +++ b/drivers/dax/bus.c
> @@ -172,15 +172,13 @@ static int dax_bus_probe(struct device *dev)
> return 0;
> }
>
> -static int dax_bus_remove(struct device *dev)
> +static void dax_bus_remove(struct device *dev)
> {
> struct dax_device_driver *dax_drv = to_dax_drv(dev->driver);
> struct dev_dax *dev_dax = to_dev_dax(dev);
>
> if (dax_drv->remove)
> dax_drv->remove(dev_dax);
> -
> - return 0;
> }
>
> static struct bus_type dax_bus_type = {
> diff --git a/drivers/dma/idxd/sysfs.c b/drivers/dma/idxd/sysfs.c
> index 0460d58e3941..5a017c62c752 100644
> --- a/drivers/dma/idxd/sysfs.c
> +++ b/drivers/dma/idxd/sysfs.c
> @@ -260,7 +260,7 @@ static void disable_wq(struct idxd_wq *wq)
> dev_info(dev, "wq %s disabled\n", dev_name(&wq->conf_dev));
> }
>
> -static int idxd_config_bus_remove(struct device *dev)
> +static void idxd_config_bus_remove(struct device *dev)
> {
> int rc;
>
> @@ -305,8 +305,6 @@ static int idxd_config_bus_remove(struct device *dev)
> dev_info(dev, "Device %s disabled\n", dev_name(dev));
>
> }
> -
> - return 0;
> }
>
> static void idxd_config_bus_shutdown(struct device *dev)
> diff --git a/drivers/firewire/core-device.c b/drivers/firewire/core-device.c
> index 68216988391f..90ed8fdaba75 100644
> --- a/drivers/firewire/core-device.c
> +++ b/drivers/firewire/core-device.c
> @@ -187,14 +187,12 @@ static int fw_unit_probe(struct device *dev)
> return driver->probe(fw_unit(dev), unit_match(dev, dev->driver));
> }
>
> -static int fw_unit_remove(struct device *dev)
> +static void fw_unit_remove(struct device *dev)
> {
> struct fw_driver *driver =
> container_of(dev->driver, struct fw_driver, driver);
>
> driver->remove(fw_unit(dev));
> -
> - return 0;
> }
>
> static int get_modalias(struct fw_unit *unit, char *buffer, size_t buffer_size)
> diff --git a/drivers/firmware/arm_scmi/bus.c b/drivers/firmware/arm_scmi/bus.c
> index 784cf0027da3..2682c3df651c 100644
> --- a/drivers/firmware/arm_scmi/bus.c
> +++ b/drivers/firmware/arm_scmi/bus.c
> @@ -116,15 +116,13 @@ static int scmi_dev_probe(struct device *dev)
> return scmi_drv->probe(scmi_dev);
> }
>
> -static int scmi_dev_remove(struct device *dev)
> +static void scmi_dev_remove(struct device *dev)
> {
> struct scmi_driver *scmi_drv = to_scmi_driver(dev->driver);
> struct scmi_device *scmi_dev = to_scmi_dev(dev);
>
> if (scmi_drv->remove)
> scmi_drv->remove(scmi_dev);
> -
> - return 0;
> }
>
> static struct bus_type scmi_bus_type = {
> diff --git a/drivers/firmware/google/coreboot_table.c b/drivers/firmware/google/coreboot_table.c
> index dc83ea118c67..c52bcaa9def6 100644
> --- a/drivers/firmware/google/coreboot_table.c
> +++ b/drivers/firmware/google/coreboot_table.c
> @@ -44,15 +44,13 @@ static int coreboot_bus_probe(struct device *dev)
> return ret;
> }
>
> -static int coreboot_bus_remove(struct device *dev)
> +static void coreboot_bus_remove(struct device *dev)
> {
> struct coreboot_device *device = CB_DEV(dev);
> struct coreboot_driver *driver = CB_DRV(dev->driver);
>
> if (driver->remove)
> driver->remove(device);
> -
> - return 0;
> }
>
> static struct bus_type coreboot_bus_type = {
> diff --git a/drivers/fpga/dfl.c b/drivers/fpga/dfl.c
> index 511b20ff35a3..1ae6779a0dd6 100644
> --- a/drivers/fpga/dfl.c
> +++ b/drivers/fpga/dfl.c
> @@ -284,15 +284,13 @@ static int dfl_bus_probe(struct device *dev)
> return ddrv->probe(ddev);
> }
>
> -static int dfl_bus_remove(struct device *dev)
> +static void dfl_bus_remove(struct device *dev)
> {
> struct dfl_driver *ddrv = to_dfl_drv(dev->driver);
> struct dfl_device *ddev = to_dfl_dev(dev);
>
> if (ddrv->remove)
> ddrv->remove(ddev);
> -
> - return 0;
> }
>
> static int dfl_bus_uevent(struct device *dev, struct kobj_uevent_env *env)
> diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c
> index 7db332139f7d..dbed2524fd47 100644
> --- a/drivers/hid/hid-core.c
> +++ b/drivers/hid/hid-core.c
> @@ -2302,7 +2302,7 @@ static int hid_device_probe(struct device *dev)
> return ret;
> }
>
> -static int hid_device_remove(struct device *dev)
> +static void hid_device_remove(struct device *dev)
> {
> struct hid_device *hdev = to_hid_device(dev);
> struct hid_driver *hdrv;
> @@ -2322,8 +2322,6 @@ static int hid_device_remove(struct device *dev)
>
> if (!hdev->io_started)
> up(&hdev->driver_input_lock);
> -
> - return 0;
> }
>
> static ssize_t modalias_show(struct device *dev, struct device_attribute *a,
> diff --git a/drivers/hid/intel-ish-hid/ishtp/bus.c b/drivers/hid/intel-ish-hid/ishtp/bus.c
> index f0802b047ed8..8a51bd9cd093 100644
> --- a/drivers/hid/intel-ish-hid/ishtp/bus.c
> +++ b/drivers/hid/intel-ish-hid/ishtp/bus.c
> @@ -255,7 +255,7 @@ static int ishtp_cl_bus_match(struct device *dev, struct device_driver *drv)
> *
> * Return: Return value from driver remove() call.
> */
> -static int ishtp_cl_device_remove(struct device *dev)
> +static void ishtp_cl_device_remove(struct device *dev)
> {
> struct ishtp_cl_device *device = to_ishtp_cl_device(dev);
> struct ishtp_cl_driver *driver = to_ishtp_cl_driver(dev->driver);
> @@ -267,8 +267,6 @@ static int ishtp_cl_device_remove(struct device *dev)
>
> if (driver->remove)
> driver->remove(device);
> -
> - return 0;
> }
>
> /**
> diff --git a/drivers/hv/vmbus_drv.c b/drivers/hv/vmbus_drv.c
> index 57bbbaa4e8f7..392c1ac4f819 100644
> --- a/drivers/hv/vmbus_drv.c
> +++ b/drivers/hv/vmbus_drv.c
> @@ -922,7 +922,7 @@ static int vmbus_probe(struct device *child_device)
> /*
> * vmbus_remove - Remove a vmbus device
> */
> -static int vmbus_remove(struct device *child_device)
> +static void vmbus_remove(struct device *child_device)
> {
> struct hv_driver *drv;
> struct hv_device *dev = device_to_hv_device(child_device);
> @@ -932,11 +932,8 @@ static int vmbus_remove(struct device *child_device)
> if (drv->remove)
> drv->remove(dev);
> }
> -
> - return 0;
> }
>
> -
> /*
> * vmbus_shutdown - Shutdown a vmbus device
> */
> diff --git a/drivers/hwtracing/intel_th/core.c b/drivers/hwtracing/intel_th/core.c
> index 66eed2dff818..7e753a75d23b 100644
> --- a/drivers/hwtracing/intel_th/core.c
> +++ b/drivers/hwtracing/intel_th/core.c
> @@ -95,7 +95,7 @@ static int intel_th_probe(struct device *dev)
>
> static void intel_th_device_remove(struct intel_th_device *thdev);
>
> -static int intel_th_remove(struct device *dev)
> +static void intel_th_remove(struct device *dev)
> {
> struct intel_th_driver *thdrv = to_intel_th_driver(dev->driver);
> struct intel_th_device *thdev = to_intel_th_device(dev);
> @@ -164,8 +164,6 @@ static int intel_th_remove(struct device *dev)
> pm_runtime_disable(dev);
> pm_runtime_set_active(dev);
> pm_runtime_enable(dev);
> -
> - return 0;
> }
>
> static struct bus_type intel_th_bus = {
> diff --git a/drivers/i2c/i2c-core-base.c b/drivers/i2c/i2c-core-base.c
> index 84f12bf90644..54964fbe3f03 100644
> --- a/drivers/i2c/i2c-core-base.c
> +++ b/drivers/i2c/i2c-core-base.c
> @@ -601,7 +601,7 @@ static int i2c_device_probe(struct device *dev)
> return status;
> }
>
> -static int i2c_device_remove(struct device *dev)
> +static void i2c_device_remove(struct device *dev)
> {
> struct i2c_client *client = to_i2c_client(dev);
> struct i2c_adapter *adap;
> @@ -631,9 +631,6 @@ static int i2c_device_remove(struct device *dev)
> client->irq = 0;
> if (client->flags & I2C_CLIENT_HOST_NOTIFY)
> pm_runtime_put(&client->adapter->dev);
> -
> - /* return always 0 because there is WIP to make remove-functions void */
> - return 0;
> }
>
> #ifdef CONFIG_PM_SLEEP
> diff --git a/drivers/i3c/master.c b/drivers/i3c/master.c
> index e2e12a5585e5..c3b4c677b442 100644
> --- a/drivers/i3c/master.c
> +++ b/drivers/i3c/master.c
> @@ -322,7 +322,7 @@ static int i3c_device_probe(struct device *dev)
> return driver->probe(i3cdev);
> }
>
> -static int i3c_device_remove(struct device *dev)
> +static void i3c_device_remove(struct device *dev)
> {
> struct i3c_device *i3cdev = dev_to_i3cdev(dev);
> struct i3c_driver *driver = drv_to_i3cdrv(dev->driver);
> @@ -331,8 +331,6 @@ static int i3c_device_remove(struct device *dev)
> driver->remove(i3cdev);
>
> i3c_device_free_ibi(i3cdev);
> -
> - return 0;
> }
>
> struct bus_type i3c_bus_type = {
> diff --git a/drivers/input/gameport/gameport.c b/drivers/input/gameport/gameport.c
> index 61fa7e724172..db58a01b23d3 100644
> --- a/drivers/input/gameport/gameport.c
> +++ b/drivers/input/gameport/gameport.c
> @@ -697,13 +697,12 @@ static int gameport_driver_probe(struct device *dev)
> return gameport->drv ? 0 : -ENODEV;
> }
>
> -static int gameport_driver_remove(struct device *dev)
> +static void gameport_driver_remove(struct device *dev)
> {
> struct gameport *gameport = to_gameport_port(dev);
> struct gameport_driver *drv = to_gameport_driver(dev->driver);
>
> drv->disconnect(gameport);
> - return 0;
> }
>
> static void gameport_attach_driver(struct gameport_driver *drv)
> diff --git a/drivers/input/serio/serio.c b/drivers/input/serio/serio.c
> index 29f491082926..ec117be3d8d8 100644
> --- a/drivers/input/serio/serio.c
> +++ b/drivers/input/serio/serio.c
> @@ -778,12 +778,11 @@ static int serio_driver_probe(struct device *dev)
> return serio_connect_driver(serio, drv);
> }
>
> -static int serio_driver_remove(struct device *dev)
> +static void serio_driver_remove(struct device *dev)
> {
> struct serio *serio = to_serio_port(dev);
>
> serio_disconnect_driver(serio);
> - return 0;
> }
>
> static void serio_cleanup(struct serio *serio)
> diff --git a/drivers/ipack/ipack.c b/drivers/ipack/ipack.c
> index 7de9605cac4f..b1c3198355e7 100644
> --- a/drivers/ipack/ipack.c
> +++ b/drivers/ipack/ipack.c
> @@ -67,15 +67,13 @@ static int ipack_bus_probe(struct device *device)
> return drv->ops->probe(dev);
> }
>
> -static int ipack_bus_remove(struct device *device)
> +static void ipack_bus_remove(struct device *device)
> {
> struct ipack_device *dev = to_ipack_dev(device);
> struct ipack_driver *drv = to_ipack_driver(device->driver);
>
> if (drv->ops->remove)
> drv->ops->remove(dev);
> -
> - return 0;
> }
>
> static int ipack_uevent(struct device *dev, struct kobj_uevent_env *env)
> diff --git a/drivers/macintosh/macio_asic.c b/drivers/macintosh/macio_asic.c
> index 49af60bdac92..c1fdf2896021 100644
> --- a/drivers/macintosh/macio_asic.c
> +++ b/drivers/macintosh/macio_asic.c
> @@ -88,7 +88,7 @@ static int macio_device_probe(struct device *dev)
> return error;
> }
>
> -static int macio_device_remove(struct device *dev)
> +static void macio_device_remove(struct device *dev)
> {
> struct macio_dev * macio_dev = to_macio_device(dev);
> struct macio_driver * drv = to_macio_driver(dev->driver);
> @@ -96,8 +96,6 @@ static int macio_device_remove(struct device *dev)
> if (dev->driver && drv->remove)
> drv->remove(macio_dev);
> macio_dev_put(macio_dev);
> -
> - return 0;
> }
>
> static void macio_device_shutdown(struct device *dev)
> diff --git a/drivers/mcb/mcb-core.c b/drivers/mcb/mcb-core.c
> index 38fbb3b59873..edf4ee6eff25 100644
> --- a/drivers/mcb/mcb-core.c
> +++ b/drivers/mcb/mcb-core.c
> @@ -77,7 +77,7 @@ static int mcb_probe(struct device *dev)
> return ret;
> }
>
> -static int mcb_remove(struct device *dev)
> +static void mcb_remove(struct device *dev)
> {
> struct mcb_driver *mdrv = to_mcb_driver(dev->driver);
> struct mcb_device *mdev = to_mcb_device(dev);
> @@ -89,8 +89,6 @@ static int mcb_remove(struct device *dev)
> module_put(carrier_mod);
>
> put_device(&mdev->dev);
> -
> - return 0;
> }
>
> static void mcb_shutdown(struct device *dev)
> diff --git a/drivers/media/pci/bt8xx/bttv-gpio.c b/drivers/media/pci/bt8xx/bttv-gpio.c
> index b730225ca887..a2b18e2bed1b 100644
> --- a/drivers/media/pci/bt8xx/bttv-gpio.c
> +++ b/drivers/media/pci/bt8xx/bttv-gpio.c
> @@ -46,14 +46,13 @@ static int bttv_sub_probe(struct device *dev)
> return sub->probe ? sub->probe(sdev) : -ENODEV;
> }
>
> -static int bttv_sub_remove(struct device *dev)
> +static void bttv_sub_remove(struct device *dev)
> {
> struct bttv_sub_device *sdev = to_bttv_sub_dev(dev);
> struct bttv_sub_driver *sub = to_bttv_sub_drv(dev->driver);
>
> if (sub->remove)
> sub->remove(sdev);
> - return 0;
> }
>
> struct bus_type bttv_sub_bus_type = {
> diff --git a/drivers/memstick/core/memstick.c b/drivers/memstick/core/memstick.c
> index bb1065990aeb..660df7d269fa 100644
> --- a/drivers/memstick/core/memstick.c
> +++ b/drivers/memstick/core/memstick.c
> @@ -91,7 +91,7 @@ static int memstick_device_probe(struct device *dev)
> return rc;
> }
>
> -static int memstick_device_remove(struct device *dev)
> +static void memstick_device_remove(struct device *dev)
> {
> struct memstick_dev *card = container_of(dev, struct memstick_dev,
> dev);
> @@ -105,7 +105,6 @@ static int memstick_device_remove(struct device *dev)
> }
>
> put_device(dev);
> - return 0;
> }
>
> #ifdef CONFIG_PM
> diff --git a/drivers/mfd/mcp-core.c b/drivers/mfd/mcp-core.c
> index eff9423e90f5..2fa592c37c6f 100644
> --- a/drivers/mfd/mcp-core.c
> +++ b/drivers/mfd/mcp-core.c
> @@ -33,13 +33,12 @@ static int mcp_bus_probe(struct device *dev)
> return drv->probe(mcp);
> }
>
> -static int mcp_bus_remove(struct device *dev)
> +static void mcp_bus_remove(struct device *dev)
> {
> struct mcp *mcp = to_mcp(dev);
> struct mcp_driver *drv = to_mcp_driver(dev->driver);
>
> drv->remove(mcp);
> - return 0;
> }
>
> static struct bus_type mcp_bus_type = {
> diff --git a/drivers/misc/mei/bus.c b/drivers/misc/mei/bus.c
> index 935acc6bbf3c..3bf2bb4fd152 100644
> --- a/drivers/misc/mei/bus.c
> +++ b/drivers/misc/mei/bus.c
> @@ -884,7 +884,7 @@ static int mei_cl_device_probe(struct device *dev)
> *
> * Return: 0 on success; < 0 otherwise
> */
> -static int mei_cl_device_remove(struct device *dev)
> +static void mei_cl_device_remove(struct device *dev)
> {
> struct mei_cl_device *cldev = to_mei_cl_device(dev);
> struct mei_cl_driver *cldrv = to_mei_cl_driver(dev->driver);
> @@ -896,8 +896,6 @@ static int mei_cl_device_remove(struct device *dev)
>
> mei_cl_bus_module_put(cldev);
> module_put(THIS_MODULE);
> -
> - return 0;
> }
>
> static ssize_t name_show(struct device *dev, struct device_attribute *a,
> diff --git a/drivers/misc/tifm_core.c b/drivers/misc/tifm_core.c
> index 667e574a7df2..52656fc87e99 100644
> --- a/drivers/misc/tifm_core.c
> +++ b/drivers/misc/tifm_core.c
> @@ -87,7 +87,7 @@ static void tifm_dummy_event(struct tifm_dev *sock)
> return;
> }
>
> -static int tifm_device_remove(struct device *dev)
> +static void tifm_device_remove(struct device *dev)
> {
> struct tifm_dev *sock = container_of(dev, struct tifm_dev, dev);
> struct tifm_driver *drv = container_of(dev->driver, struct tifm_driver,
> @@ -101,7 +101,6 @@ static int tifm_device_remove(struct device *dev)
> }
>
> put_device(dev);
> - return 0;
> }
>
> #ifdef CONFIG_PM
> diff --git a/drivers/mmc/core/bus.c b/drivers/mmc/core/bus.c
> index 4383c262b3f5..f6b7a9c5bbff 100644
> --- a/drivers/mmc/core/bus.c
> +++ b/drivers/mmc/core/bus.c
> @@ -140,14 +140,12 @@ static int mmc_bus_probe(struct device *dev)
> return drv->probe(card);
> }
>
> -static int mmc_bus_remove(struct device *dev)
> +static void mmc_bus_remove(struct device *dev)
> {
> struct mmc_driver *drv = to_mmc_driver(dev->driver);
> struct mmc_card *card = mmc_dev_to_card(dev);
>
> drv->remove(card);
> -
> - return 0;
> }
>
> static void mmc_bus_shutdown(struct device *dev)
> diff --git a/drivers/mmc/core/sdio_bus.c b/drivers/mmc/core/sdio_bus.c
> index 3d709029e07c..fda03b35c14a 100644
> --- a/drivers/mmc/core/sdio_bus.c
> +++ b/drivers/mmc/core/sdio_bus.c
> @@ -203,7 +203,7 @@ static int sdio_bus_probe(struct device *dev)
> return ret;
> }
>
> -static int sdio_bus_remove(struct device *dev)
> +static void sdio_bus_remove(struct device *dev)
> {
> struct sdio_driver *drv = to_sdio_driver(dev->driver);
> struct sdio_func *func = dev_to_sdio_func(dev);
> @@ -232,8 +232,6 @@ static int sdio_bus_remove(struct device *dev)
> pm_runtime_put_sync(dev);
>
> dev_pm_domain_detach(dev, false);
> -
> - return 0;
> }
>
> static const struct dev_pm_ops sdio_bus_pm_ops = {
> diff --git a/drivers/net/netdevsim/bus.c b/drivers/net/netdevsim/bus.c
> index ccec29970d5b..14b154929533 100644
> --- a/drivers/net/netdevsim/bus.c
> +++ b/drivers/net/netdevsim/bus.c
> @@ -370,12 +370,11 @@ static int nsim_bus_probe(struct device *dev)
> return nsim_dev_probe(nsim_bus_dev);
> }
>
> -static int nsim_bus_remove(struct device *dev)
> +static void nsim_bus_remove(struct device *dev)
> {
> struct nsim_bus_dev *nsim_bus_dev = to_nsim_bus_dev(dev);
>
> nsim_dev_remove(nsim_bus_dev);
> - return 0;
> }
>
> static int nsim_num_vf(struct device *dev)
> diff --git a/drivers/ntb/core.c b/drivers/ntb/core.c
> index f8f75a504a58..27dd93deff6e 100644
> --- a/drivers/ntb/core.c
> +++ b/drivers/ntb/core.c
> @@ -271,7 +271,7 @@ static int ntb_probe(struct device *dev)
> return rc;
> }
>
> -static int ntb_remove(struct device *dev)
> +static void ntb_remove(struct device *dev)
> {
> struct ntb_dev *ntb;
> struct ntb_client *client;
> @@ -283,8 +283,6 @@ static int ntb_remove(struct device *dev)
> client->ops.remove(client, ntb);
> put_device(dev);
> }
> -
> - return 0;
> }
>
> static void ntb_dev_release(struct device *dev)
> diff --git a/drivers/ntb/ntb_transport.c b/drivers/ntb/ntb_transport.c
> index 4a02561cfb96..a9b97ebc71ac 100644
> --- a/drivers/ntb/ntb_transport.c
> +++ b/drivers/ntb/ntb_transport.c
> @@ -304,7 +304,7 @@ static int ntb_transport_bus_probe(struct device *dev)
> return rc;
> }
>
> -static int ntb_transport_bus_remove(struct device *dev)
> +static void ntb_transport_bus_remove(struct device *dev)
> {
> const struct ntb_transport_client *client;
>
> @@ -312,8 +312,6 @@ static int ntb_transport_bus_remove(struct device *dev)
> client->remove(dev);
>
> put_device(dev);
> -
> - return 0;
> }
>
> static struct bus_type ntb_transport_bus = {
> diff --git a/drivers/nvdimm/bus.c b/drivers/nvdimm/bus.c
> index e6aa87043a95..9dc7f3edd42b 100644
> --- a/drivers/nvdimm/bus.c
> +++ b/drivers/nvdimm/bus.c
> @@ -108,7 +108,7 @@ static int nvdimm_bus_probe(struct device *dev)
> return rc;
> }
>
> -static int nvdimm_bus_remove(struct device *dev)
> +static void nvdimm_bus_remove(struct device *dev)
> {
> struct nd_device_driver *nd_drv = to_nd_device_driver(dev->driver);
> struct module *provider = to_bus_provider(dev);
> @@ -123,7 +123,6 @@ static int nvdimm_bus_remove(struct device *dev)
> dev_dbg(&nvdimm_bus->dev, "%s.remove(%s)\n", dev->driver->name,
> dev_name(dev));
> module_put(provider);
> - return 0;
> }
>
> static void nvdimm_bus_shutdown(struct device *dev)
> diff --git a/drivers/pci/endpoint/pci-epf-core.c b/drivers/pci/endpoint/pci-epf-core.c
> index 4b9ad96bf1b2..502eb79cd551 100644
> --- a/drivers/pci/endpoint/pci-epf-core.c
> +++ b/drivers/pci/endpoint/pci-epf-core.c
> @@ -387,7 +387,7 @@ static int pci_epf_device_probe(struct device *dev)
> return driver->probe(epf);
> }
>
> -static int pci_epf_device_remove(struct device *dev)
> +static void pci_epf_device_remove(struct device *dev)
> {
> struct pci_epf *epf = to_pci_epf(dev);
> struct pci_epf_driver *driver = to_pci_epf_driver(dev->driver);
> @@ -395,8 +395,6 @@ static int pci_epf_device_remove(struct device *dev)
> if (driver->remove)
> driver->remove(epf);
> epf->driver = NULL;
> -
> - return 0;
> }
>
> static struct bus_type pci_epf_bus_type = {
> diff --git a/drivers/pci/pci-driver.c b/drivers/pci/pci-driver.c
> index 3a72352aa5cf..a0615395500a 100644
> --- a/drivers/pci/pci-driver.c
> +++ b/drivers/pci/pci-driver.c
> @@ -440,7 +440,7 @@ static int pci_device_probe(struct device *dev)
> return error;
> }
>
> -static int pci_device_remove(struct device *dev)
> +static void pci_device_remove(struct device *dev)
> {
> struct pci_dev *pci_dev = to_pci_dev(dev);
> struct pci_driver *drv = pci_dev->driver;
> @@ -476,7 +476,6 @@ static int pci_device_remove(struct device *dev)
> */
>
> pci_dev_put(pci_dev);
> - return 0;
> }
>
> static void pci_device_shutdown(struct device *dev)
> diff --git a/drivers/pcmcia/ds.c b/drivers/pcmcia/ds.c
> index bd81aa64d011..5bd1b80424e7 100644
> --- a/drivers/pcmcia/ds.c
> +++ b/drivers/pcmcia/ds.c
> @@ -350,7 +350,7 @@ static void pcmcia_card_remove(struct pcmcia_socket *s, struct pcmcia_device *le
> return;
> }
>
> -static int pcmcia_device_remove(struct device *dev)
> +static void pcmcia_device_remove(struct device *dev)
> {
> struct pcmcia_device *p_dev;
> struct pcmcia_driver *p_drv;
> @@ -389,8 +389,6 @@ static int pcmcia_device_remove(struct device *dev)
> /* references from pcmcia_device_probe */
> pcmcia_put_dev(p_dev);
> module_put(p_drv->owner);
> -
> - return 0;
> }
>
>
> diff --git a/drivers/platform/surface/aggregator/bus.c b/drivers/platform/surface/aggregator/bus.c
> index 0169677c243e..0a40dd9c94ed 100644
> --- a/drivers/platform/surface/aggregator/bus.c
> +++ b/drivers/platform/surface/aggregator/bus.c
> @@ -316,14 +316,12 @@ static int ssam_bus_probe(struct device *dev)
> ->probe(to_ssam_device(dev));
> }
>
> -static int ssam_bus_remove(struct device *dev)
> +static void ssam_bus_remove(struct device *dev)
> {
> struct ssam_device_driver *sdrv = to_ssam_device_driver(dev->driver);
>
> if (sdrv->remove)
> sdrv->remove(to_ssam_device(dev));
> -
> - return 0;
> }
>
> struct bus_type ssam_bus_type = {
> diff --git a/drivers/platform/x86/wmi.c b/drivers/platform/x86/wmi.c
> index 62e0d56a3332..a76313006bdc 100644
> --- a/drivers/platform/x86/wmi.c
> +++ b/drivers/platform/x86/wmi.c
> @@ -980,7 +980,7 @@ static int wmi_dev_probe(struct device *dev)
> return ret;
> }
>
> -static int wmi_dev_remove(struct device *dev)
> +static void wmi_dev_remove(struct device *dev)
> {
> struct wmi_block *wblock = dev_to_wblock(dev);
> struct wmi_driver *wdriver =
> @@ -997,8 +997,6 @@ static int wmi_dev_remove(struct device *dev)
>
> if (ACPI_FAILURE(wmi_method_enable(wblock, 0)))
> dev_warn(dev, "failed to disable device\n");
> -
> - return 0;
> }
>
> static struct class wmi_bus_class = {
> diff --git a/drivers/pnp/driver.c b/drivers/pnp/driver.c
> index c29d590c5e4f..cc6757dfa3f1 100644
> --- a/drivers/pnp/driver.c
> +++ b/drivers/pnp/driver.c
> @@ -123,7 +123,7 @@ static int pnp_device_probe(struct device *dev)
> return error;
> }
>
> -static int pnp_device_remove(struct device *dev)
> +static void pnp_device_remove(struct device *dev)
> {
> struct pnp_dev *pnp_dev = to_pnp_dev(dev);
> struct pnp_driver *drv = pnp_dev->driver;
> @@ -139,7 +139,6 @@ static int pnp_device_remove(struct device *dev)
> pnp_disable_dev(pnp_dev);
>
> pnp_device_detach(pnp_dev);
> - return 0;
> }
>
> static void pnp_device_shutdown(struct device *dev)
> diff --git a/drivers/rapidio/rio-driver.c b/drivers/rapidio/rio-driver.c
> index 72874153972e..a72bb0a40fcf 100644
> --- a/drivers/rapidio/rio-driver.c
> +++ b/drivers/rapidio/rio-driver.c
> @@ -112,7 +112,7 @@ static int rio_device_probe(struct device *dev)
> * driver, then run the driver remove() method. Then update
> * the reference count.
> */
> -static int rio_device_remove(struct device *dev)
> +static void rio_device_remove(struct device *dev)
> {
> struct rio_dev *rdev = to_rio_dev(dev);
> struct rio_driver *rdrv = rdev->driver;
> @@ -124,8 +124,6 @@ static int rio_device_remove(struct device *dev)
> }
>
> rio_dev_put(rdev);
> -
> - return 0;
> }
>
> static void rio_device_shutdown(struct device *dev)
> diff --git a/drivers/rpmsg/rpmsg_core.c b/drivers/rpmsg/rpmsg_core.c
> index c1404d3dae2c..7f6fac618ab2 100644
> --- a/drivers/rpmsg/rpmsg_core.c
> +++ b/drivers/rpmsg/rpmsg_core.c
> @@ -530,7 +530,7 @@ static int rpmsg_dev_probe(struct device *dev)
> return err;
> }
>
> -static int rpmsg_dev_remove(struct device *dev)
> +static void rpmsg_dev_remove(struct device *dev)
> {
> struct rpmsg_device *rpdev = to_rpmsg_device(dev);
> struct rpmsg_driver *rpdrv = to_rpmsg_driver(rpdev->dev.driver);
> @@ -546,8 +546,6 @@ static int rpmsg_dev_remove(struct device *dev)
>
> if (rpdev->ept)
> rpmsg_destroy_ept(rpdev->ept);
> -
> - return err;
> }
>
> static struct bus_type rpmsg_bus = {
> diff --git a/drivers/scsi/scsi_debug.c b/drivers/scsi/scsi_debug.c
> index 5b3a20a140f9..58f69366bdcc 100644
> --- a/drivers/scsi/scsi_debug.c
> +++ b/drivers/scsi/scsi_debug.c
> @@ -7674,7 +7674,7 @@ static int sdebug_driver_probe(struct device *dev)
> return error;
> }
>
> -static int sdebug_driver_remove(struct device *dev)
> +static void sdebug_driver_remove(struct device *dev)
> {
> struct sdebug_host_info *sdbg_host;
> struct sdebug_dev_info *sdbg_devinfo, *tmp;
> @@ -7691,7 +7691,6 @@ static int sdebug_driver_remove(struct device *dev)
> }
>
> scsi_host_put(sdbg_host->shost);
> - return 0;
> }
>
> static int pseudo_lld_bus_match(struct device *dev,
> diff --git a/drivers/siox/siox-core.c b/drivers/siox/siox-core.c
> index 1794ff0106bc..7c4f32d76966 100644
> --- a/drivers/siox/siox-core.c
> +++ b/drivers/siox/siox-core.c
> @@ -520,7 +520,7 @@ static int siox_probe(struct device *dev)
> return sdriver->probe(sdevice);
> }
>
> -static int siox_remove(struct device *dev)
> +static void siox_remove(struct device *dev)
> {
> struct siox_driver *sdriver =
> container_of(dev->driver, struct siox_driver, driver);
> @@ -528,8 +528,6 @@ static int siox_remove(struct device *dev)
>
> if (sdriver->remove)
> sdriver->remove(sdevice);
> -
> - return 0;
> }
>
> static void siox_shutdown(struct device *dev)
> diff --git a/drivers/slimbus/core.c b/drivers/slimbus/core.c
> index 1d2bc181da05..78480e332ab8 100644
> --- a/drivers/slimbus/core.c
> +++ b/drivers/slimbus/core.c
> @@ -81,7 +81,7 @@ static int slim_device_probe(struct device *dev)
> return ret;
> }
>
> -static int slim_device_remove(struct device *dev)
> +static void slim_device_remove(struct device *dev)
> {
> struct slim_device *sbdev = to_slim_device(dev);
> struct slim_driver *sbdrv;
> @@ -91,8 +91,6 @@ static int slim_device_remove(struct device *dev)
> if (sbdrv->remove)
> sbdrv->remove(sbdev);
> }
> -
> - return 0;
> }
>
> static int slim_device_uevent(struct device *dev, struct kobj_uevent_env *env)
> diff --git a/drivers/soc/qcom/apr.c b/drivers/soc/qcom/apr.c
> index 7abfc8c4fdc7..475a57b435b2 100644
> --- a/drivers/soc/qcom/apr.c
> +++ b/drivers/soc/qcom/apr.c
> @@ -217,7 +217,7 @@ static int apr_device_probe(struct device *dev)
> return adrv->probe(adev);
> }
>
> -static int apr_device_remove(struct device *dev)
> +static void apr_device_remove(struct device *dev)
> {
> struct apr_device *adev = to_apr_device(dev);
> struct apr_driver *adrv;
> @@ -231,8 +231,6 @@ static int apr_device_remove(struct device *dev)
> idr_remove(&apr->svcs_idr, adev->svc_id);
> spin_unlock(&apr->svcs_lock);
> }
> -
> - return 0;
> }
>
> static int apr_uevent(struct device *dev, struct kobj_uevent_env *env)
> diff --git a/drivers/spi/spi.c b/drivers/spi/spi.c
> index c99181165321..ad2b558dc9cb 100644
> --- a/drivers/spi/spi.c
> +++ b/drivers/spi/spi.c
> @@ -405,7 +405,7 @@ static int spi_probe(struct device *dev)
> return ret;
> }
>
> -static int spi_remove(struct device *dev)
> +static void spi_remove(struct device *dev)
> {
> const struct spi_driver *sdrv = to_spi_driver(dev->driver);
>
> @@ -420,8 +420,6 @@ static int spi_remove(struct device *dev)
> }
>
> dev_pm_domain_detach(dev, true);
> -
> - return 0;
> }
>
> static void spi_shutdown(struct device *dev)
> diff --git a/drivers/spmi/spmi.c b/drivers/spmi/spmi.c
> index 51f5aeb65b3b..b37ead9e2fad 100644
> --- a/drivers/spmi/spmi.c
> +++ b/drivers/spmi/spmi.c
> @@ -345,7 +345,7 @@ static int spmi_drv_probe(struct device *dev)
> return err;
> }
>
> -static int spmi_drv_remove(struct device *dev)
> +static void spmi_drv_remove(struct device *dev)
> {
> const struct spmi_driver *sdrv = to_spmi_driver(dev->driver);
>
> @@ -356,7 +356,6 @@ static int spmi_drv_remove(struct device *dev)
> pm_runtime_disable(dev);
> pm_runtime_set_suspended(dev);
> pm_runtime_put_noidle(dev);
> - return 0;
> }
>
> static void spmi_drv_shutdown(struct device *dev)
> diff --git a/drivers/ssb/main.c b/drivers/ssb/main.c
> index 3a29b5570f9f..8a93c83cb6f8 100644
> --- a/drivers/ssb/main.c
> +++ b/drivers/ssb/main.c
> @@ -283,7 +283,7 @@ static void ssb_device_shutdown(struct device *dev)
> ssb_drv->shutdown(ssb_dev);
> }
>
> -static int ssb_device_remove(struct device *dev)
> +static void ssb_device_remove(struct device *dev)
> {
> struct ssb_device *ssb_dev = dev_to_ssb_dev(dev);
> struct ssb_driver *ssb_drv = drv_to_ssb_drv(dev->driver);
> @@ -291,8 +291,6 @@ static int ssb_device_remove(struct device *dev)
> if (ssb_drv && ssb_drv->remove)
> ssb_drv->remove(ssb_dev);
> ssb_device_put(ssb_dev);
> -
> - return 0;
> }
>
> static int ssb_device_probe(struct device *dev)
> diff --git a/drivers/staging/fieldbus/anybuss/host.c b/drivers/staging/fieldbus/anybuss/host.c
> index 0f730efe9a6d..8a75f6642c78 100644
> --- a/drivers/staging/fieldbus/anybuss/host.c
> +++ b/drivers/staging/fieldbus/anybuss/host.c
> @@ -1186,15 +1186,13 @@ static int anybus_bus_probe(struct device *dev)
> return adrv->probe(adev);
> }
>
> -static int anybus_bus_remove(struct device *dev)
> +static void anybus_bus_remove(struct device *dev)
> {
> struct anybuss_client_driver *adrv =
> to_anybuss_client_driver(dev->driver);
>
> if (adrv->remove)
> adrv->remove(to_anybuss_client(dev));
> -
> - return 0;
> }
>
> static struct bus_type anybus_bus = {
> diff --git a/drivers/staging/greybus/gbphy.c b/drivers/staging/greybus/gbphy.c
> index 13d319860da5..5a5c17a4519b 100644
> --- a/drivers/staging/greybus/gbphy.c
> +++ b/drivers/staging/greybus/gbphy.c
> @@ -169,7 +169,7 @@ static int gbphy_dev_probe(struct device *dev)
> return ret;
> }
>
> -static int gbphy_dev_remove(struct device *dev)
> +static void gbphy_dev_remove(struct device *dev)
> {
> struct gbphy_driver *gbphy_drv = to_gbphy_driver(dev->driver);
> struct gbphy_device *gbphy_dev = to_gbphy_dev(dev);
> @@ -180,8 +180,6 @@ static int gbphy_dev_remove(struct device *dev)
> pm_runtime_set_suspended(dev);
> pm_runtime_put_noidle(dev);
> pm_runtime_dont_use_autosuspend(dev);
> -
> - return 0;
> }
>
> static struct bus_type gbphy_bus_type = {
> diff --git a/drivers/target/loopback/tcm_loop.c b/drivers/target/loopback/tcm_loop.c
> index 6d0b0e67e79e..cbb2118fb35e 100644
> --- a/drivers/target/loopback/tcm_loop.c
> +++ b/drivers/target/loopback/tcm_loop.c
> @@ -81,7 +81,7 @@ static int tcm_loop_show_info(struct seq_file *m, struct Scsi_Host *host)
> }
>
> static int tcm_loop_driver_probe(struct device *);
> -static int tcm_loop_driver_remove(struct device *);
> +static void tcm_loop_driver_remove(struct device *);
>
> static int pseudo_lld_bus_match(struct device *dev,
> struct device_driver *dev_driver)
> @@ -363,7 +363,7 @@ static int tcm_loop_driver_probe(struct device *dev)
> return 0;
> }
>
> -static int tcm_loop_driver_remove(struct device *dev)
> +static void tcm_loop_driver_remove(struct device *dev)
> {
> struct tcm_loop_hba *tl_hba;
> struct Scsi_Host *sh;
> @@ -373,7 +373,6 @@ static int tcm_loop_driver_remove(struct device *dev)
>
> scsi_remove_host(sh);
> scsi_host_put(sh);
> - return 0;
> }
>
> static void tcm_loop_release_adapter(struct device *dev)
> diff --git a/drivers/thunderbolt/domain.c b/drivers/thunderbolt/domain.c
> index a062befcb3b2..7018d959f775 100644
> --- a/drivers/thunderbolt/domain.c
> +++ b/drivers/thunderbolt/domain.c
> @@ -86,7 +86,7 @@ static int tb_service_probe(struct device *dev)
> return driver->probe(svc, id);
> }
>
> -static int tb_service_remove(struct device *dev)
> +static void tb_service_remove(struct device *dev)
> {
> struct tb_service *svc = tb_to_service(dev);
> struct tb_service_driver *driver;
> @@ -94,8 +94,6 @@ static int tb_service_remove(struct device *dev)
> driver = container_of(dev->driver, struct tb_service_driver, driver);
> if (driver->remove)
> driver->remove(svc);
> -
> - return 0;
> }
>
> static void tb_service_shutdown(struct device *dev)
> diff --git a/drivers/tty/serdev/core.c b/drivers/tty/serdev/core.c
> index 9cdfcfe07e87..92498961fd92 100644
> --- a/drivers/tty/serdev/core.c
> +++ b/drivers/tty/serdev/core.c
> @@ -421,15 +421,13 @@ static int serdev_drv_probe(struct device *dev)
> return ret;
> }
>
> -static int serdev_drv_remove(struct device *dev)
> +static void serdev_drv_remove(struct device *dev)
> {
> const struct serdev_device_driver *sdrv = to_serdev_device_driver(dev->driver);
> if (sdrv->remove)
> sdrv->remove(to_serdev_device(dev));
>
> dev_pm_domain_detach(dev, true);
> -
> - return 0;
> }
>
> static struct bus_type serdev_bus_type = {
> diff --git a/drivers/usb/common/ulpi.c b/drivers/usb/common/ulpi.c
> index 7e13b74e60e5..4169cf40a03b 100644
> --- a/drivers/usb/common/ulpi.c
> +++ b/drivers/usb/common/ulpi.c
> @@ -78,14 +78,12 @@ static int ulpi_probe(struct device *dev)
> return drv->probe(to_ulpi_dev(dev));
> }
>
> -static int ulpi_remove(struct device *dev)
> +static void ulpi_remove(struct device *dev)
> {
> struct ulpi_driver *drv = to_ulpi_driver(dev->driver);
>
> if (drv->remove)
> drv->remove(to_ulpi_dev(dev));
> -
> - return 0;
> }
>
> static struct bus_type ulpi_bus = {
> diff --git a/drivers/usb/serial/bus.c b/drivers/usb/serial/bus.c
> index 7133818a58b9..9e38142acd38 100644
> --- a/drivers/usb/serial/bus.c
> +++ b/drivers/usb/serial/bus.c
> @@ -74,7 +74,7 @@ static int usb_serial_device_probe(struct device *dev)
> return retval;
> }
>
> -static int usb_serial_device_remove(struct device *dev)
> +static void usb_serial_device_remove(struct device *dev)
> {
> struct usb_serial_port *port = to_usb_serial_port(dev);
> struct usb_serial_driver *driver;
> @@ -101,8 +101,6 @@ static int usb_serial_device_remove(struct device *dev)
>
> if (!autopm_err)
> usb_autopm_put_interface(port->serial->interface);
> -
> - return 0;
> }
>
> static ssize_t new_id_store(struct device_driver *driver,
> diff --git a/drivers/usb/typec/bus.c b/drivers/usb/typec/bus.c
> index 7f3c9a8e2bf0..78e0e78954f2 100644
> --- a/drivers/usb/typec/bus.c
> +++ b/drivers/usb/typec/bus.c
> @@ -382,7 +382,7 @@ static int typec_probe(struct device *dev)
> return ret;
> }
>
> -static int typec_remove(struct device *dev)
> +static void typec_remove(struct device *dev)
> {
> struct typec_altmode_driver *drv = to_altmode_driver(dev->driver);
> struct typec_altmode *adev = to_typec_altmode(dev);
> @@ -400,8 +400,6 @@ static int typec_remove(struct device *dev)
>
> adev->desc = NULL;
> adev->ops = NULL;
> -
> - return 0;
> }
>
> struct bus_type typec_bus = {
> diff --git a/drivers/vdpa/vdpa.c b/drivers/vdpa/vdpa.c
> index bb3f1d1f0422..3fc4525fc05c 100644
> --- a/drivers/vdpa/vdpa.c
> +++ b/drivers/vdpa/vdpa.c
> @@ -34,15 +34,13 @@ static int vdpa_dev_probe(struct device *d)
> return ret;
> }
>
> -static int vdpa_dev_remove(struct device *d)
> +static void vdpa_dev_remove(struct device *d)
> {
> struct vdpa_device *vdev = dev_to_vdpa(d);
> struct vdpa_driver *drv = drv_to_vdpa(vdev->dev.driver);
>
> if (drv && drv->remove)
> drv->remove(vdev);
> -
> - return 0;
> }
>
> static struct bus_type vdpa_bus = {
> diff --git a/drivers/vfio/mdev/mdev_driver.c b/drivers/vfio/mdev/mdev_driver.c
> index c368ec824e2b..e2cb1ff56f6c 100644
> --- a/drivers/vfio/mdev/mdev_driver.c
> +++ b/drivers/vfio/mdev/mdev_driver.c
> @@ -57,7 +57,7 @@ static int mdev_probe(struct device *dev)
> return ret;
> }
>
> -static int mdev_remove(struct device *dev)
> +static void mdev_remove(struct device *dev)
> {
> struct mdev_driver *drv =
> container_of(dev->driver, struct mdev_driver, driver);
> @@ -67,8 +67,6 @@ static int mdev_remove(struct device *dev)
> drv->remove(mdev);
>
> mdev_detach_iommu(mdev);
> -
> - return 0;
> }
>
> static int mdev_match(struct device *dev, struct device_driver *drv)
> diff --git a/drivers/virtio/virtio.c b/drivers/virtio/virtio.c
> index 4b15c00c0a0a..2a6055c0d4d3 100644
> --- a/drivers/virtio/virtio.c
> +++ b/drivers/virtio/virtio.c
> @@ -278,7 +278,7 @@ static int virtio_dev_probe(struct device *_d)
>
> }
>
> -static int virtio_dev_remove(struct device *_d)
> +static void virtio_dev_remove(struct device *_d)
> {
> struct virtio_device *dev = dev_to_virtio(_d);
> struct virtio_driver *drv = drv_to_virtio(dev->dev.driver);
> @@ -292,7 +292,6 @@ static int virtio_dev_remove(struct device *_d)
>
> /* Acknowledge the device's existence again. */
> virtio_add_status(dev, VIRTIO_CONFIG_S_ACKNOWLEDGE);
> - return 0;
> }
>
> static struct bus_type virtio_bus = {
> diff --git a/drivers/vme/vme.c b/drivers/vme/vme.c
> index 1b15afea28ee..8dba20186be3 100644
> --- a/drivers/vme/vme.c
> +++ b/drivers/vme/vme.c
> @@ -1990,7 +1990,7 @@ static int vme_bus_probe(struct device *dev)
> return -ENODEV;
> }
>
> -static int vme_bus_remove(struct device *dev)
> +static void vme_bus_remove(struct device *dev)
> {
> struct vme_driver *driver;
> struct vme_dev *vdev = dev_to_vme_dev(dev);
> @@ -1998,8 +1998,6 @@ static int vme_bus_remove(struct device *dev)
> driver = dev->platform_data;
> if (driver->remove)
> driver->remove(vdev);
> -
> - return 0;
> }
>
> struct bus_type vme_bus_type = {
> diff --git a/drivers/xen/xenbus/xenbus.h b/drivers/xen/xenbus/xenbus.h
> index 2a93b7c9c159..2754bdfadcb8 100644
> --- a/drivers/xen/xenbus/xenbus.h
> +++ b/drivers/xen/xenbus/xenbus.h
> @@ -106,7 +106,7 @@ void xs_request_exit(struct xb_req_data *req);
>
> int xenbus_match(struct device *_dev, struct device_driver *_drv);
> int xenbus_dev_probe(struct device *_dev);
> -int xenbus_dev_remove(struct device *_dev);
> +void xenbus_dev_remove(struct device *_dev);
> int xenbus_register_driver_common(struct xenbus_driver *drv,
> struct xen_bus_type *bus,
> struct module *owner,
> diff --git a/drivers/xen/xenbus/xenbus_probe.c b/drivers/xen/xenbus/xenbus_probe.c
> index 97f0d234482d..f4f52d574df9 100644
> --- a/drivers/xen/xenbus/xenbus_probe.c
> +++ b/drivers/xen/xenbus/xenbus_probe.c
> @@ -326,7 +326,7 @@ int xenbus_dev_probe(struct device *_dev)
> }
> EXPORT_SYMBOL_GPL(xenbus_dev_probe);
>
> -int xenbus_dev_remove(struct device *_dev)
> +void xenbus_dev_remove(struct device *_dev)
> {
> struct xenbus_device *dev = to_xenbus_device(_dev);
> struct xenbus_driver *drv = to_xenbus_driver(_dev->driver);
> @@ -356,8 +356,6 @@ int xenbus_dev_remove(struct device *_dev)
> if (!drv->allow_rebind ||
> xenbus_read_driver_state(dev->nodename) == XenbusStateClosing)
> xenbus_switch_state(dev, XenbusStateClosed);
> -
> - return 0;
> }
> EXPORT_SYMBOL_GPL(xenbus_dev_remove);
>
> diff --git a/include/linux/device/bus.h b/include/linux/device/bus.h
> index 1ea5e1d1545b..062777a45a74 100644
> --- a/include/linux/device/bus.h
> +++ b/include/linux/device/bus.h
> @@ -91,7 +91,7 @@ struct bus_type {
> int (*uevent)(struct device *dev, struct kobj_uevent_env *env);
> int (*probe)(struct device *dev);
> void (*sync_state)(struct device *dev);
> - int (*remove)(struct device *dev);
> + void (*remove)(struct device *dev);
> void (*shutdown)(struct device *dev);
>
> int (*online)(struct device *dev);
> diff --git a/sound/aoa/soundbus/core.c b/sound/aoa/soundbus/core.c
> index 002fb5bf220b..c9579d97fbab 100644
> --- a/sound/aoa/soundbus/core.c
> +++ b/sound/aoa/soundbus/core.c
> @@ -104,7 +104,7 @@ static int soundbus_uevent(struct device *dev, struct kobj_uevent_env *env)
> return retval;
> }
>
> -static int soundbus_device_remove(struct device *dev)
> +static void soundbus_device_remove(struct device *dev)
> {
> struct soundbus_dev * soundbus_dev = to_soundbus_device(dev);
> struct soundbus_driver * drv = to_soundbus_driver(dev->driver);
> @@ -112,8 +112,6 @@ static int soundbus_device_remove(struct device *dev)
> if (dev->driver && drv->remove)
> drv->remove(soundbus_dev);
> soundbus_dev_put(soundbus_dev);
> -
> - return 0;
> }
>
> static void soundbus_device_shutdown(struct device *dev)
>
> base-commit: 79160a603bdb51916226caf4a6616cc4e1c58a58
> prerequisite-patch-id: e5c7b97ea399fddc2695e8cf5d0c02d14175abac
> --
> 2.30.2
>
--
Alexandre Belloni, co-owner and COO, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com
^ permalink raw reply
* Re: [PATCH] bus: Make remove callback return void
From: Kirti Wankhede @ 2021-07-06 11:16 UTC (permalink / raw)
To: Uwe Kleine-König, Greg Kroah-Hartman
Cc: nvdimm, Alexey Kardashevskiy, Samuel Iglesias Gonsalvez,
Jens Taprogge, Ulf Hansson, Jaroslav Kysela, Benjamin Tissoires,
Paul Mackerras, Srinivas Pandruvada, K. Y. Srinivasan,
Mike Christie, Wei Liu, Maxim Levitsky, Samuel Holland,
linux-acpi, linux-pci, xen-devel, Tomas Winkler, Julien Grall,
Ohad Ben-Cohen, Alex Williamson, Alex Elder, linux-parisc,
Geoff Levand, linux-fpga, linux-usb, Rafael J. Wysocki,
linux-kernel, linux-spi, Thorsten Scherer, kernel, Jon Mason,
linux-ntb, Wu Hao, David Woodhouse, Krzysztof Wilczyński,
Alexandre Belloni, Manohar Vanga, linux-wireless,
Dominik Brodowski, virtualization, James E.J. Bottomley,
target-devel, Srinivas Kandagatla, linux-i2c, Kai-Heng Feng,
Stefano Stabellini, Stephen Hemminger, Ira Weiny, Helge Deller,
Rafał Miłecki, industrypack-devel, linux-mips,
Len Brown, alsa-devel, linux-arm-msm, linux-media, Maxime Ripard,
Johan Hovold, greybus-dev, Bjorn Helgaas, Dave Jiang,
Boris Ostrovsky, Mika Westerberg, linux-arm-kernel,
Johannes Thumshirn, Mathieu Poirier, Stephen Boyd, Cornelia Huck,
Wolfram Sang, Joey Pabalan, Yehezkel Bernat, Pali Rohár,
Bodo Stroesser, Alison Schofield, Heikki Krogerus, Tyrel Datwyler,
Alexander Shishkin, Tom Rix, Jason Wang, SeongJae Park,
linux-hyperv, platform-driver-x86, Frank Li, netdev,
Qinglang Miao, Jiri Slaby, Rob Herring, Lorenzo Pieralisi,
Mark Gross, linux-staging, Dexuan Cui, Jernej Skrabec,
Kishon Vijay Abraham I, Chen-Yu Tsai, linux-input, Allen Hubbe,
Alex Dubov, Haiyang Zhang, Jiri Kosina, Vladimir Zapolskiy,
Ben Widawsky, Moritz Fischer, linux-cxl, Michael Buesch,
Dan Williams, Mauro Carvalho Chehab, Cristian Marussi,
Thomas Bogendoerfer, Martin K. Petersen, Martyn Welch,
Dmitry Torokhov, linux-mmc, linux-sunxi, Stefan Richter,
Sudeep Holla, David S. Miller, Sven Van Asbroeck, kvm,
Michael S. Tsirkin, linux-remoteproc, Bjorn Andersson,
Andreas Noever, linux-i3c, linux1394-devel, Lee Jones,
Arnd Bergmann, linux-scsi, Vishal Verma, Russell King, Andy Gross,
linux-serial, Jakub Kicinski, Michael Jamet,
William Breathitt Gray, Hans de Goede, Hannes Reinecke,
Adrian Hunter, Juergen Gross, linuxppc-dev, Takashi Iwai,
Alexandre Bounine, Vinod Koul, Mark Brown, Marc Zyngier,
dmaengine, Johannes Berg, Maximilian Luz
In-Reply-To: <20210706095037.1425211-1-u.kleine-koenig@pengutronix.de>
On 7/6/2021 3:20 PM, Uwe Kleine-König wrote:
> The driver core ignores the return value of this callback because there
> is only little it can do when a device disappears.
>
> This is the final bit of a long lasting cleanup quest where several
> buses were converted to also return void from their remove callback.
> Additionally some resource leaks were fixed that were caused by drivers
> returning an error code in the expectation that the driver won't go
> away.
>
> With struct bus_type::remove returning void it's prevented that newly
> implemented buses return an ignored error code and so don't anticipate
> wrong expectations for driver authors.
>
> Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
> drivers/vfio/mdev/mdev_driver.c | 4 +---
Acked-by: Kirti Wankhede <kwankhede@nvidia.com>
^ permalink raw reply
* Re: [PATCH] bus: Make remove callback return void
From: Cornelia Huck @ 2021-07-06 11:17 UTC (permalink / raw)
To: Uwe Kleine-König, Greg Kroah-Hartman
Cc: nvdimm, Alexey Kardashevskiy, Samuel Iglesias Gonsalvez,
Jens Taprogge, Ulf Hansson, Jaroslav Kysela, Benjamin Tissoires,
Paul Mackerras, Srinivas Pandruvada, K. Y. Srinivasan,
Mike Christie, Wei Liu, Maxim Levitsky, Samuel Holland,
linux-acpi, linux-pci, xen-devel, Tomas Winkler, Julien Grall,
Ohad Ben-Cohen, Alex Williamson, Alex Elder, linux-parisc,
Geoff Levand, linux-fpga, linux-usb, Rafael J. Wysocki,
linux-kernel, linux-spi, Thorsten Scherer, kernel, Jon Mason,
linux-ntb, Wu Hao, David Woodhouse, Krzysztof Wilczyński,
Alexandre Belloni, Manohar Vanga, linux-wireless,
Dominik Brodowski, virtualization, James E.J. Bottomley,
target-devel, Srinivas Kandagatla, linux-i2c, Kai-Heng Feng,
Stefano Stabellini, Stephen Hemminger, Ira Weiny, Helge Deller,
Rafał Miłecki, industrypack-devel, linux-mips,
Len Brown, alsa-devel, linux-arm-msm, linux-media, Maxime Ripard,
Johan Hovold, greybus-dev, Bjorn Helgaas, Dave Jiang,
Boris Ostrovsky, Mika Westerberg, linux-arm-kernel,
Johannes Thumshirn, Mathieu Poirier, Stephen Boyd, Wolfram Sang,
Joey Pabalan, Yehezkel Bernat, Pali Rohár, Bodo Stroesser,
Alison Schofield, Heikki Krogerus, Tyrel Datwyler,
Alexander Shishkin, Tom Rix, Jason Wang, SeongJae Park,
linux-hyperv, platform-driver-x86, Frank Li, netdev,
Qinglang Miao, Jiri Slaby, Rob Herring, Lorenzo Pieralisi,
Mark Gross, linux-staging, Dexuan Cui, Jernej Skrabec,
Kishon Vijay Abraham I, Chen-Yu Tsai, linux-input, Allen Hubbe,
Alex Dubov, Haiyang Zhang, Jiri Kosina, Vladimir Zapolskiy,
Ben Widawsky, Moritz Fischer, linux-cxl, Michael Buesch,
Dan Williams, Mauro Carvalho Chehab, Cristian Marussi,
Thomas Bogendoerfer, Martin K. Petersen, Martyn Welch,
Dmitry Torokhov, linux-mmc, linux-sunxi, Stefan Richter,
Sudeep Holla, David S. Miller, Sven Van Asbroeck, kvm,
Michael S. Tsirkin, linux-remoteproc, Bjorn Andersson,
Kirti Wankhede, Andreas Noever, linux-i3c, linux1394-devel,
Lee Jones, Arnd Bergmann, linux-scsi, Vishal Verma, Russell King,
Andy Gross, linux-serial, Jakub Kicinski, Michael Jamet,
William Breathitt Gray, Hans de Goede, Hannes Reinecke,
Adrian Hunter, Juergen Gross, linuxppc-dev, Takashi Iwai,
Alexandre Bounine, Vinod Koul, Mark Brown, Marc Zyngier,
dmaengine, Johannes Berg, Maximilian Luz
In-Reply-To: <87pmvvhfqq.fsf@redhat.com>
On Tue, Jul 06 2021, Cornelia Huck <cohuck@redhat.com> wrote:
> On Tue, Jul 06 2021, Uwe Kleine-König <u.kleine-koenig@pengutronix.de> wrote:
>
>> The driver core ignores the return value of this callback because there
>> is only little it can do when a device disappears.
>>
>> This is the final bit of a long lasting cleanup quest where several
>> buses were converted to also return void from their remove callback.
>> Additionally some resource leaks were fixed that were caused by drivers
>> returning an error code in the expectation that the driver won't go
>> away.
>>
>> With struct bus_type::remove returning void it's prevented that newly
>> implemented buses return an ignored error code and so don't anticipate
>> wrong expectations for driver authors.
>
> Yay!
>
>>
>> Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
>> ---
>> Hello,
>>
>> this patch depends on "PCI: endpoint: Make struct pci_epf_driver::remove
>> return void" that is not yet applied, see
>> https://lore.kernel.org/r/20210223090757.57604-1-u.kleine-koenig@pengutronix.de.
>>
>> I tested it using allmodconfig on amd64 and arm, but I wouldn't be
>> surprised if I still missed to convert a driver. So it would be great to
>> get this into next early after the merge window closes.
>
> I'm afraid you missed the s390-specific busses in drivers/s390/cio/
> (css/ccw/ccwgroup).
The change for vfio/mdev looks good.
The following should do the trick for s390; not sure if other
architectures have easy-to-miss busses as well.
diff --git a/drivers/s390/cio/ccwgroup.c b/drivers/s390/cio/ccwgroup.c
index 9748165e08e9..a66f416138ab 100644
--- a/drivers/s390/cio/ccwgroup.c
+++ b/drivers/s390/cio/ccwgroup.c
@@ -439,17 +439,15 @@ module_exit(cleanup_ccwgroup);
/************************** driver stuff ******************************/
-static int ccwgroup_remove(struct device *dev)
+static void ccwgroup_remove(struct device *dev)
{
struct ccwgroup_device *gdev = to_ccwgroupdev(dev);
struct ccwgroup_driver *gdrv = to_ccwgroupdrv(dev->driver);
if (!dev->driver)
- return 0;
+ return;
if (gdrv->remove)
gdrv->remove(gdev);
-
- return 0;
}
static void ccwgroup_shutdown(struct device *dev)
diff --git a/drivers/s390/cio/css.c b/drivers/s390/cio/css.c
index a974943c27da..ebc321edba51 100644
--- a/drivers/s390/cio/css.c
+++ b/drivers/s390/cio/css.c
@@ -1371,15 +1371,14 @@ static int css_probe(struct device *dev)
return ret;
}
-static int css_remove(struct device *dev)
+static void css_remove(struct device *dev)
{
struct subchannel *sch;
- int ret;
sch = to_subchannel(dev);
- ret = sch->driver->remove ? sch->driver->remove(sch) : 0;
+ if (sch->driver->remove)
+ sch->driver->remove(sch);
sch->driver = NULL;
- return ret;
}
static void css_shutdown(struct device *dev)
diff --git a/drivers/s390/cio/device.c b/drivers/s390/cio/device.c
index 84f659cafe76..61d5d55bd9c8 100644
--- a/drivers/s390/cio/device.c
+++ b/drivers/s390/cio/device.c
@@ -1742,7 +1742,7 @@ ccw_device_probe (struct device *dev)
return 0;
}
-static int ccw_device_remove(struct device *dev)
+static void ccw_device_remove(struct device *dev)
{
struct ccw_device *cdev = to_ccwdev(dev);
struct ccw_driver *cdrv = cdev->drv;
@@ -1776,8 +1776,6 @@ static int ccw_device_remove(struct device *dev)
spin_unlock_irq(cdev->ccwlock);
io_subchannel_quiesce(sch);
__disable_cmf(cdev);
-
- return 0;
}
static void ccw_device_shutdown(struct device *dev)
diff --git a/drivers/s390/cio/scm.c b/drivers/s390/cio/scm.c
index 9f26d4310bb3..b6b4589c70bd 100644
--- a/drivers/s390/cio/scm.c
+++ b/drivers/s390/cio/scm.c
@@ -28,12 +28,13 @@ static int scmdev_probe(struct device *dev)
return scmdrv->probe ? scmdrv->probe(scmdev) : -ENODEV;
}
-static int scmdev_remove(struct device *dev)
+static void scmdev_remove(struct device *dev)
{
struct scm_device *scmdev = to_scm_dev(dev);
struct scm_driver *scmdrv = to_scm_drv(dev->driver);
- return scmdrv->remove ? scmdrv->remove(scmdev) : -ENODEV;
+ if (scmdrv->remove)
+ scmdrv->remove(scmdev);
}
static int scmdev_uevent(struct device *dev, struct kobj_uevent_env *env)
diff --git a/drivers/s390/crypto/ap_bus.c b/drivers/s390/crypto/ap_bus.c
index d2560186d771..8a0d37c0e2a5 100644
--- a/drivers/s390/crypto/ap_bus.c
+++ b/drivers/s390/crypto/ap_bus.c
@@ -884,7 +884,7 @@ static int ap_device_probe(struct device *dev)
return rc;
}
-static int ap_device_remove(struct device *dev)
+static void ap_device_remove(struct device *dev)
{
struct ap_device *ap_dev = to_ap_dev(dev);
struct ap_driver *ap_drv = ap_dev->drv;
@@ -909,8 +909,6 @@ static int ap_device_remove(struct device *dev)
ap_dev->drv = NULL;
put_device(dev);
-
- return 0;
}
struct ap_queue *ap_get_qdev(ap_qid_t qid)
^ permalink raw reply related
* Re: [PATCH] bus: Make remove callback return void
From: Maximilian Luz @ 2021-07-06 11:42 UTC (permalink / raw)
To: Uwe Kleine-König, Greg Kroah-Hartman
Cc: Krzysztof Wilczyński, linux-hyperv, Alex Elder, kvm, nvdimm,
linux-mmc, linux-wireless, linux-fpga, linux-pci, alsa-devel,
linux-cxl, Bjorn Andersson, target-devel, linux-i2c,
linux-arm-msm, linux-i3c, K. Y. Srinivasan, Jiri Slaby,
Rob Herring, Wei Liu, Stefano Stabellini, Stephen Hemminger,
linux-scsi, Adrian Hunter, linux-staging, Dexuan Cui, linux-acpi,
Andy Gross, industrypack-devel, linux-input, Jakub Kicinski,
linux-mips, virtualization, linux-sunxi, Len Brown,
platform-driver-x86, linux-serial, Arnd Bergmann,
linux-remoteproc, Haiyang Zhang, Jiri Kosina, Johan Hovold,
Maxime Ripard, Hans de Goede, Mark Brown, xen-devel,
Bjorn Helgaas, Mark Gross, Mauro Carvalho Chehab, Mika Westerberg,
linux-arm-kernel, linux1394-devel, Johannes Thumshirn,
linux-parisc, greybus-dev, Stephen Boyd, linuxppc-dev, linux-usb,
Rafael J. Wysocki, linux-kernel, linux-spi, netdev, dmaengine,
linux-ntb, linux-media, Pali Rohár, David S. Miller
In-Reply-To: <20210706095037.1425211-1-u.kleine-koenig@pengutronix.de>
On 7/6/21 11:50 AM, Uwe Kleine-König wrote:
> The driver core ignores the return value of this callback because there
> is only little it can do when a device disappears.
>
> This is the final bit of a long lasting cleanup quest where several
> buses were converted to also return void from their remove callback.
> Additionally some resource leaks were fixed that were caused by drivers
> returning an error code in the expectation that the driver won't go
> away.
>
> With struct bus_type::remove returning void it's prevented that newly
> implemented buses return an ignored error code and so don't anticipate
> wrong expectations for driver authors.
>
> Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
> drivers/platform/surface/aggregator/bus.c | 4 +---
Acked-by: Maximilian Luz <luzmaximilian@gmail.com>
^ permalink raw reply
* Re: [PATCH] bus: Make remove callback return void
From: Heikki Krogerus @ 2021-07-06 11:41 UTC (permalink / raw)
To: Uwe Kleine-König
Cc: Alison Schofield, Alexander Shishkin, Samuel Iglesias Gonsalvez,
Jens Taprogge, Alexandre Belloni, James E.J. Bottomley,
Benjamin Tissoires, Paul Mackerras, Srinivas Pandruvada,
K. Y. Srinivasan, Ira Weiny, Wei Liu, Alex Dubov, Dave Jiang,
Maxim Levitsky, Johannes Thumshirn, Vishal Verma, Helge Deller,
Rafał Miłecki, Dexuan Cui, Russell King, Jernej Skrabec,
Chen-Yu Tsai, Tom Rix, Len Brown, Jiri Kosina, Haiyang Zhang,
Sudeep Holla, William Breathitt Gray, Maxime Ripard, Ben Widawsky,
Moritz Fischer, Stephen Hemminger, Dan Williams,
Mauro Carvalho Chehab, Cristian Marussi, Thomas Bogendoerfer,
Geoff Levand, Greg Kroah-Hartman, Dmitry Torokhov,
Rafael J. Wysocki, linux-kernel, Wolfram Sang, Vinod Koul,
Stefan Richter, kernel, Wu Hao
In-Reply-To: <20210706095037.1425211-1-u.kleine-koenig@pengutronix.de>
On Tue, Jul 06, 2021 at 11:50:37AM +0200, Uwe Kleine-König wrote:
> The driver core ignores the return value of this callback because there
> is only little it can do when a device disappears.
>
> This is the final bit of a long lasting cleanup quest where several
> buses were converted to also return void from their remove callback.
> Additionally some resource leaks were fixed that were caused by drivers
> returning an error code in the expectation that the driver won't go
> away.
>
> With struct bus_type::remove returning void it's prevented that newly
> implemented buses return an ignored error code and so don't anticipate
> wrong expectations for driver authors.
>
> Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
For ulpi and typec:
Acked-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>
thanks,
--
heikki
^ permalink raw reply
* Re: [PATCH] bus: Make remove callback return void
From: Uwe Kleine-König @ 2021-07-06 12:14 UTC (permalink / raw)
To: Cornelia Huck
Cc: nvdimm, Alexey Kardashevskiy, Samuel Iglesias Gonsalvez,
Jens Taprogge, Alison Schofield, Jaroslav Kysela,
Benjamin Tissoires, Paul Mackerras, Srinivas Pandruvada,
K. Y. Srinivasan, Mike Christie, Wei Liu, Maxim Levitsky,
Samuel Holland, Takashi Iwai, linux-acpi, Tom Rix, xen-devel,
Tomas Winkler, Jason Wang, Ohad Ben-Cohen, Alex Williamson,
Alex Elder, Martin K. Petersen, Geoff Levand, Greg Kroah-Hartman,
linux-usb, linux-wireless, linux-kernel, linux-spi, Kai-Heng Feng,
kernel, Jon Mason, linux-ntb, linux-media, David Woodhouse,
Krzysztof Wilczyński, Alexandre Belloni, Manohar Vanga,
Rafael J. Wysocki, Dominik Brodowski, virtualization,
James E.J. Bottomley, target-devel, Srinivas Kandagatla,
linux-i2c, Stefano Stabellini, Stephen Hemminger, Jiri Slaby,
Helge Deller, Rafał Miłecki, industrypack-devel, Wu Hao,
alsa-devel, linux-arm-msm, Maxime Ripard, William Breathitt Gray,
greybus-dev, Frank Li, Mark Gross, Boris Ostrovsky,
Mika Westerberg, linux-arm-kernel, Johannes Thumshirn,
Mathieu Poirier, Stephen Boyd, Wolfram Sang, Joey Pabalan,
Yehezkel Bernat, Pali Rohár, Len Brown, Bodo Stroesser,
Ulf Hansson, Heikki Krogerus, Tyrel Datwyler, Alexander Shishkin,
linux-pci, Julien Grall, SeongJae Park, linux-hyperv,
platform-driver-x86, Bjorn Helgaas, Jernej Skrabec, Ira Weiny,
Rob Herring, Lorenzo Pieralisi, Dave Jiang, linux-staging,
Dexuan Cui, Qinglang Miao, Kishon Vijay Abraham I, Chen-Yu Tsai,
linux-input, Allen Hubbe, Alex Dubov, Haiyang Zhang, Jiri Kosina,
Vladimir Zapolskiy, Ben Widawsky, Moritz Fischer, linux-cxl,
Michael Buesch, Dan Williams, Mauro Carvalho Chehab,
Cristian Marussi, Thomas Bogendoerfer, linux-parisc, Martyn Welch,
Dmitry Torokhov, linux-mmc, linux-sunxi, Stefan Richter,
Sudeep Holla, David S. Miller, Sven Van Asbroeck, kvm,
Michael S. Tsirkin, linux-remoteproc, Maximilian Luz,
Bjorn Andersson, Kirti Wankhede, Andreas Noever, linux-i3c,
linux1394-devel, Lee Jones, Arnd Bergmann, linux-scsi,
Vishal Verma, Russell King, Thorsten Scherer, Andy Gross,
linux-serial, Jakub Kicinski, Michael Jamet, Johan Hovold,
Hans de Goede, Hannes Reinecke, Adrian Hunter, Johannes Berg,
Juergen Gross, netdev, linux-mips, Alexandre Bounine, Vinod Koul,
Mark Brown, Marc Zyngier, dmaengine, linux-fpga, linuxppc-dev
In-Reply-To: <87mtqzhesu.fsf@redhat.com>
[-- Attachment #1: Type: text/plain, Size: 3533 bytes --]
On Tue, Jul 06, 2021 at 01:17:37PM +0200, Cornelia Huck wrote:
> On Tue, Jul 06 2021, Cornelia Huck <cohuck@redhat.com> wrote:
>
> > On Tue, Jul 06 2021, Uwe Kleine-König <u.kleine-koenig@pengutronix.de> wrote:
> >
> >> The driver core ignores the return value of this callback because there
> >> is only little it can do when a device disappears.
> >>
> >> This is the final bit of a long lasting cleanup quest where several
> >> buses were converted to also return void from their remove callback.
> >> Additionally some resource leaks were fixed that were caused by drivers
> >> returning an error code in the expectation that the driver won't go
> >> away.
> >>
> >> With struct bus_type::remove returning void it's prevented that newly
> >> implemented buses return an ignored error code and so don't anticipate
> >> wrong expectations for driver authors.
> >
> > Yay!
> >
> >>
> >> Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
> >> ---
> >> Hello,
> >>
> >> this patch depends on "PCI: endpoint: Make struct pci_epf_driver::remove
> >> return void" that is not yet applied, see
> >> https://lore.kernel.org/r/20210223090757.57604-1-u.kleine-koenig@pengutronix.de.
> >>
> >> I tested it using allmodconfig on amd64 and arm, but I wouldn't be
> >> surprised if I still missed to convert a driver. So it would be great to
> >> get this into next early after the merge window closes.
> >
> > I'm afraid you missed the s390-specific busses in drivers/s390/cio/
> > (css/ccw/ccwgroup).
:-\
> The change for vfio/mdev looks good.
>
> The following should do the trick for s390; not sure if other
> architectures have easy-to-miss busses as well.
>
> diff --git a/drivers/s390/cio/ccwgroup.c b/drivers/s390/cio/ccwgroup.c
> index 9748165e08e9..a66f416138ab 100644
> --- a/drivers/s390/cio/ccwgroup.c
> +++ b/drivers/s390/cio/ccwgroup.c
> @@ -439,17 +439,15 @@ module_exit(cleanup_ccwgroup);
>
> /************************** driver stuff ******************************/
>
> -static int ccwgroup_remove(struct device *dev)
> +static void ccwgroup_remove(struct device *dev)
> {
> struct ccwgroup_device *gdev = to_ccwgroupdev(dev);
> struct ccwgroup_driver *gdrv = to_ccwgroupdrv(dev->driver);
>
> if (!dev->driver)
> - return 0;
> + return;
This is fine to be squashed into my patch. In the long run: in a remove
callback dev->driver cannot be NULL, so this if could go away.
> if (gdrv->remove)
> gdrv->remove(gdev);
> -
> - return 0;
> }
>
> static void ccwgroup_shutdown(struct device *dev)
> diff --git a/drivers/s390/cio/css.c b/drivers/s390/cio/css.c
> index a974943c27da..ebc321edba51 100644
> --- a/drivers/s390/cio/css.c
> +++ b/drivers/s390/cio/css.c
> @@ -1371,15 +1371,14 @@ static int css_probe(struct device *dev)
> return ret;
> }
>
> -static int css_remove(struct device *dev)
> +static void css_remove(struct device *dev)
> {
> struct subchannel *sch;
> - int ret;
>
> sch = to_subchannel(dev);
> - ret = sch->driver->remove ? sch->driver->remove(sch) : 0;
> + if (sch->driver->remove)
> + sch->driver->remove(sch);
Maybe the return type for this function pointer can be changed to void,
too.
I will add these changes to a v2 that I plan to send out after the dust
settles some more.
Thanks
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
* Re: Hitting BUG_ON in do_notify_resume() with gdb and SIGTRAP
From: Christophe Leroy @ 2021-07-06 13:16 UTC (permalink / raw)
To: Radu Rendec, linuxppc-dev, Nicholas Piggin
In-Reply-To: <786399a77d82890a391172fee269272e12c52489.camel@gmail.com>
Le 06/07/2021 à 13:56, Radu Rendec a écrit :
> On Tue, 2021-07-06 at 12:43 +0200, Christophe Leroy wrote:
>> Le 04/07/2021 à 23:38, Radu Rendec a écrit :
>>> I'm trying to set up my (virtual) environment to test an old bug in the
>>> PPC32 ptrace() code. I came across a completely different problem,
>>> which seems to make gdb pretty much unusable on PPC32. I'm not sure if
>>> this is a real kernel bug or maybe something wrong with my
>>> configuration.
>>>
>>> I'm running kernel 5.13 in a qemu VM with one e500mc CPU. I am running
>>> native gdb (inside the VM) and setting a breakpoint in main() in a test
>>> "hello world" program. Upon running the test program, I am hitting the
>>> BUG_ON in do_notify_resume() on line 292. The kernel bug log snippet is
>>> included below at the end of the email.
>>>
>>> FWIW, gdb says:
>>> Program terminated with signal SIGTRAP, Trace/breakpoint trap.
>>> The program no longer exists.
>>>
>>> I also added a pr_info() to do_notify_resume() just to see how much
>>> different 'regs' and 'current->thread.regs' are. Surprisingly, they are
>>> just 0x30 apart: regs=c7955f10 cur=c7955f40. Also, 'current' seems to
>>> be OK (pid and comm are consistent with the test program).
>>
>> The TRAP = 0x7d8 is obviously wrong.
>>
>> Need to know which 'TRAP' it is exactly.
>> Could you try to dump what we have at the correct regs ?
>> Something like 'show_regs(current->thread.regs)' should do it.
>
> Sure, please see the output below. It looks to me like the "correct"
> regs are just garbage. Either they are overwritten or current->thread.regs
> is wrong. But in any case, r1 = 0 doesn't look good.
Yes indeed. I think I identified the problem. For Critical interrupts like DEBUG interrupt, struct
exception_regs is added, therefore the frame has 12x4 (0x30) more bytes. That's what you see.
Commit
https://github.com/linuxppc/linux/commit/db297c3b07af7856fb7c666fbc9792d8e37556be#diff-dd6b952a3980da19df4facccdb4f3dddeb8cef56ee384c7f03d02b23b0c6cb26
Need to find the best solution now to fix that.
>
> regs=c7a0ff10 cur=c7a0ff40 pid=139 comm=test
> CPU: 0 PID: 139 Comm: test Not tainted 5.13.0-dirty #4
> NIP: 10000338 LR: 00030000 CTR: 00000003
> REGS: c7a0ff40 TRAP: 670000 Not tainted (5.13.0-dirty)
> MSR: 1002d202 <CE,EE,PR,ME,DE> CR: 10000004 XER: 80670100
>
> GPR00: b7fc36d8 00000000 00000000 b7fe17b4 00000000 b7ffd588 b7ffe8b8 b7ffee10
> GPR08: b7fff214 b7ffdf40 b7fff208 bffff858 bffff970 b7fff130 00000001 bffff960
> GPR16: b7fff2b0 b7ffd5f0 b7ffe8a8 bffff850 b7fc3714 1002d002 b7fff208 00000003
> GPR24: b7fc3714 00000000 22000284 bffff960 000007d8 10000338 08000000 bffff850
> NIP [10000338] 0x10000338
> LR [00030000] 0x30000
> Call Trace:
> [c7a0fe40] [c0008eac] show_regs+0x4c/0x1b0 (unreliable)
> [c7a0fe80] [c000969c] do_notify_resume+0x31c/0x320
> [c7a0fee0] [c0010b94] interrupt_exit_user_prepare+0x94/0xc0
> [c7a0ff00] [c00151e8] interrupt_return+0x14/0x13c
> --- interrupt: 7d8 at 0xb7fc3714
> NIP: b7fc3714 LR: b7fc3714 CTR: 00000003
> REGS: c7a0ff10 TRAP: 07d8 Not tainted (5.13.0-dirty)
> MSR: 1002d002 <CE,EE,PR,ME> CR: 22000284 XER: 00000000
>
> GPR00: b7fc3584 bffff850 00000000 00000000 00000000 00000000 000000a0 6474e552
> GPR08: b7fbe0d4 00000001 b7fff230 bffff850 b7fc36d8 00000000 00000000 b7fe17b4
> GPR16: 00000000 b7ffd588 b7ffe8b8 b7ffee10 b7fff214 b7ffdf40 b7fff208 bffff858
> GPR24: bffff970 b7fff130 00000001 bffff960 b7fff2b0 b7ffd5f0 b7ffe8a8 bffff850
> NIP [b7fc3714] 0xb7fc3714
> LR [b7fc3714] 0xb7fc3714
> --- interrupt: 7d8
> ------------[ cut here ]------------
> kernel BUG at arch/powerpc/kernel/signal.c:298!
> Oops: Exception in kernel mode, sig: 5 [#1]
> BE PAGE_SIZE=4K SMP NR_CPUS=24 QEMU e500
> Modules linked in:
> CPU: 0 PID: 139 Comm: test Not tainted 5.13.0-dirty #4
> NIP: c000969c LR: c000969c CTR: c065f540
> REGS: c7a0fdc0 TRAP: 0700 Not tainted (5.13.0-dirty)
> MSR: 00028002 <CE,EE> CR: 28000282 XER: 20000000
>
> GPR00: c000969c c7a0fe80 c70ef500 c70efbd8 c70ef500 00000010 c7a0fc38 00000002
> GPR08: 00000001 00000000 00000000 00000000 28000282 00000000 00000000 b7fe17b4
> GPR16: 00000000 b7ffd588 b7ffe8b8 b7ffee10 b7fff214 b7ffdf40 b7fff208 bffff858
> GPR24: bffff970 b7fff130 00000001 bffff960 c7a0ff10 00000800 c70ef500 00000102
> NIP [c000969c] do_notify_resume+0x31c/0x320
> LR [c000969c] do_notify_resume+0x31c/0x320
> Call Trace:
> [c7a0fe80] [c000969c] do_notify_resume+0x31c/0x320 (unreliable)
> [c7a0fee0] [c0010b94] interrupt_exit_user_prepare+0x94/0xc0
> [c7a0ff00] [c00151e8] interrupt_return+0x14/0x13c
> --- interrupt: 7d8 at 0xb7fc3714
> NIP: b7fc3714 LR: b7fc3714 CTR: 00000003
> REGS: c7a0ff10 TRAP: 07d8 Not tainted (5.13.0-dirty)
> MSR: 1002d002 <CE,EE,PR,ME> CR: 22000284 XER: 00000000
>
> GPR00: b7fc3584 bffff850 00000000 00000000 00000000 00000000 000000a0 6474e552
> GPR08: b7fbe0d4 00000001 b7fff230 bffff850 b7fc36d8 00000000 00000000 b7fe17b4
> GPR16: 00000000 b7ffd588 b7ffe8b8 b7ffee10 b7fff214 b7ffdf40 b7fff208 bffff858
> GPR24: bffff970 b7fff130 00000001 bffff960 b7fff2b0 b7ffd5f0 b7ffe8a8 bffff850
> NIP [b7fc3714] 0xb7fc3714
> LR [b7fc3714] 0xb7fc3714
> --- interrupt: 7d8
> Instruction dump:
> 93a10054 90010064 93c10058 48b95369 80c20398 3c60c0dc 7f84e378 38e204b0
> 3863ce30 4809d819 80620704 4bfff7c9 <0fe00000> 3d20c0ff 8129c014 2c090000
> ---[ end trace 1cbf27cd19ae39a0 ]---
>
>>> If I'm not missing something, the 'regs' pointer that is eventually
>>> passed to do_notify_resume() is calculated in interrupt_return() by
>>> adding STACK_FRAME_OVERHEAD (defined to 112) to the value of r1. That
>>> means all registers are saved on the stack before entering the
>>> interrupt handler and, upon returning, a pointer to the register
>>> structure is calculated from the stack pointer. Either the offset
>>> itself is wrong, or the stack pointer is off by 0x30.
>>>
>>> This is as far as I have gone. Hopefully this rings a bell to someone
>>> who is familiar with that part of the code and has a better
>>> understanding of PPC32 interrupt handling in general.
>>>
>>> Last but not least, my configuration is fairly standard. I'm using the
>>> powerpc-e500mc--glibc--bleeding-edge-2020.08-1 toolchain from Bootlin
>>> to compile everything (kernel and user-space). The qemu version is
>>> 5.2.0 (Fedora 34) and the user-space is a small Busybox based rootfs
>>> that I built using Buildroot 2021.05. The gdb version is 9.2.
^ permalink raw reply
* Re: [PATCH v15 06/12] swiotlb: Use is_swiotlb_force_bounce for swiotlb data bouncing
From: Will Deacon @ 2021-07-06 13:24 UTC (permalink / raw)
To: Christoph Hellwig
Cc: heikki.krogerus, thomas.hellstrom, peterz, joonas.lahtinen,
dri-devel, chris, grant.likely, paulus, Frank Rowand, mingo,
Marek Szyprowski, Stefano Stabellini, Saravana Kannan,
Joerg Roedel, Rafael J . Wysocki, Bartosz Golaszewski, bskeggs,
linux-pci, xen-devel, Thierry Reding, intel-gfx, matthew.auld,
linux-devicetree, Jianxiong Gao, Daniel Vetter,
Konrad Rzeszutek Wilk, maarten.lankhorst, airlied, Dan Williams,
linuxppc-dev, jani.nikula, Nathan Chancellor, Rob Herring,
rodrigo.vivi, Bjorn Helgaas, Claire Chang, boris.ostrovsky,
Andy Shevchenko, jgross, Nicolas Boichat, Greg KH, Randy Dunlap,
Qian Cai, lkml, Tomasz Figa, list@263.net:IOMMU DRIVERS,
Jim Quinlan, xypron.glpk, Tom Lendacky, Robin Murphy, bauerman
In-Reply-To: <20210706044848.GA13640@lst.de>
On Tue, Jul 06, 2021 at 06:48:48AM +0200, Christoph Hellwig wrote:
> On Mon, Jul 05, 2021 at 08:03:52PM +0100, Will Deacon wrote:
> > So at this point, the AMD IOMMU driver does:
> >
> > swiotlb = (iommu_default_passthrough() || sme_me_mask) ? 1 : 0;
> >
> > where 'swiotlb' is a global variable indicating whether or not swiotlb
> > is in use. It's picked up a bit later on by pci_swiotlb_late_init(), which
> > will call swiotlb_exit() if 'swiotlb' is false.
> >
> > Now, that used to work fine, because swiotlb_exit() clears
> > 'io_tlb_default_mem' to NULL, but now with the restricted DMA changes, I
> > think that all the devices which have successfully probed beforehand will
> > have stale pointers to the freed structure in their 'dev->dma_io_tlb_mem'
> > field.
>
> Yeah. I don't think we can do that anymore, and I also think it is
> a bad idea to start with.
I've had a crack at reworking things along the following lines:
- io_tlb_default_mem now lives in the BSS, the flexible array member
is now a pointer and that part is allocated dynamically (downside of
this is an extra indirection to get at the slots).
- io_tlb_default_mem.nslabs tells you whether the thing is valid
- swiotlb_exit() frees the slots array and clears the rest of the
structure to 0. I also extended it to free the actual slabs, but I'm
not sure why it wasn't doing that before.
So a non-NULL dev->dma_io_tlb_mem should always be valid to follow.
Untested diff below... Nathan, it would be ace if you're brave enough
to give this a shot.
Will
--->8
diff --git a/drivers/base/core.c b/drivers/base/core.c
index bbad7c559901..9e1218f89e4b 100644
--- a/drivers/base/core.c
+++ b/drivers/base/core.c
@@ -2820,7 +2820,7 @@ void device_initialize(struct device *dev)
dev->dma_coherent = dma_default_coherent;
#endif
#ifdef CONFIG_SWIOTLB
- dev->dma_io_tlb_mem = io_tlb_default_mem;
+ dev->dma_io_tlb_mem = &io_tlb_default_mem;
#endif
}
EXPORT_SYMBOL_GPL(device_initialize);
diff --git a/drivers/xen/swiotlb-xen.c b/drivers/xen/swiotlb-xen.c
index 785ec7e8be01..f06d9b4f1e0f 100644
--- a/drivers/xen/swiotlb-xen.c
+++ b/drivers/xen/swiotlb-xen.c
@@ -164,7 +164,7 @@ int __ref xen_swiotlb_init(void)
int rc = -ENOMEM;
char *start;
- if (io_tlb_default_mem != NULL) {
+ if (io_tlb_default_mem.nslabs) {
pr_warn("swiotlb buffer already initialized\n");
return -EEXIST;
}
@@ -547,7 +547,7 @@ xen_swiotlb_sync_sg_for_device(struct device *dev, struct scatterlist *sgl,
static int
xen_swiotlb_dma_supported(struct device *hwdev, u64 mask)
{
- return xen_phys_to_dma(hwdev, io_tlb_default_mem->end - 1) <= mask;
+ return xen_phys_to_dma(hwdev, io_tlb_default_mem.end - 1) <= mask;
}
const struct dma_map_ops xen_swiotlb_dma_ops = {
diff --git a/include/linux/swiotlb.h b/include/linux/swiotlb.h
index 39284ff2a6cd..b0cb2a9973f4 100644
--- a/include/linux/swiotlb.h
+++ b/include/linux/swiotlb.h
@@ -103,9 +103,9 @@ struct io_tlb_mem {
phys_addr_t orig_addr;
size_t alloc_size;
unsigned int list;
- } slots[];
+ } *slots;
};
-extern struct io_tlb_mem *io_tlb_default_mem;
+extern struct io_tlb_mem io_tlb_default_mem;
static inline bool is_swiotlb_buffer(struct device *dev, phys_addr_t paddr)
{
diff --git a/kernel/dma/swiotlb.c b/kernel/dma/swiotlb.c
index 0ffbaae9fba2..91cd1d413027 100644
--- a/kernel/dma/swiotlb.c
+++ b/kernel/dma/swiotlb.c
@@ -70,7 +70,7 @@
enum swiotlb_force swiotlb_force;
-struct io_tlb_mem *io_tlb_default_mem;
+struct io_tlb_mem io_tlb_default_mem;
/*
* Max segment that we can provide which (if pages are contingous) will
@@ -101,7 +101,7 @@ early_param("swiotlb", setup_io_tlb_npages);
unsigned int swiotlb_max_segment(void)
{
- return io_tlb_default_mem ? max_segment : 0;
+ return io_tlb_default_mem.nslabs ? max_segment : 0;
}
EXPORT_SYMBOL_GPL(swiotlb_max_segment);
@@ -134,9 +134,9 @@ void __init swiotlb_adjust_size(unsigned long size)
void swiotlb_print_info(void)
{
- struct io_tlb_mem *mem = io_tlb_default_mem;
+ struct io_tlb_mem *mem = &io_tlb_default_mem;
- if (!mem) {
+ if (!mem->nslabs) {
pr_warn("No low mem\n");
return;
}
@@ -163,11 +163,11 @@ static inline unsigned long nr_slots(u64 val)
*/
void __init swiotlb_update_mem_attributes(void)
{
- struct io_tlb_mem *mem = io_tlb_default_mem;
+ struct io_tlb_mem *mem = &io_tlb_default_mem;
void *vaddr;
unsigned long bytes;
- if (!mem || mem->late_alloc)
+ if (!mem->nslabs || mem->late_alloc)
return;
vaddr = phys_to_virt(mem->start);
bytes = PAGE_ALIGN(mem->nslabs << IO_TLB_SHIFT);
@@ -201,25 +201,24 @@ static void swiotlb_init_io_tlb_mem(struct io_tlb_mem *mem, phys_addr_t start,
int __init swiotlb_init_with_tbl(char *tlb, unsigned long nslabs, int verbose)
{
- struct io_tlb_mem *mem;
+ struct io_tlb_mem *mem = &io_tlb_default_mem;
size_t alloc_size;
if (swiotlb_force == SWIOTLB_NO_FORCE)
return 0;
/* protect against double initialization */
- if (WARN_ON_ONCE(io_tlb_default_mem))
+ if (WARN_ON_ONCE(mem->nslabs))
return -ENOMEM;
- alloc_size = PAGE_ALIGN(struct_size(mem, slots, nslabs));
- mem = memblock_alloc(alloc_size, PAGE_SIZE);
- if (!mem)
+ alloc_size = PAGE_ALIGN(array_size(sizeof(*mem->slots), nslabs));
+ mem->slots = memblock_alloc(alloc_size, PAGE_SIZE);
+ if (!mem->slots)
panic("%s: Failed to allocate %zu bytes align=0x%lx\n",
__func__, alloc_size, PAGE_SIZE);
swiotlb_init_io_tlb_mem(mem, __pa(tlb), nslabs, false);
- io_tlb_default_mem = mem;
if (verbose)
swiotlb_print_info();
swiotlb_set_max_segment(mem->nslabs << IO_TLB_SHIFT);
@@ -304,26 +303,24 @@ swiotlb_late_init_with_default_size(size_t default_size)
int
swiotlb_late_init_with_tbl(char *tlb, unsigned long nslabs)
{
- struct io_tlb_mem *mem;
+ struct io_tlb_mem *mem = &io_tlb_default_mem;
unsigned long bytes = nslabs << IO_TLB_SHIFT;
if (swiotlb_force == SWIOTLB_NO_FORCE)
return 0;
/* protect against double initialization */
- if (WARN_ON_ONCE(io_tlb_default_mem))
+ if (WARN_ON_ONCE(mem->nslabs))
return -ENOMEM;
- mem = (void *)__get_free_pages(GFP_KERNEL,
- get_order(struct_size(mem, slots, nslabs)));
- if (!mem)
+ mem->slots = (void *)__get_free_pages(GFP_KERNEL | __GFP_ZERO,
+ get_order(array_size(sizeof(*mem->slots), nslabs)));
+ if (!mem->slots)
return -ENOMEM;
- memset(mem, 0, sizeof(*mem));
set_memory_decrypted((unsigned long)tlb, bytes >> PAGE_SHIFT);
swiotlb_init_io_tlb_mem(mem, virt_to_phys(tlb), nslabs, true);
- io_tlb_default_mem = mem;
swiotlb_print_info();
swiotlb_set_max_segment(mem->nslabs << IO_TLB_SHIFT);
return 0;
@@ -331,18 +328,23 @@ swiotlb_late_init_with_tbl(char *tlb, unsigned long nslabs)
void __init swiotlb_exit(void)
{
- struct io_tlb_mem *mem = io_tlb_default_mem;
- size_t size;
+ struct io_tlb_mem *mem = &io_tlb_default_mem;
+ size_t tbl_size, slots_size;
- if (!mem)
+ if (!mem->nslabs)
return;
- size = struct_size(mem, slots, mem->nslabs);
- if (mem->late_alloc)
- free_pages((unsigned long)mem, get_order(size));
- else
- memblock_free_late(__pa(mem), PAGE_ALIGN(size));
- io_tlb_default_mem = NULL;
+ tbl_size = mem->end - mem->start;
+ slots_size = array_size(sizeof(*mem->slots), mem->nslabs);
+ if (mem->late_alloc) {
+ free_pages((unsigned long)mem->start, get_order(tbl_size));
+ free_pages((unsigned long)mem->slots, get_order(slots_size));
+ } else {
+ memblock_free_late(__pa(mem->start), PAGE_ALIGN(tbl_size));
+ memblock_free_late(__pa(mem->slots), PAGE_ALIGN(slots_size));
+ }
+
+ memset(mem, 0, sizeof(*mem));
}
/*
@@ -682,7 +684,9 @@ size_t swiotlb_max_mapping_size(struct device *dev)
bool is_swiotlb_active(struct device *dev)
{
- return dev->dma_io_tlb_mem != NULL;
+ struct io_tlb_mem *mem = dev->dma_io_tlb_mem;
+
+ return mem && mem->nslabs;
}
EXPORT_SYMBOL_GPL(is_swiotlb_active);
@@ -697,10 +701,10 @@ static void swiotlb_create_debugfs_files(struct io_tlb_mem *mem)
static int __init swiotlb_create_default_debugfs(void)
{
- struct io_tlb_mem *mem = io_tlb_default_mem;
+ struct io_tlb_mem *mem = &io_tlb_default_mem;
debugfs_dir = debugfs_create_dir("swiotlb", NULL);
- if (mem) {
+ if (mem->nslabs) {
mem->debugfs = debugfs_dir;
swiotlb_create_debugfs_files(mem);
}
@@ -754,10 +758,17 @@ static int rmem_swiotlb_device_init(struct reserved_mem *rmem,
* to it.
*/
if (!mem) {
- mem = kzalloc(struct_size(mem, slots, nslabs), GFP_KERNEL);
+ mem = kzalloc(sizeof(*mem), GFP_KERNEL);
if (!mem)
return -ENOMEM;
+ mem->slots = kzalloc(array_size(sizeof(*mem->slots), nslabs),
+ GFP_KERNEL);
+ if (!mem->slots) {
+ kfree(mem);
+ return -ENOMEM;
+ }
+
set_memory_decrypted((unsigned long)phys_to_virt(rmem->base),
rmem->size >> PAGE_SHIFT);
swiotlb_init_io_tlb_mem(mem, rmem->base, nslabs, false);
@@ -781,7 +792,7 @@ static int rmem_swiotlb_device_init(struct reserved_mem *rmem,
static void rmem_swiotlb_device_release(struct reserved_mem *rmem,
struct device *dev)
{
- dev->dma_io_tlb_mem = io_tlb_default_mem;
+ dev->dma_io_tlb_mem = &io_tlb_default_mem;
}
static const struct reserved_mem_ops rmem_swiotlb_ops = {
^ permalink raw reply related
* Re: Hitting BUG_ON in do_notify_resume() with gdb and SIGTRAP
From: Radu Rendec @ 2021-07-06 13:50 UTC (permalink / raw)
To: Christophe Leroy, linuxppc-dev, Nicholas Piggin
In-Reply-To: <200445ae-c3fc-ccc8-f77d-aebce2b09046@csgroup.eu>
On Tue, 2021-07-06 at 15:16 +0200, Christophe Leroy wrote:
>Le 06/07/2021 à 13:56, Radu Rendec a écrit :
>> On Tue, 2021-07-06 at 12:43 +0200, Christophe Leroy wrote:
>>> Le 04/07/2021 à 23:38, Radu Rendec a écrit :
>>>> I'm trying to set up my (virtual) environment to test an old bug in the
>>>> PPC32 ptrace() code. I came across a completely different problem,
>>>> which seems to make gdb pretty much unusable on PPC32. I'm not sure if
>>>> this is a real kernel bug or maybe something wrong with my
>>>> configuration.
>>>>
>>>> I'm running kernel 5.13 in a qemu VM with one e500mc CPU. I am running
>>>> native gdb (inside the VM) and setting a breakpoint in main() in a test
>>>> "hello world" program. Upon running the test program, I am hitting the
>>>> BUG_ON in do_notify_resume() on line 292. The kernel bug log snippet is
>>>> included below at the end of the email.
>>>>
>>>> FWIW, gdb says:
>>>> Program terminated with signal SIGTRAP, Trace/breakpoint trap.
>>>> The program no longer exists.
>>>>
>>>> I also added a pr_info() to do_notify_resume() just to see how much
>>>> different 'regs' and 'current->thread.regs' are. Surprisingly, they are
>>>> just 0x30 apart: regs=c7955f10 cur=c7955f40. Also, 'current' seems to
>>>> be OK (pid and comm are consistent with the test program).
>>>
>>> The TRAP = 0x7d8 is obviously wrong.
>>>
>>> Need to know which 'TRAP' it is exactly.
>>> Could you try to dump what we have at the correct regs ?
>>> Something like 'show_regs(current->thread.regs)' should do it.
>>
>> Sure, please see the output below. It looks to me like the "correct"
>> regs are just garbage. Either they are overwritten or current->thread.regs
>> is wrong. But in any case, r1 = 0 doesn't look good.
>
>Yes indeed. I think I identified the problem. For Critical interrupts like DEBUG interrupt, struct
>exception_regs is added, therefore the frame has 12x4 (0x30) more bytes. That's what you see.
>
>Commit
>https://github.com/linuxppc/linux/commit/db297c3b07af7856fb7c666fbc9792d8e37556be#diff-dd6b952a3980da19df4facccdb4f3dddeb8cef56ee384c7f03d02b23b0c6cb26
>
>Need to find the best solution now to fix that.
Awesome, happy to see you figured it out so quickly.
I'm not sure if it makes any sense, but one thing that comes to mind is
to put struct exception_regs before struct pt_regs when the frame is
saved. Unless of course other parts of the code expect the opposite.
>> regs=c7a0ff10 cur=c7a0ff40 pid=139 comm=test
>> CPU: 0 PID: 139 Comm: test Not tainted 5.13.0-dirty #4
>> NIP: 10000338 LR: 00030000 CTR: 00000003
>> REGS: c7a0ff40 TRAP: 670000 Not tainted (5.13.0-dirty)
>> MSR: 1002d202 <CE,EE,PR,ME,DE> CR: 10000004 XER: 80670100
>>
>> GPR00: b7fc36d8 00000000 00000000 b7fe17b4 00000000 b7ffd588 b7ffe8b8 b7ffee10
>> GPR08: b7fff214 b7ffdf40 b7fff208 bffff858 bffff970 b7fff130 00000001 bffff960
>> GPR16: b7fff2b0 b7ffd5f0 b7ffe8a8 bffff850 b7fc3714 1002d002 b7fff208 00000003
>> GPR24: b7fc3714 00000000 22000284 bffff960 000007d8 10000338 08000000 bffff850
>> NIP [10000338] 0x10000338
>> LR [00030000] 0x30000
>> Call Trace:
>> [c7a0fe40] [c0008eac] show_regs+0x4c/0x1b0 (unreliable)
>> [c7a0fe80] [c000969c] do_notify_resume+0x31c/0x320
>> [c7a0fee0] [c0010b94] interrupt_exit_user_prepare+0x94/0xc0
>> [c7a0ff00] [c00151e8] interrupt_return+0x14/0x13c
>> --- interrupt: 7d8 at 0xb7fc3714
>> NIP: b7fc3714 LR: b7fc3714 CTR: 00000003
>> REGS: c7a0ff10 TRAP: 07d8 Not tainted (5.13.0-dirty)
>> MSR: 1002d002 <CE,EE,PR,ME> CR: 22000284 XER: 00000000
>>
>> GPR00: b7fc3584 bffff850 00000000 00000000 00000000 00000000 000000a0 6474e552
>> GPR08: b7fbe0d4 00000001 b7fff230 bffff850 b7fc36d8 00000000 00000000 b7fe17b4
>> GPR16: 00000000 b7ffd588 b7ffe8b8 b7ffee10 b7fff214 b7ffdf40 b7fff208 bffff858
>> GPR24: bffff970 b7fff130 00000001 bffff960 b7fff2b0 b7ffd5f0 b7ffe8a8 bffff850
>> NIP [b7fc3714] 0xb7fc3714
>> LR [b7fc3714] 0xb7fc3714
>> --- interrupt: 7d8
>> ------------[ cut here ]------------
>> kernel BUG at arch/powerpc/kernel/signal.c:298!
>> Oops: Exception in kernel mode, sig: 5 [#1]
>> BE PAGE_SIZE=4K SMP NR_CPUS=24 QEMU e500
>> Modules linked in:
>> CPU: 0 PID: 139 Comm: test Not tainted 5.13.0-dirty #4
>> NIP: c000969c LR: c000969c CTR: c065f540
>> REGS: c7a0fdc0 TRAP: 0700 Not tainted (5.13.0-dirty)
>> MSR: 00028002 <CE,EE> CR: 28000282 XER: 20000000
>>
>> GPR00: c000969c c7a0fe80 c70ef500 c70efbd8 c70ef500 00000010 c7a0fc38 00000002
>> GPR08: 00000001 00000000 00000000 00000000 28000282 00000000 00000000 b7fe17b4
>> GPR16: 00000000 b7ffd588 b7ffe8b8 b7ffee10 b7fff214 b7ffdf40 b7fff208 bffff858
>> GPR24: bffff970 b7fff130 00000001 bffff960 c7a0ff10 00000800 c70ef500 00000102
>> NIP [c000969c] do_notify_resume+0x31c/0x320
>> LR [c000969c] do_notify_resume+0x31c/0x320
>> Call Trace:
>> [c7a0fe80] [c000969c] do_notify_resume+0x31c/0x320 (unreliable)
>> [c7a0fee0] [c0010b94] interrupt_exit_user_prepare+0x94/0xc0
>> [c7a0ff00] [c00151e8] interrupt_return+0x14/0x13c
>> --- interrupt: 7d8 at 0xb7fc3714
>> NIP: b7fc3714 LR: b7fc3714 CTR: 00000003
>> REGS: c7a0ff10 TRAP: 07d8 Not tainted (5.13.0-dirty)
>> MSR: 1002d002 <CE,EE,PR,ME> CR: 22000284 XER: 00000000
>>
>> GPR00: b7fc3584 bffff850 00000000 00000000 00000000 00000000 000000a0 6474e552
>> GPR08: b7fbe0d4 00000001 b7fff230 bffff850 b7fc36d8 00000000 00000000 b7fe17b4
>> GPR16: 00000000 b7ffd588 b7ffe8b8 b7ffee10 b7fff214 b7ffdf40 b7fff208 bffff858
>> GPR24: bffff970 b7fff130 00000001 bffff960 b7fff2b0 b7ffd5f0 b7ffe8a8 bffff850
>> NIP [b7fc3714] 0xb7fc3714
>> LR [b7fc3714] 0xb7fc3714
>> --- interrupt: 7d8
>> Instruction dump:
>> 93a10054 90010064 93c10058 48b95369 80c20398 3c60c0dc 7f84e378 38e204b0
>> 3863ce30 4809d819 80620704 4bfff7c9 <0fe00000> 3d20c0ff 8129c014 2c090000
>> ---[ end trace 1cbf27cd19ae39a0 ]---
>>
>>>> If I'm not missing something, the 'regs' pointer that is eventually
>>>> passed to do_notify_resume() is calculated in interrupt_return() by
>>>> adding STACK_FRAME_OVERHEAD (defined to 112) to the value of r1. That
>>>> means all registers are saved on the stack before entering the
>>>> interrupt handler and, upon returning, a pointer to the register
>>>> structure is calculated from the stack pointer. Either the offset
>>>> itself is wrong, or the stack pointer is off by 0x30.
>>>>
>>>> This is as far as I have gone. Hopefully this rings a bell to someone
>>>> who is familiar with that part of the code and has a better
>>>> understanding of PPC32 interrupt handling in general.
>>>>
>>>> Last but not least, my configuration is fairly standard. I'm using the
>>>> powerpc-e500mc--glibc--bleeding-edge-2020.08-1 toolchain from Bootlin
>>>> to compile everything (kernel and user-space). The qemu version is
>>>> 5.2.0 (Fedora 34) and the user-space is a small Busybox based rootfs
>>>> that I built using Buildroot 2021.05. The gdb version is 9.2.
^ permalink raw reply
* Re: Hitting BUG_ON in do_notify_resume() with gdb and SIGTRAP
From: Christophe Leroy @ 2021-07-06 13:53 UTC (permalink / raw)
To: Radu Rendec, linuxppc-dev, Nicholas Piggin
In-Reply-To: <159a8bf58c9f8838bf38e495a3a376aaae14eaa6.camel@gmail.com>
Le 06/07/2021 à 15:50, Radu Rendec a écrit :
> On Tue, 2021-07-06 at 15:16 +0200, Christophe Leroy wrote:
>> Le 06/07/2021 à 13:56, Radu Rendec a écrit :
>>> On Tue, 2021-07-06 at 12:43 +0200, Christophe Leroy wrote:
>>>> Le 04/07/2021 à 23:38, Radu Rendec a écrit :
>>>>> I'm trying to set up my (virtual) environment to test an old bug in the
>>>>> PPC32 ptrace() code. I came across a completely different problem,
>>>>> which seems to make gdb pretty much unusable on PPC32. I'm not sure if
>>>>> this is a real kernel bug or maybe something wrong with my
>>>>> configuration.
>>>>>
>>>>> I'm running kernel 5.13 in a qemu VM with one e500mc CPU. I am running
>>>>> native gdb (inside the VM) and setting a breakpoint in main() in a test
>>>>> "hello world" program. Upon running the test program, I am hitting the
>>>>> BUG_ON in do_notify_resume() on line 292. The kernel bug log snippet is
>>>>> included below at the end of the email.
>>>>>
>>>>> FWIW, gdb says:
>>>>> Program terminated with signal SIGTRAP, Trace/breakpoint trap.
>>>>> The program no longer exists.
>>>>>
>>>>> I also added a pr_info() to do_notify_resume() just to see how much
>>>>> different 'regs' and 'current->thread.regs' are. Surprisingly, they are
>>>>> just 0x30 apart: regs=c7955f10 cur=c7955f40. Also, 'current' seems to
>>>>> be OK (pid and comm are consistent with the test program).
>>>>
>>>> The TRAP = 0x7d8 is obviously wrong.
>>>>
>>>> Need to know which 'TRAP' it is exactly.
>>>> Could you try to dump what we have at the correct regs ?
>>>> Something like 'show_regs(current->thread.regs)' should do it.
>>>
>>> Sure, please see the output below. It looks to me like the "correct"
>>> regs are just garbage. Either they are overwritten or current->thread.regs
>>> is wrong. But in any case, r1 = 0 doesn't look good.
>>
>> Yes indeed. I think I identified the problem. For Critical interrupts like DEBUG interrupt, struct
>> exception_regs is added, therefore the frame has 12x4 (0x30) more bytes. That's what you see.
>>
>> Commit
>> https://github.com/linuxppc/linux/commit/db297c3b07af7856fb7c666fbc9792d8e37556be#diff-dd6b952a3980da19df4facccdb4f3dddeb8cef56ee384c7f03d02b23b0c6cb26
>>
>> Need to find the best solution now to fix that.
>
> Awesome, happy to see you figured it out so quickly.
>
> I'm not sure if it makes any sense, but one thing that comes to mind is
> to put struct exception_regs before struct pt_regs when the frame is
> saved. Unless of course other parts of the code expect the opposite.
>
Yes I think it is a good idea. I think I won't have time to look at that before summer vacation though.
^ permalink raw reply
* Re: [PATCH v15 06/12] swiotlb: Use is_swiotlb_force_bounce for swiotlb data bouncing
From: Robin Murphy @ 2021-07-06 14:01 UTC (permalink / raw)
To: Will Deacon, Christoph Hellwig
Cc: Jim Quinlan, heikki.krogerus, linux-devicetree, peterz,
joonas.lahtinen, dri-devel, chris, grant.likely, paulus,
Frank Rowand, mingo, Jianxiong Gao, Stefano Stabellini,
Saravana Kannan, Rafael J . Wysocki, Bartosz Golaszewski,
matthew.auld, linux-pci, xen-devel, Thierry Reding, bskeggs,
Nicolas Boichat, thomas.hellstrom, jgross, Konrad Rzeszutek Wilk,
intel-gfx, maarten.lankhorst, jani.nikula, Nathan Chancellor,
Rob Herring, rodrigo.vivi, Bjorn Helgaas, Claire Chang,
Dan Williams, Andy Shevchenko, boris.ostrovsky, airlied, Greg KH,
Randy Dunlap, Qian Cai, lkml, list@263.net:IOMMU DRIVERS,
Daniel Vetter, xypron.glpk, Tom Lendacky, linuxppc-dev, bauerman
In-Reply-To: <20210706132422.GA20327@willie-the-truck>
On 2021-07-06 14:24, Will Deacon wrote:
> On Tue, Jul 06, 2021 at 06:48:48AM +0200, Christoph Hellwig wrote:
>> On Mon, Jul 05, 2021 at 08:03:52PM +0100, Will Deacon wrote:
>>> So at this point, the AMD IOMMU driver does:
>>>
>>> swiotlb = (iommu_default_passthrough() || sme_me_mask) ? 1 : 0;
>>>
>>> where 'swiotlb' is a global variable indicating whether or not swiotlb
>>> is in use. It's picked up a bit later on by pci_swiotlb_late_init(), which
>>> will call swiotlb_exit() if 'swiotlb' is false.
>>>
>>> Now, that used to work fine, because swiotlb_exit() clears
>>> 'io_tlb_default_mem' to NULL, but now with the restricted DMA changes, I
>>> think that all the devices which have successfully probed beforehand will
>>> have stale pointers to the freed structure in their 'dev->dma_io_tlb_mem'
>>> field.
>>
>> Yeah. I don't think we can do that anymore, and I also think it is
>> a bad idea to start with.
>
> I've had a crack at reworking things along the following lines:
>
> - io_tlb_default_mem now lives in the BSS, the flexible array member
> is now a pointer and that part is allocated dynamically (downside of
> this is an extra indirection to get at the slots).
>
> - io_tlb_default_mem.nslabs tells you whether the thing is valid
>
> - swiotlb_exit() frees the slots array and clears the rest of the
> structure to 0. I also extended it to free the actual slabs, but I'm
> not sure why it wasn't doing that before.
>
> So a non-NULL dev->dma_io_tlb_mem should always be valid to follow.
FWIW I was pondering the question of whether to do something along those
lines or just scrap the default assignment entirely, so since I hadn't
got round to saying that I've gone ahead and hacked up the alternative
(similarly untested) for comparison :)
TBH I'm still not sure which one I prefer...
Robin.
----->8-----
diff --git a/drivers/base/core.c b/drivers/base/core.c
index ea5b85354526..394abf184c1a 100644
--- a/drivers/base/core.c
+++ b/drivers/base/core.c
@@ -2847,9 +2847,6 @@ void device_initialize(struct device *dev)
defined(CONFIG_ARCH_HAS_SYNC_DMA_FOR_CPU_ALL)
dev->dma_coherent = dma_default_coherent;
#endif
-#ifdef CONFIG_SWIOTLB
- dev->dma_io_tlb_mem = io_tlb_default_mem;
-#endif
}
EXPORT_SYMBOL_GPL(device_initialize);
diff --git a/include/linux/swiotlb.h b/include/linux/swiotlb.h
index 39284ff2a6cd..620f16d89a98 100644
--- a/include/linux/swiotlb.h
+++ b/include/linux/swiotlb.h
@@ -107,16 +107,21 @@ struct io_tlb_mem {
};
extern struct io_tlb_mem *io_tlb_default_mem;
+static inline struct io_tlb_mem *dev_iotlb_mem(struct device *dev)
+{
+ return dev->dma_io_tlb_mem ?: io_tlb_default_mem;
+}
+
static inline bool is_swiotlb_buffer(struct device *dev, phys_addr_t
paddr)
{
- struct io_tlb_mem *mem = dev->dma_io_tlb_mem;
+ struct io_tlb_mem *mem = dev_iotlb_mem(dev);
return mem && paddr >= mem->start && paddr < mem->end;
}
static inline bool is_swiotlb_force_bounce(struct device *dev)
{
- struct io_tlb_mem *mem = dev->dma_io_tlb_mem;
+ struct io_tlb_mem *mem = dev_iotlb_mem(dev);
return mem && mem->force_bounce;
}
@@ -167,7 +172,7 @@ bool swiotlb_free(struct device *dev, struct page
*page, size_t size);
static inline bool is_swiotlb_for_alloc(struct device *dev)
{
- return dev->dma_io_tlb_mem->for_alloc;
+ return dev_iotlb_mem(dev)->for_alloc;
}
#else
static inline struct page *swiotlb_alloc(struct device *dev, size_t size)
diff --git a/kernel/dma/swiotlb.c b/kernel/dma/swiotlb.c
index b7f76bca89bf..f4942149f87d 100644
--- a/kernel/dma/swiotlb.c
+++ b/kernel/dma/swiotlb.c
@@ -359,7 +359,7 @@ static unsigned int swiotlb_align_offset(struct
device *dev, u64 addr)
static void swiotlb_bounce(struct device *dev, phys_addr_t tlb_addr,
size_t size,
enum dma_data_direction dir)
{
- struct io_tlb_mem *mem = dev->dma_io_tlb_mem;
+ struct io_tlb_mem *mem = dev_iotlb_mem(dev);
int index = (tlb_addr - mem->start) >> IO_TLB_SHIFT;
phys_addr_t orig_addr = mem->slots[index].orig_addr;
size_t alloc_size = mem->slots[index].alloc_size;
@@ -440,7 +440,7 @@ static unsigned int wrap_index(struct io_tlb_mem
*mem, unsigned int index)
static int swiotlb_find_slots(struct device *dev, phys_addr_t orig_addr,
size_t alloc_size)
{
- struct io_tlb_mem *mem = dev->dma_io_tlb_mem;
+ struct io_tlb_mem *mem = dev_iotlb_mem(dev);
unsigned long boundary_mask = dma_get_seg_boundary(dev);
dma_addr_t tbl_dma_addr =
phys_to_dma_unencrypted(dev, mem->start) & boundary_mask;
@@ -522,7 +522,7 @@ phys_addr_t swiotlb_tbl_map_single(struct device
*dev, phys_addr_t orig_addr,
size_t mapping_size, size_t alloc_size,
enum dma_data_direction dir, unsigned long attrs)
{
- struct io_tlb_mem *mem = dev->dma_io_tlb_mem;
+ struct io_tlb_mem *mem = dev_iotlb_mem(dev);
unsigned int offset = swiotlb_align_offset(dev, orig_addr);
unsigned int i;
int index;
@@ -565,7 +565,7 @@ phys_addr_t swiotlb_tbl_map_single(struct device
*dev, phys_addr_t orig_addr,
static void swiotlb_release_slots(struct device *dev, phys_addr_t
tlb_addr)
{
- struct io_tlb_mem *mem = dev->dma_io_tlb_mem;
+ struct io_tlb_mem *mem = dev_iotlb_mem(dev);
unsigned long flags;
unsigned int offset = swiotlb_align_offset(dev, tlb_addr);
int index = (tlb_addr - offset - mem->start) >> IO_TLB_SHIFT;
@@ -682,7 +682,7 @@ size_t swiotlb_max_mapping_size(struct device *dev)
bool is_swiotlb_active(struct device *dev)
{
- return dev->dma_io_tlb_mem != NULL;
+ return dev_iotlb_mem(dev) != NULL;
}
EXPORT_SYMBOL_GPL(is_swiotlb_active);
@@ -729,7 +729,7 @@ static void rmem_swiotlb_debugfs_init(struct
reserved_mem *rmem)
struct page *swiotlb_alloc(struct device *dev, size_t size)
{
- struct io_tlb_mem *mem = dev->dma_io_tlb_mem;
+ struct io_tlb_mem *mem = dev_iotlb_mem(dev);
phys_addr_t tlb_addr;
int index;
@@ -792,7 +792,7 @@ static int rmem_swiotlb_device_init(struct
reserved_mem *rmem,
static void rmem_swiotlb_device_release(struct reserved_mem *rmem,
struct device *dev)
{
- dev->dma_io_tlb_mem = io_tlb_default_mem;
+ dev->dma_io_tlb_mem = NULL;
}
static const struct reserved_mem_ops rmem_swiotlb_ops = {
^ permalink raw reply related
* Re: [PATCH v15 06/12] swiotlb: Use is_swiotlb_force_bounce for swiotlb data bouncing
From: Christoph Hellwig @ 2021-07-06 14:05 UTC (permalink / raw)
To: Robin Murphy
Cc: Jim Quinlan, heikki.krogerus, linux-devicetree, peterz,
joonas.lahtinen, dri-devel, chris, grant.likely, paulus,
Frank Rowand, mingo, Jianxiong Gao, Stefano Stabellini,
Saravana Kannan, Rafael J . Wysocki, Christoph Hellwig,
Bartosz Golaszewski, bskeggs, linux-pci, xen-devel,
Thierry Reding, matthew.auld, Nicolas Boichat, thomas.hellstrom,
jgross, Will Deacon, Konrad Rzeszutek Wilk, intel-gfx,
maarten.lankhorst, jani.nikula, Nathan Chancellor, Rob Herring,
rodrigo.vivi, Bjorn Helgaas, Claire Chang, Dan Williams,
Andy Shevchenko, boris.ostrovsky, airlied, Greg KH, Randy Dunlap,
Qian Cai, lkml, list@263.net:IOMMU DRIVERS, Daniel Vetter,
xypron.glpk, Tom Lendacky, linuxppc-dev, bauerman
In-Reply-To: <a59f771f-3289-62f0-ca50-8f3675d9b166@arm.com>
On Tue, Jul 06, 2021 at 03:01:04PM +0100, Robin Murphy wrote:
> FWIW I was pondering the question of whether to do something along those
> lines or just scrap the default assignment entirely, so since I hadn't got
> round to saying that I've gone ahead and hacked up the alternative
> (similarly untested) for comparison :)
>
> TBH I'm still not sure which one I prefer...
Claire did implement something like your suggestion originally, but
I don't really like it as it doesn't scale for adding multiple global
pools, e.g. for the 64-bit addressable one for the various encrypted
secure guest schemes.
^ permalink raw reply
* Re: Hitting BUG_ON in do_notify_resume() with gdb and SIGTRAP
From: Radu Rendec @ 2021-07-06 14:05 UTC (permalink / raw)
To: Christophe Leroy, linuxppc-dev, Nicholas Piggin
In-Reply-To: <376d1887-1deb-1c04-a2c7-3680daef7505@csgroup.eu>
On Tue, 2021-07-06 at 15:53 +0200, Christophe Leroy wrote:
>Le 06/07/2021 à 15:50, Radu Rendec a écrit :
>> On Tue, 2021-07-06 at 15:16 +0200, Christophe Leroy wrote:
>>> Le 06/07/2021 à 13:56, Radu Rendec a écrit :
>>>> On Tue, 2021-07-06 at 12:43 +0200, Christophe Leroy wrote:
>>>>> Le 04/07/2021 à 23:38, Radu Rendec a écrit :
>>>>>> I'm trying to set up my (virtual) environment to test an old bug in the
>>>>>> PPC32 ptrace() code. I came across a completely different problem,
>>>>>> which seems to make gdb pretty much unusable on PPC32. I'm not sure if
>>>>>> this is a real kernel bug or maybe something wrong with my
>>>>>> configuration.
>>>>>>
>>>>>> I'm running kernel 5.13 in a qemu VM with one e500mc CPU. I am running
>>>>>> native gdb (inside the VM) and setting a breakpoint in main() in a test
>>>>>> "hello world" program. Upon running the test program, I am hitting the
>>>>>> BUG_ON in do_notify_resume() on line 292. The kernel bug log snippet is
>>>>>> included below at the end of the email.
>>>>>>
>>>>>> FWIW, gdb says:
>>>>>> Program terminated with signal SIGTRAP, Trace/breakpoint trap.
>>>>>> The program no longer exists.
>>>>>>
>>>>>> I also added a pr_info() to do_notify_resume() just to see how much
>>>>>> different 'regs' and 'current->thread.regs' are. Surprisingly, they are
>>>>>> just 0x30 apart: regs=c7955f10 cur=c7955f40. Also, 'current' seems to
>>>>>> be OK (pid and comm are consistent with the test program).
>>>>>
>>>>> The TRAP = 0x7d8 is obviously wrong.
>>>>>
>>>>> Need to know which 'TRAP' it is exactly.
>>>>> Could you try to dump what we have at the correct regs ?
>>>>> Something like 'show_regs(current->thread.regs)' should do it.
>>>>
>>>> Sure, please see the output below. It looks to me like the "correct"
>>>> regs are just garbage. Either they are overwritten or current->thread.regs
>>>> is wrong. But in any case, r1 = 0 doesn't look good.
>>>
>>> Yes indeed. I think I identified the problem. For Critical interrupts like DEBUG interrupt, struct
>>> exception_regs is added, therefore the frame has 12x4 (0x30) more bytes. That's what you see.
>>>
>>> Commit
>>> https://github.com/linuxppc/linux/commit/db297c3b07af7856fb7c666fbc9792d8e37556be#diff-dd6b952a3980da19df4facccdb4f3dddeb8cef56ee384c7f03d02b23b0c6cb26
>>>
>>> Need to find the best solution now to fix that.
>>
>> Awesome, happy to see you figured it out so quickly.
>>
>> I'm not sure if it makes any sense, but one thing that comes to mind is
>> to put struct exception_regs before struct pt_regs when the frame is
>> saved. Unless of course other parts of the code expect the opposite.
>
>Yes I think it is a good idea. I think I won't have time to look at that before summer vacation though.
I can take a stab at it. I'm not familiar with that part of the code,
but the best way to learn is to get your hands dirty :) In the worst
case, I won't fix it.
^ permalink raw reply
* Re: Hitting BUG_ON in do_notify_resume() with gdb and SIGTRAP
From: Christophe Leroy @ 2021-07-06 14:11 UTC (permalink / raw)
To: Radu Rendec, linuxppc-dev, Nicholas Piggin
In-Reply-To: <c5f245d84ba7b64263af47743aac1e1ab67c0ca4.camel@gmail.com>
Le 06/07/2021 à 16:05, Radu Rendec a écrit :
> On Tue, 2021-07-06 at 15:53 +0200, Christophe Leroy wrote:
>> Le 06/07/2021 à 15:50, Radu Rendec a écrit :
>>> On Tue, 2021-07-06 at 15:16 +0200, Christophe Leroy wrote:
>>>> Le 06/07/2021 à 13:56, Radu Rendec a écrit :
>>>>> On Tue, 2021-07-06 at 12:43 +0200, Christophe Leroy wrote:
>>>>>> Le 04/07/2021 à 23:38, Radu Rendec a écrit :
>>>>>>> I'm trying to set up my (virtual) environment to test an old bug in the
>>>>>>> PPC32 ptrace() code. I came across a completely different problem,
>>>>>>> which seems to make gdb pretty much unusable on PPC32. I'm not sure if
>>>>>>> this is a real kernel bug or maybe something wrong with my
>>>>>>> configuration.
>>>>>>>
>>>>>>> I'm running kernel 5.13 in a qemu VM with one e500mc CPU. I am running
>>>>>>> native gdb (inside the VM) and setting a breakpoint in main() in a test
>>>>>>> "hello world" program. Upon running the test program, I am hitting the
>>>>>>> BUG_ON in do_notify_resume() on line 292. The kernel bug log snippet is
>>>>>>> included below at the end of the email.
>>>>>>>
>>>>>>> FWIW, gdb says:
>>>>>>> Program terminated with signal SIGTRAP, Trace/breakpoint trap.
>>>>>>> The program no longer exists.
>>>>>>>
>>>>>>> I also added a pr_info() to do_notify_resume() just to see how much
>>>>>>> different 'regs' and 'current->thread.regs' are. Surprisingly, they are
>>>>>>> just 0x30 apart: regs=c7955f10 cur=c7955f40. Also, 'current' seems to
>>>>>>> be OK (pid and comm are consistent with the test program).
>>>>>>
>>>>>> The TRAP = 0x7d8 is obviously wrong.
>>>>>>
>>>>>> Need to know which 'TRAP' it is exactly.
>>>>>> Could you try to dump what we have at the correct regs ?
>>>>>> Something like 'show_regs(current->thread.regs)' should do it.
>>>>>
>>>>> Sure, please see the output below. It looks to me like the "correct"
>>>>> regs are just garbage. Either they are overwritten or current->thread.regs
>>>>> is wrong. But in any case, r1 = 0 doesn't look good.
>>>>
>>>> Yes indeed. I think I identified the problem. For Critical interrupts like DEBUG interrupt, struct
>>>> exception_regs is added, therefore the frame has 12x4 (0x30) more bytes. That's what you see.
>>>>
>>>> Commit
>>>> https://github.com/linuxppc/linux/commit/db297c3b07af7856fb7c666fbc9792d8e37556be#diff-dd6b952a3980da19df4facccdb4f3dddeb8cef56ee384c7f03d02b23b0c6cb26
>>>>
>>>> Need to find the best solution now to fix that.
>>>
>>> Awesome, happy to see you figured it out so quickly.
>>>
>>> I'm not sure if it makes any sense, but one thing that comes to mind is
>>> to put struct exception_regs before struct pt_regs when the frame is
>>> saved. Unless of course other parts of the code expect the opposite.
>>
>> Yes I think it is a good idea. I think I won't have time to look at that before summer vacation though.
>
> I can take a stab at it. I'm not familiar with that part of the code,
> but the best way to learn is to get your hands dirty :) In the worst
> case, I won't fix it.
>
Not that easy in fact.
After looking once more, the best solution I see now would be to move the content of struct
exception_regs into the second part of struct pt_regs (the kernel one in asm/ptrace.h).
Changes should be limited to head_booke.h and asm-offsets.c
struct exception_regs and STACK_EXC_LVL_FRAME_SIZE should go away.
Christophe
^ permalink raw reply
* Re: [PATCH v15 06/12] swiotlb: Use is_swiotlb_force_bounce for swiotlb data bouncing
From: Konrad Rzeszutek Wilk @ 2021-07-06 14:46 UTC (permalink / raw)
To: Christoph Hellwig
Cc: Jim Quinlan, heikki.krogerus, linux-devicetree, peterz, linux-pci,
joonas.lahtinen, dri-devel, chris, grant.likely, paulus,
Frank Rowand, mingo, Jianxiong Gao, Stefano Stabellini,
Saravana Kannan, Rafael J . Wysocki, xypron.glpk,
Bartosz Golaszewski, bskeggs, xen-devel, Thierry Reding,
matthew.auld, Nicolas Boichat, thomas.hellstrom, jgross,
Will Deacon, intel-gfx, maarten.lankhorst, jani.nikula,
Nathan Chancellor, Rob Herring, rodrigo.vivi, Bjorn Helgaas,
Claire Chang, Dan Williams, Andy Shevchenko, boris.ostrovsky,
airlied, linuxppc-dev, Randy Dunlap, Qian Cai, lkml,
list@263.net:IOMMU DRIVERS, Daniel Vetter, Greg KH, Tom Lendacky,
Robin Murphy, bauerman
In-Reply-To: <20210706140513.GA26498@lst.de>
On Tue, Jul 06, 2021 at 04:05:13PM +0200, Christoph Hellwig wrote:
> On Tue, Jul 06, 2021 at 03:01:04PM +0100, Robin Murphy wrote:
> > FWIW I was pondering the question of whether to do something along those
> > lines or just scrap the default assignment entirely, so since I hadn't got
> > round to saying that I've gone ahead and hacked up the alternative
> > (similarly untested) for comparison :)
> >
> > TBH I'm still not sure which one I prefer...
>
> Claire did implement something like your suggestion originally, but
> I don't really like it as it doesn't scale for adding multiple global
> pools, e.g. for the 64-bit addressable one for the various encrypted
> secure guest schemes.
Couple of things:
- I am not pushing to Linus the Claire's patchset until we have a
resolution on this. I hope you all agree that is a sensible way
forward as much as I hate doing that.
- I like Robin's fix as it is simplest looking. Would love to see if it
does fix the problem.
- Christopher - we can always add multiple pools as the next milestone
and just focus on this feature getting tested extensively during this
release.
- Would it be worth (for future or maybe in another tiny fix) to also add
a printk in swiotlb when we de-allocate the buffer so when someone looks
through the `dmesg` it becomes much easier to diagnose issues?
^ permalink raw reply
* Re: [FSL P50xx] IRQ issues
From: Christian Zigotzky @ 2021-07-06 15:22 UTC (permalink / raw)
To: Nicholas Piggin, linuxppc-dev
Cc: Darren Stevens, R.T.Dickinson, mad skateman, Christian Zigotzky
In-Reply-To: <8ba2f5a3-5fc8-042b-a738-7545f8fbcf4d@xenosoft.de>
Hi Nick,
Your patch works (see patch below)! Many thanks for your help! We tested
it on an A-EON AmigaOne X5000/20 and in a virtual e5500 QEMU machine today.
Screenshots:
-
http://www.skateman.nl/wp-content/uploads/2021/07/Screenshot-at-2021-07-06-113237.png
- https://i.ibb.co/h813RRp/Kernel-5-14-alpha3-Power-PC.png
Thanks,
Christian
On 06 July 2021 at 06:07 am, Christian Zigotzky wrote:
> Hi Nick,
>
> Thanks a lot for your patch! We will test it as soon as possible.
> You're right that this issue doesn't exist in a virtual e5500 QEMU
> machine.
>
> Have a nice day,
> Christian
>
> On 06 July 2021 at 01:36 am, Nicholas Piggin wrote:
>> Excerpts from Christian Zigotzky's message of July 6, 2021 4:49 am:
>>> Hi All,
>>>
>>> Our FSL P50xx machines don't boot anymore because of IRQ issues. [1]
>>>
>>> Please check the IRQ changes in the latest PowerPC updates 5.14-1. [2]
>>>
>>> Thanks,
>>> Christian
>>>
>>> [1]
>>> https://forum.hyperion-entertainment.com/download/file.php?id=2592&mode=view
>>>
>>> [2]
>>> https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=019b3fd94ba73d3ac615f0537440b81f129821f6
>>>
>> This looks like mtmsrd in the 64e code. I think this should fix it.
>>
>> QEMU does not seem to trap on this, maybe something to improve.
>>
>> Thanks,
>> Nick
>> --
>>
>> diff --git a/arch/powerpc/kernel/interrupt_64.S
>> b/arch/powerpc/kernel/interrupt_64.S
>> index 4063e8a3f704..d4212d2ff0b5 100644
>> --- a/arch/powerpc/kernel/interrupt_64.S
>> +++ b/arch/powerpc/kernel/interrupt_64.S
>> @@ -311,9 +311,13 @@ END_BTB_FLUSH_SECTION
>> * trace_hardirqs_off().
>> */
>> li r11,IRQS_ALL_DISABLED
>> - li r12,-1 /* Set MSR_EE and MSR_RI */
>> stb r11,PACAIRQSOFTMASK(r13)
>> +#ifdef CONFIG_PPC_BOOK3S
>> + li r12,-1 /* Set MSR_EE and MSR_RI */
>> mtmsrd r12,1
>> +#else
>> + wrteei 1
>> +#endif
>> /* Calling convention has r9 = orig r0, r10 = regs */
>> mr r9,r0
>
^ permalink raw reply
* Re: Xorg doesn't work anymore after the latest DRM updates
From: Christian Zigotzky @ 2021-07-06 15:33 UTC (permalink / raw)
To: Das, Nirmoy, Alex Deucher, Christian König
Cc: Darren Stevens, R.T.Dickinson, LKML, amd-gfx list,
Maling list - DRI developers, mad skateman, linuxppc-dev,
Christian Zigotzky
In-Reply-To: <d22b9f68-3692-2819-33a4-123b7182daf3@xenosoft.de>
Hi Nirmoy,
This patch works! Thanks a lot! We tested it on an A-EON AmigaOne
X5000/20 today.
Screenshot:
http://www.skateman.nl/wp-content/uploads/2021/07/Screenshot-at-2021-07-06-113237.png
Cheers,
Christian
On 05 July 2021 at 06:48 pm, Christian Zigotzky wrote:
> Hi Nirmoy,
>
> Many thanks for this information. We will test this patch asap.
>
> Have a nice day,
> Christian
>
> On 05 July 2021 at 10:26pm, Nirmoy wrote:
> > Hi Christian,
> >
> >
> > This issue looks similar to the one Mikel Rychliski fixed recently
> : https://patchwork.freedesktop.org/patch/440791. Let us know if this
> helps.
> >
> >
> > Regards,
> >
> > Nirmoy
> >
> > On 7/3/2021 9:30 AM, Christian Zigotzky wrote:
> >> Hi All,
> >>
> >> Xorg doesn't work anymore after the latest DRM updates. [1]
> >>
> >> Error messages:
> >>
> >> Jul 03 08:54:51 Fienix systemd[1]: Starting Light Display Manager...
> >> Jul 03 08:54:51 Fienix systemd[1]: Started Light Display Manager.
> >> Jul 03 08:54:51 Fienix kernel: BUG: Kernel NULL pointer dereference
> on read at 0x00000010
> >> Jul 03 08:54:51 Fienix kernel: Faulting instruction address:
> 0xc000000000630750
> >> Jul 03 08:54:51 Fienix kernel: Oops: Kernel access of bad area,
> sig: 11 [#1]
> >> Jul 03 08:54:51 Fienix kernel: BE PAGE_SIZE=4K PREEMPT SMP
> NR_CPUS=4 CoreNet Generic
> >> Jul 03 08:54:51 Fienix kernel: Modules linked in: algif_skcipher
> bnep tuner_simple tuner_types tea5767 tuner tda7432 tvaudio msp3400
> bttv tea575x tveeprom videobuf_dma_sg videobuf_core rc_core videodev
> mc btusb btrtl btbcm btintel bluetooth ecdh_generic ecc
> uio_pdrv_genirq uio
> >> Jul 03 08:54:51 Fienix kernel: CPU: 3 PID: 4300 Comm: Xorg.wrap Not
> tainted 5.14.0-a3_A-EON_X5000-07637-g3dbdb38e2869-dirty #1
> >> Jul 03 08:54:51 Fienix kernel: NIP: c000000000630750 LR:
> c00000000060fedc CTR: c000000000630728
> >> Jul 03 08:54:51 Fienix kernel: REGS: c00000008d903470 TRAP: 0300
> Not tainted (5.14.0-a3_A-EON_X5000-07637-g3dbdb38e2869-dirty)
> >> Jul 03 08:54:51 Fienix kernel: MSR: 0000000080029002 <CE,EE,ME>
> CR: 20000222 XER: 20000000
> >> Jul 03 08:54:51 Fienix kernel: DEAR: 0000000000000010 ESR:
> 0000000000000000 IRQMASK: 0
> >> GPR00: c00000000060fedc
> c00000008d903710 c00000000190c400 c000000085d59c00
> >> GPR04: c00000008d9035b8
> ffffffffffffffff c0000000870a4900 c000000085b62d00
> >> GPR08: 000000000000000f
> 0000000000000000 c000000000630728 0000000000000003
> >> GPR12: 0000000020000222
> c00000003fffeac0 00000000ffe51070 000000000086007c
> >> GPR16: 0000000000862820
> 00000000ffb7ec68 0000000000000000 00000000ffffffff
> >> GPR20: 00000000c04064a0
> 0000000000450088 00000000ffca79e4 5deadbeef0000122
> >> GPR24: 5deadbeef0000100
> 0000000000000000 c0000000876028f0 c000000080bd4000
> >> GPR28: c000000087603c48
> c000000085d59d78 c000000085d59c00 c000000085d59c78
> >> Jul 03 08:54:51 Fienix kernel: NIP [c000000000630750]
> .radeon_ttm_bo_destroy+0x28/0xc0
> >> Jul 03 08:54:51 Fienix kernel: LR [c00000000060fedc]
> .ttm_bo_put+0x2ec/0x344
> >> Jul 03 08:54:51 Fienix kernel: Call Trace:
> >> Jul 03 08:54:51 Fienix kernel: [c00000008d903710]
> [c00000000060fbe4] .ttm_bo_cleanup_memtype_use+0x54/0x60 (unreliable)
> >> Jul 03 08:54:51 Fienix kernel: [c00000008d903790]
> [c00000000060fedc] .ttm_bo_put+0x2ec/0x344
> >> Jul 03 08:54:51 Fienix kernel: [c00000008d903820]
> [c000000000630b50] .radeon_bo_unref+0x28/0x3c
> >> Jul 03 08:54:51 Fienix kernel: [c00000008d9038a0]
> [c0000000006d1f6c] .radeon_vm_fini+0x1b0/0x1b8
> >> Jul 03 08:54:51 Fienix kernel: [c00000008d903940]
> [c000000000618e38] .radeon_driver_postclose_kms+0x128/0x178
> >> Jul 03 08:54:51 Fienix kernel: [c00000008d9039e0]
> [c0000000005deb14] .drm_file_free+0x1d8/0x278
> >> Jul 03 08:54:51 Fienix kernel: [c00000008d903aa0]
> [c0000000005def00] .drm_release+0x64/0xc8
> >> Jul 03 08:54:51 Fienix kernel: [c00000008d903b30]
> [c00000000017636c] .__fput+0x11c/0x25c
> >> Jul 03 08:54:51 Fienix kernel: [c00000008d903bd0]
> [c00000000008b1e8] .task_work_run+0xa4/0xbc
> >> Jul 03 08:54:51 Fienix kernel: [c00000008d903c70]
> [c000000000004bf4] .do_notify_resume+0x144/0x2f0
> >> Jul 03 08:54:51 Fienix kernel: [c00000008d903d70]
> [c00000000000b380] .syscall_exit_prepare+0x110/0x130
> >> Jul 03 08:54:51 Fienix kernel: [c00000008d903e10]
> [c000000000000688] system_call_common+0x100/0x1fc
> >> Jul 03 08:54:51 Fienix kernel: --- interrupt: c00 at 0x3f4f58
> >> Jul 03 08:54:51 Fienix kernel: NIP: 00000000003f4f58 LR:
> 00000000003f4f2c CTR: 0000000000000000
> >> Jul 03 08:54:51 Fienix kernel: REGS: c00000008d903e80 TRAP: 0c00
> Not tainted (5.14.0-a3_A-EON_X5000-07637-g3dbdb38e2869-dirty)
> >> Jul 03 08:54:51 Fienix kernel: MSR: 000000000002d002
> <CE,EE,PR,ME> CR: 20000420 XER: 00000000
> >> Jul 03 08:54:51 Fienix kernel: IRQMASK: 0
> >> GPR00: 0000000000000006
> 00000000ffca66a0 00000000f798a310 0000000000000000
> >> GPR04: 0000000000000000
> 0000000000000000 0000000000000000 0000000000000000
> >> GPR08: 0000000000000000
> 0000000000000000 0000000000000000 0000000000000000
> >> GPR12: 0000000000000000
> 000000000044fff4 00000000ffe51070 000000000086007c
> >> GPR16: 0000000000862820
> 00000000ffb7ec68 0000000000000000 00000000ffffffff
> >> GPR20: 00000000c04064a0
> 0000000000450088 00000000ffca79e4 00000000004317ac
> >> GPR24: 00000000004317b8
> 00000000ffca66d0 0000000000000001 00000000ffca673c
> >> GPR28: 0000000000000001
> 0000000000000000 000000000041cff4 0000000000000003
> >> Jul 03 08:54:51 Fienix kernel: NIP [00000000003f4f58] 0x3f4f58
> >> Jul 03 08:54:51 Fienix kernel: LR [00000000003f4f2c] 0x3f4f2c
> >> Jul 03 08:54:51 Fienix kernel: --- interrupt: c00
> >> Jul 03 08:54:51 Fienix kernel: Instruction dump:
> >> Jul 03 08:54:51 Fienix kernel: 40c2fff4 4e800020 7c0802a6 fbc1fff0
> f8010010 3bc3ff88 fbe1fff8 38a0ffff
> >> Jul 03 08:54:51 Fienix kernel: f821ff81 7c7f1b78 e9230168 7fc3f378
> <80890010> 4bffff51 e87f0208 38631df8
> >> Jul 03 08:54:51 Fienix kernel: ---[ end trace ddf73d2d70058380 ]---
> >> Jul 03 08:54:51 Fienix kernel:
> >> Jul 03 08:54:51 Fienix systemd[1]: lightdm.service: Main process
> exited, code=exited, status=1/FAILURE
> >> Jul 03 08:54:51 Fienix systemd[1]: lightdm.service: Failed with
> result 'exit-code'.
> >> Jul 03 08:54:51 Fienix avahi-daemon[3857]: Registering new address
> record for 2a02:8109:89c0:ebfc:d372:f06c:9247:7d54 on enP4096p4s4.*.
> >> Jul 03 08:54:51 Fienix systemd[1]: lightdm.service: Scheduled
> restart job, restart counter is at 1.
> >> Jul 03 08:54:51 Fienix systemd[1]: Stopped Light Display Manager.
> >>
> >> ----
> >> Systems: A-EON AmigaOne X1000 and X5000 with Radeon HD6970 graphics
> cards. [2] [3] [4]
> >>
> >> The biggest problem is, that I don't have time for bisecting and
> fixing this issue.
> >>
> >> Cheers,
> >> Christian
> >>
> >> [1]
> https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=e058a84bfddc42ba356a2316f2cf1141974625c9
> >> [2] http://wiki.amiga.org/index.php?title=X5000
> >> [3] https://en.wikipedia.org/wiki/AmigaOne_X1000
> >> [4] https://forum.hyperion-entertainment.com/viewtopic.php?f=58&t=4378
>
>
^ permalink raw reply
* Re: [PATCH v15 06/12] swiotlb: Use is_swiotlb_force_bounce for swiotlb data bouncing
From: Robin Murphy @ 2021-07-06 15:39 UTC (permalink / raw)
To: Christoph Hellwig
Cc: Jim Quinlan, heikki.krogerus, linux-devicetree, peterz,
joonas.lahtinen, dri-devel, chris, grant.likely, paulus,
Frank Rowand, mingo, Jianxiong Gao, Stefano Stabellini,
Saravana Kannan, Rafael J . Wysocki, Bartosz Golaszewski, bskeggs,
linux-pci, xen-devel, Thierry Reding, matthew.auld,
Nicolas Boichat, thomas.hellstrom, jgross, Will Deacon,
Konrad Rzeszutek Wilk, intel-gfx, maarten.lankhorst, jani.nikula,
Nathan Chancellor, Rob Herring, rodrigo.vivi, Bjorn Helgaas,
Claire Chang, Dan Williams, Andy Shevchenko, boris.ostrovsky,
airlied, Greg KH, Randy Dunlap, Qian Cai, lkml,
list@263.net:IOMMU DRIVERS, Daniel Vetter, xypron.glpk,
Tom Lendacky, linuxppc-dev, bauerman
In-Reply-To: <20210706140513.GA26498@lst.de>
On 2021-07-06 15:05, Christoph Hellwig wrote:
> On Tue, Jul 06, 2021 at 03:01:04PM +0100, Robin Murphy wrote:
>> FWIW I was pondering the question of whether to do something along those
>> lines or just scrap the default assignment entirely, so since I hadn't got
>> round to saying that I've gone ahead and hacked up the alternative
>> (similarly untested) for comparison :)
>>
>> TBH I'm still not sure which one I prefer...
>
> Claire did implement something like your suggestion originally, but
> I don't really like it as it doesn't scale for adding multiple global
> pools, e.g. for the 64-bit addressable one for the various encrypted
> secure guest schemes.
Ah yes, that had slipped my mind, and it's a fair point indeed. Since
we're not concerned with a minimal fix for backports anyway I'm more
than happy to focus on Will's approach. Another thing is that that looks
to take us a quiet step closer to the possibility of dynamically
resizing a SWIOTLB pool, which is something that some of the hypervisor
protection schemes looking to build on top of this series may want to
explore at some point.
Robin.
^ permalink raw reply
* Re: [PATCH v15 06/12] swiotlb: Use is_swiotlb_force_bounce for swiotlb data bouncing
From: Will Deacon @ 2021-07-06 16:57 UTC (permalink / raw)
To: Konrad Rzeszutek Wilk
Cc: Jim Quinlan, heikki.krogerus, linux-devicetree, peterz,
joonas.lahtinen, dri-devel, chris, grant.likely, paulus,
Frank Rowand, mingo, Jianxiong Gao, Stefano Stabellini,
Saravana Kannan, Rafael J . Wysocki, xypron.glpk,
Christoph Hellwig, Bartosz Golaszewski, bskeggs, linux-pci,
xen-devel, Thierry Reding, matthew.auld, Nicolas Boichat,
thomas.hellstrom, jgross, intel-gfx, maarten.lankhorst,
jani.nikula, Nathan Chancellor, Rob Herring, rodrigo.vivi,
Bjorn Helgaas, Claire Chang, Dan Williams, Andy Shevchenko,
boris.ostrovsky, airlied, linuxppc-dev, Randy Dunlap, Qian Cai,
lkml, list@263.net:IOMMU DRIVERS, Daniel Vetter, Greg KH,
Tom Lendacky, Robin Murphy, bauerman
In-Reply-To: <YORsr0h7u5l9DZwh@char.us.oracle.com>
On Tue, Jul 06, 2021 at 10:46:07AM -0400, Konrad Rzeszutek Wilk wrote:
> On Tue, Jul 06, 2021 at 04:05:13PM +0200, Christoph Hellwig wrote:
> > On Tue, Jul 06, 2021 at 03:01:04PM +0100, Robin Murphy wrote:
> > > FWIW I was pondering the question of whether to do something along those
> > > lines or just scrap the default assignment entirely, so since I hadn't got
> > > round to saying that I've gone ahead and hacked up the alternative
> > > (similarly untested) for comparison :)
> > >
> > > TBH I'm still not sure which one I prefer...
> >
> > Claire did implement something like your suggestion originally, but
> > I don't really like it as it doesn't scale for adding multiple global
> > pools, e.g. for the 64-bit addressable one for the various encrypted
> > secure guest schemes.
>
> Couple of things:
> - I am not pushing to Linus the Claire's patchset until we have a
> resolution on this. I hope you all agree that is a sensible way
> forward as much as I hate doing that.
Sure, it's a pity but we could clearly use a bit more time to get these
just right and we've run out of time for 5.14.
I think the main question I have is how would you like to see patches for
5.15? i.e. as patches on top of devel/for-linus-5.14 or something else?
Cheers,
Will
^ permalink raw reply
* Re: Xorg doesn't work anymore after the latest DRM updates
From: Das, Nirmoy @ 2021-07-06 16:58 UTC (permalink / raw)
To: Christian Zigotzky, Alex Deucher, Christian König
Cc: Darren Stevens, R.T.Dickinson, LKML, amd-gfx list,
Maling list - DRI developers, mad skateman, linuxppc-dev,
Christian Zigotzky
In-Reply-To: <1a269f97-7260-4860-dfe7-c723b73fd909@xenosoft.de>
Happy to help, Christian :)
Nirmoy
On 7/6/2021 5:33 PM, Christian Zigotzky wrote:
> Hi Nirmoy,
>
> This patch works! Thanks a lot! We tested it on an A-EON AmigaOne
> X5000/20 today.
>
> Screenshot:
> https://nam11.safelinks.protection.outlook.com/?url=http%3A%2F%2Fwww.skateman.nl%2Fwp-content%2Fuploads%2F2021%2F07%2FScreenshot-at-2021-07-06-113237.png&data=04%7C01%7Cnirmoy.das%40amd.com%7C1879913cfa594f104bb508d94093713e%7C3dd8961fe4884e608e11a82d994e183d%7C0%7C0%7C637611824271179607%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C1000&sdata=JehEsOxoinPX%2BSC8YzjBwKNOFcAquiVwHUS35pf%2FGu4%3D&reserved=0
>
> Cheers,
> Christian
>
> On 05 July 2021 at 06:48 pm, Christian Zigotzky wrote:
>> Hi Nirmoy,
>>
>> Many thanks for this information. We will test this patch asap.
>>
>> Have a nice day,
>> Christian
>>
>> On 05 July 2021 at 10:26pm, Nirmoy wrote:
>> > Hi Christian,
>> >
>> >
>> > This issue looks similar to the one Mikel Rychliski fixed recently
>> :
>> https://nam11.safelinks.protection.outlook.com/?url=https%3A%2F%2Fpatchwork.freedesktop.org%2Fpatch%2F440791&data=04%7C01%7Cnirmoy.das%40amd.com%7C1879913cfa594f104bb508d94093713e%7C3dd8961fe4884e608e11a82d994e183d%7C0%7C0%7C637611824271179607%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C1000&sdata=QaPHA%2FlS%2Bt1wI1Awce6%2FMG2rdUv2Zk1DZMRiR47mcGA%3D&reserved=0.
>> Let us know if this helps.
>> >
>> >
>> > Regards,
>> >
>> > Nirmoy
>> >
>> > On 7/3/2021 9:30 AM, Christian Zigotzky wrote:
>> >> Hi All,
>> >>
>> >> Xorg doesn't work anymore after the latest DRM updates. [1]
>> >>
>> >> Error messages:
>> >>
>> >> Jul 03 08:54:51 Fienix systemd[1]: Starting Light Display Manager...
>> >> Jul 03 08:54:51 Fienix systemd[1]: Started Light Display Manager.
>> >> Jul 03 08:54:51 Fienix kernel: BUG: Kernel NULL pointer
>> dereference on read at 0x00000010
>> >> Jul 03 08:54:51 Fienix kernel: Faulting instruction address:
>> 0xc000000000630750
>> >> Jul 03 08:54:51 Fienix kernel: Oops: Kernel access of bad area,
>> sig: 11 [#1]
>> >> Jul 03 08:54:51 Fienix kernel: BE PAGE_SIZE=4K PREEMPT SMP
>> NR_CPUS=4 CoreNet Generic
>> >> Jul 03 08:54:51 Fienix kernel: Modules linked in: algif_skcipher
>> bnep tuner_simple tuner_types tea5767 tuner tda7432 tvaudio msp3400
>> bttv tea575x tveeprom videobuf_dma_sg videobuf_core rc_core videodev
>> mc btusb btrtl btbcm btintel bluetooth ecdh_generic ecc
>> uio_pdrv_genirq uio
>> >> Jul 03 08:54:51 Fienix kernel: CPU: 3 PID: 4300 Comm: Xorg.wrap
>> Not tainted 5.14.0-a3_A-EON_X5000-07637-g3dbdb38e2869-dirty #1
>> >> Jul 03 08:54:51 Fienix kernel: NIP: c000000000630750 LR:
>> c00000000060fedc CTR: c000000000630728
>> >> Jul 03 08:54:51 Fienix kernel: REGS: c00000008d903470 TRAP: 0300
>> Not tainted (5.14.0-a3_A-EON_X5000-07637-g3dbdb38e2869-dirty)
>> >> Jul 03 08:54:51 Fienix kernel: MSR: 0000000080029002 <CE,EE,ME>
>> CR: 20000222 XER: 20000000
>> >> Jul 03 08:54:51 Fienix kernel: DEAR: 0000000000000010 ESR:
>> 0000000000000000 IRQMASK: 0
>> >> GPR00: c00000000060fedc
>> c00000008d903710 c00000000190c400 c000000085d59c00
>> >> GPR04: c00000008d9035b8
>> ffffffffffffffff c0000000870a4900 c000000085b62d00
>> >> GPR08: 000000000000000f
>> 0000000000000000 c000000000630728 0000000000000003
>> >> GPR12: 0000000020000222
>> c00000003fffeac0 00000000ffe51070 000000000086007c
>> >> GPR16: 0000000000862820
>> 00000000ffb7ec68 0000000000000000 00000000ffffffff
>> >> GPR20: 00000000c04064a0
>> 0000000000450088 00000000ffca79e4 5deadbeef0000122
>> >> GPR24: 5deadbeef0000100
>> 0000000000000000 c0000000876028f0 c000000080bd4000
>> >> GPR28: c000000087603c48
>> c000000085d59d78 c000000085d59c00 c000000085d59c78
>> >> Jul 03 08:54:51 Fienix kernel: NIP [c000000000630750]
>> .radeon_ttm_bo_destroy+0x28/0xc0
>> >> Jul 03 08:54:51 Fienix kernel: LR [c00000000060fedc]
>> .ttm_bo_put+0x2ec/0x344
>> >> Jul 03 08:54:51 Fienix kernel: Call Trace:
>> >> Jul 03 08:54:51 Fienix kernel: [c00000008d903710]
>> [c00000000060fbe4] .ttm_bo_cleanup_memtype_use+0x54/0x60 (unreliable)
>> >> Jul 03 08:54:51 Fienix kernel: [c00000008d903790]
>> [c00000000060fedc] .ttm_bo_put+0x2ec/0x344
>> >> Jul 03 08:54:51 Fienix kernel: [c00000008d903820]
>> [c000000000630b50] .radeon_bo_unref+0x28/0x3c
>> >> Jul 03 08:54:51 Fienix kernel: [c00000008d9038a0]
>> [c0000000006d1f6c] .radeon_vm_fini+0x1b0/0x1b8
>> >> Jul 03 08:54:51 Fienix kernel: [c00000008d903940]
>> [c000000000618e38] .radeon_driver_postclose_kms+0x128/0x178
>> >> Jul 03 08:54:51 Fienix kernel: [c00000008d9039e0]
>> [c0000000005deb14] .drm_file_free+0x1d8/0x278
>> >> Jul 03 08:54:51 Fienix kernel: [c00000008d903aa0]
>> [c0000000005def00] .drm_release+0x64/0xc8
>> >> Jul 03 08:54:51 Fienix kernel: [c00000008d903b30]
>> [c00000000017636c] .__fput+0x11c/0x25c
>> >> Jul 03 08:54:51 Fienix kernel: [c00000008d903bd0]
>> [c00000000008b1e8] .task_work_run+0xa4/0xbc
>> >> Jul 03 08:54:51 Fienix kernel: [c00000008d903c70]
>> [c000000000004bf4] .do_notify_resume+0x144/0x2f0
>> >> Jul 03 08:54:51 Fienix kernel: [c00000008d903d70]
>> [c00000000000b380] .syscall_exit_prepare+0x110/0x130
>> >> Jul 03 08:54:51 Fienix kernel: [c00000008d903e10]
>> [c000000000000688] system_call_common+0x100/0x1fc
>> >> Jul 03 08:54:51 Fienix kernel: --- interrupt: c00 at 0x3f4f58
>> >> Jul 03 08:54:51 Fienix kernel: NIP: 00000000003f4f58 LR:
>> 00000000003f4f2c CTR: 0000000000000000
>> >> Jul 03 08:54:51 Fienix kernel: REGS: c00000008d903e80 TRAP: 0c00
>> Not tainted (5.14.0-a3_A-EON_X5000-07637-g3dbdb38e2869-dirty)
>> >> Jul 03 08:54:51 Fienix kernel: MSR: 000000000002d002
>> <CE,EE,PR,ME> CR: 20000420 XER: 00000000
>> >> Jul 03 08:54:51 Fienix kernel: IRQMASK: 0
>> >> GPR00: 0000000000000006
>> 00000000ffca66a0 00000000f798a310 0000000000000000
>> >> GPR04: 0000000000000000
>> 0000000000000000 0000000000000000 0000000000000000
>> >> GPR08: 0000000000000000
>> 0000000000000000 0000000000000000 0000000000000000
>> >> GPR12: 0000000000000000
>> 000000000044fff4 00000000ffe51070 000000000086007c
>> >> GPR16: 0000000000862820
>> 00000000ffb7ec68 0000000000000000 00000000ffffffff
>> >> GPR20: 00000000c04064a0
>> 0000000000450088 00000000ffca79e4 00000000004317ac
>> >> GPR24: 00000000004317b8
>> 00000000ffca66d0 0000000000000001 00000000ffca673c
>> >> GPR28: 0000000000000001
>> 0000000000000000 000000000041cff4 0000000000000003
>> >> Jul 03 08:54:51 Fienix kernel: NIP [00000000003f4f58] 0x3f4f58
>> >> Jul 03 08:54:51 Fienix kernel: LR [00000000003f4f2c] 0x3f4f2c
>> >> Jul 03 08:54:51 Fienix kernel: --- interrupt: c00
>> >> Jul 03 08:54:51 Fienix kernel: Instruction dump:
>> >> Jul 03 08:54:51 Fienix kernel: 40c2fff4 4e800020 7c0802a6 fbc1fff0
>> f8010010 3bc3ff88 fbe1fff8 38a0ffff
>> >> Jul 03 08:54:51 Fienix kernel: f821ff81 7c7f1b78 e9230168 7fc3f378
>> <80890010> 4bffff51 e87f0208 38631df8
>> >> Jul 03 08:54:51 Fienix kernel: ---[ end trace ddf73d2d70058380 ]---
>> >> Jul 03 08:54:51 Fienix kernel:
>> >> Jul 03 08:54:51 Fienix systemd[1]: lightdm.service: Main process
>> exited, code=exited, status=1/FAILURE
>> >> Jul 03 08:54:51 Fienix systemd[1]: lightdm.service: Failed with
>> result 'exit-code'.
>> >> Jul 03 08:54:51 Fienix avahi-daemon[3857]: Registering new address
>> record for 2a02:8109:89c0:ebfc:d372:f06c:9247:7d54 on enP4096p4s4.*.
>> >> Jul 03 08:54:51 Fienix systemd[1]: lightdm.service: Scheduled
>> restart job, restart counter is at 1.
>> >> Jul 03 08:54:51 Fienix systemd[1]: Stopped Light Display Manager.
>> >>
>> >> ----
>> >> Systems: A-EON AmigaOne X1000 and X5000 with Radeon HD6970
>> graphics cards. [2] [3] [4]
>> >>
>> >> The biggest problem is, that I don't have time for bisecting and
>> fixing this issue.
>> >>
>> >> Cheers,
>> >> Christian
>> >>
>> >> [1]
>> https://nam11.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgit.kernel.org%2Fpub%2Fscm%2Flinux%2Fkernel%2Fgit%2Ftorvalds%2Flinux.git%2Fcommit%2F%3Fid%3De058a84bfddc42ba356a2316f2cf1141974625c9&data=04%7C01%7Cnirmoy.das%40amd.com%7C1879913cfa594f104bb508d94093713e%7C3dd8961fe4884e608e11a82d994e183d%7C0%7C0%7C637611824271179607%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C1000&sdata=G2y8f5f7DV708uZg6VLjyg1T%2F2dHjT8i4TtM2uBUA4U%3D&reserved=0
>> >> [2]
>> https://nam11.safelinks.protection.outlook.com/?url=http%3A%2F%2Fwiki.amiga.org%2Findex.php%3Ftitle%3DX5000&data=04%7C01%7Cnirmoy.das%40amd.com%7C1879913cfa594f104bb508d94093713e%7C3dd8961fe4884e608e11a82d994e183d%7C0%7C0%7C637611824271179607%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C1000&sdata=9HTYhxjWHOZ00NeA9MKwB7tv0Dool2wT%2FfrxZ7kcNLs%3D&reserved=0
>> >> [3]
>> https://nam11.safelinks.protection.outlook.com/?url=https%3A%2F%2Fen.wikipedia.org%2Fwiki%2FAmigaOne_X1000&data=04%7C01%7Cnirmoy.das%40amd.com%7C1879913cfa594f104bb508d94093713e%7C3dd8961fe4884e608e11a82d994e183d%7C0%7C0%7C637611824271179607%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C1000&sdata=rKh5xH7kKS1wLz64CIT39d9sBnAXGTMobIZTGbFcC78%3D&reserved=0
>> >> [4]
>> https://nam11.safelinks.protection.outlook.com/?url=https%3A%2F%2Fforum.hyperion-entertainment.com%2Fviewtopic.php%3Ff%3D58%26t%3D4378&data=04%7C01%7Cnirmoy.das%40amd.com%7C1879913cfa594f104bb508d94093713e%7C3dd8961fe4884e608e11a82d994e183d%7C0%7C0%7C637611824271179607%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C1000&sdata=Yr1WzsrzEhWC5Z7zUVHcWPn9eesHq9XggMtXFYn7seA%3D&reserved=0
>>
>>
>
^ permalink raw reply
* Re: [PATCH v15 06/12] swiotlb: Use is_swiotlb_force_bounce for swiotlb data bouncing
From: Konrad Rzeszutek Wilk @ 2021-07-06 16:59 UTC (permalink / raw)
To: Will Deacon
Cc: Jim Quinlan, heikki.krogerus, linux-devicetree, peterz,
joonas.lahtinen, dri-devel, chris, grant.likely, paulus,
Frank Rowand, mingo, Jianxiong Gao, Stefano Stabellini,
Saravana Kannan, Rafael J . Wysocki, xypron.glpk,
Christoph Hellwig, Bartosz Golaszewski, bskeggs, linux-pci,
xen-devel, Thierry Reding, matthew.auld, Nicolas Boichat,
thomas.hellstrom, jgross, intel-gfx, maarten.lankhorst,
jani.nikula, Nathan Chancellor, Rob Herring, rodrigo.vivi,
Bjorn Helgaas, Claire Chang, Dan Williams, Andy Shevchenko,
boris.ostrovsky, airlied, linuxppc-dev, Randy Dunlap, Qian Cai,
lkml, list@263.net:IOMMU DRIVERS, Daniel Vetter, Greg KH,
Tom Lendacky, Robin Murphy, bauerman
In-Reply-To: <20210706165720.GC20750@willie-the-truck>
On Tue, Jul 06, 2021 at 05:57:21PM +0100, Will Deacon wrote:
> On Tue, Jul 06, 2021 at 10:46:07AM -0400, Konrad Rzeszutek Wilk wrote:
> > On Tue, Jul 06, 2021 at 04:05:13PM +0200, Christoph Hellwig wrote:
> > > On Tue, Jul 06, 2021 at 03:01:04PM +0100, Robin Murphy wrote:
> > > > FWIW I was pondering the question of whether to do something along those
> > > > lines or just scrap the default assignment entirely, so since I hadn't got
> > > > round to saying that I've gone ahead and hacked up the alternative
> > > > (similarly untested) for comparison :)
> > > >
> > > > TBH I'm still not sure which one I prefer...
> > >
> > > Claire did implement something like your suggestion originally, but
> > > I don't really like it as it doesn't scale for adding multiple global
> > > pools, e.g. for the 64-bit addressable one for the various encrypted
> > > secure guest schemes.
> >
> > Couple of things:
> > - I am not pushing to Linus the Claire's patchset until we have a
> > resolution on this. I hope you all agree that is a sensible way
> > forward as much as I hate doing that.
>
> Sure, it's a pity but we could clearly use a bit more time to get these
> just right and we've run out of time for 5.14.
>
> I think the main question I have is how would you like to see patches for
> 5.15? i.e. as patches on top of devel/for-linus-5.14 or something else?
Yes that would be perfect. If there are any dependencies on the rc1, I
can rebase it on top of that.
>
> Cheers,
>
> Will
^ permalink raw reply
page: next (older) | prev (newer) | latest
- recent:[subjects (threaded)|topics (new)|topics (active)]
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox