git: d87fad36330b - main - linuxkpi: Acquire giant when adding/removing i2c adapters
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Wed, 15 Jun 2022 11:38:44 UTC
The branch main has been updated by manu:
URL: https://cgit.FreeBSD.org/src/commit/?id=d87fad36330b6faf657e7ee8faaa52feeaaff68a
commit d87fad36330b6faf657e7ee8faaa52feeaaff68a
Author: Emmanuel Vadot <manu@FreeBSD.org>
AuthorDate: 2022-06-14 11:23:26 +0000
Commit: Emmanuel Vadot <manu@FreeBSD.org>
CommitDate: 2022-06-15 11:37:43 +0000
linuxkpi: Acquire giant when adding/removing i2c adapters
We need Giant as we run in a taskqueue_thread via linux_work.
This fix detaching amdgpu and i915kms.
Reviewed by: bz, hselasky, imp
Sponsored by: Beckhoff Automation GmbH & Co. KG
Differential Revision: https://reviews.freebsd.org/D35478
---
sys/compat/linuxkpi/common/src/linux_i2c.c | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/sys/compat/linuxkpi/common/src/linux_i2c.c b/sys/compat/linuxkpi/common/src/linux_i2c.c
index c2c4977eb9ba..bdf381f8a032 100644
--- a/sys/compat/linuxkpi/common/src/linux_i2c.c
+++ b/sys/compat/linuxkpi/common/src/linux_i2c.c
@@ -221,7 +221,9 @@ lkpi_i2c_add_adapter(struct i2c_adapter *adapter)
return (ENXIO);
}
+ bus_topo_lock();
error = bus_generic_attach(adapter->dev.parent->bsddev);
+ bus_topo_unlock();
if (error) {
device_printf(adapter->dev.parent->bsddev,
"failed to attach child: error %d\n", error);
@@ -249,7 +251,9 @@ lkpi_i2c_del_adapter(struct i2c_adapter *adapter)
while ((child = device_find_child(adapter->dev.parent->bsddev, "lkpi_iic", unit++)) != NULL) {
if (adapter == LKPI_IIC_GET_ADAPTER(child)) {
+ bus_topo_lock();
device_delete_child(adapter->dev.parent->bsddev, child);
+ bus_topo_unlock();
rv = 0;
goto out;
}
@@ -259,7 +263,9 @@ lkpi_i2c_del_adapter(struct i2c_adapter *adapter)
while ((child = device_find_child(adapter->dev.parent->bsddev, "lkpi_iicbb", unit++)) != NULL) {
if (adapter == LKPI_IIC_GET_ADAPTER(child)) {
+ bus_topo_lock();
device_delete_child(adapter->dev.parent->bsddev, child);
+ bus_topo_unlock();
rv = 0;
goto out;
}