Previously, extcon used the spinlock before calling the notifier_call_chain to prevent the scheduled out of task and to prevent the notification delay. When spinlock is locked for sending the notification, deadlock issue occured on the side of extcon consumer device. To fix this issue, extcon consumer device should always use the work. it is always not reasonable to use work.
To fix this issue on extcon consumer device, release locking when sending the notification of connector state.
Fixes: ab11af049f88 ("extcon: Add the synchronization extcon APIs to support the notification") Cc: stable@vger.kernel.org Cc: Roger Quadros rogerq@ti.com Cc: Kishon Vijay Abraham I kishon@ti.com Signed-off-by: Chanwoo Choi cw00.choi@samsung.com --- drivers/extcon/extcon.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/drivers/extcon/extcon.c b/drivers/extcon/extcon.c index 8bff5fd18185..f75b08a45d4e 100644 --- a/drivers/extcon/extcon.c +++ b/drivers/extcon/extcon.c @@ -433,8 +433,8 @@ int extcon_sync(struct extcon_dev *edev, unsigned int id) return index;
spin_lock_irqsave(&edev->lock, flags); - state = !!(edev->state & BIT(index)); + spin_unlock_irqrestore(&edev->lock, flags);
/* * Call functions in a raw notifier chain for the specific one @@ -448,6 +448,7 @@ int extcon_sync(struct extcon_dev *edev, unsigned int id) */ raw_notifier_call_chain(&edev->nh_all, state, edev);
+ spin_lock_irqsave(&edev->lock, flags); /* This could be in interrupt handler */ prop_buf = (char *)get_zeroed_page(GFP_ATOMIC); if (!prop_buf) {
+ H. Nikolaus Schaller hns@goldelico.com
On 2018년 06월 14일 13:14, Chanwoo Choi wrote:
Previously, extcon used the spinlock before calling the notifier_call_chain to prevent the scheduled out of task and to prevent the notification delay. When spinlock is locked for sending the notification, deadlock issue occured on the side of extcon consumer device. To fix this issue, extcon consumer device should always use the work. it is always not reasonable to use work.
To fix this issue on extcon consumer device, release locking when sending the notification of connector state.
Fixes: ab11af049f88 ("extcon: Add the synchronization extcon APIs to support the notification") Cc: stable@vger.kernel.org Cc: Roger Quadros rogerq@ti.com Cc: Kishon Vijay Abraham I kishon@ti.com Signed-off-by: Chanwoo Choi cw00.choi@samsung.com
drivers/extcon/extcon.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/drivers/extcon/extcon.c b/drivers/extcon/extcon.c index 8bff5fd18185..f75b08a45d4e 100644 --- a/drivers/extcon/extcon.c +++ b/drivers/extcon/extcon.c @@ -433,8 +433,8 @@ int extcon_sync(struct extcon_dev *edev, unsigned int id) return index; spin_lock_irqsave(&edev->lock, flags);
- state = !!(edev->state & BIT(index));
- spin_unlock_irqrestore(&edev->lock, flags);
/* * Call functions in a raw notifier chain for the specific one @@ -448,6 +448,7 @@ int extcon_sync(struct extcon_dev *edev, unsigned int id) */ raw_notifier_call_chain(&edev->nh_all, state, edev);
- spin_lock_irqsave(&edev->lock, flags); /* This could be in interrupt handler */ prop_buf = (char *)get_zeroed_page(GFP_ATOMIC); if (!prop_buf) {
Hi Roger and Chanwoo,
Am 14.06.2018 um 12:18 schrieb Chanwoo Choi cw00.choi@samsung.com:
- H. Nikolaus Schaller hns@goldelico.com
On 2018년 06월 14일 13:14, Chanwoo Choi wrote:
Previously, extcon used the spinlock before calling the notifier_call_chain to prevent the scheduled out of task and to prevent the notification delay. When spinlock is locked for sending the notification, deadlock issue occured on the side of extcon consumer device. To fix this issue, extcon consumer device should always use the work. it is always not reasonable to use work.
To fix this issue on extcon consumer device, release locking when sending the notification of connector state.
Fixes: ab11af049f88 ("extcon: Add the synchronization extcon APIs to support the notification") Cc: stable@vger.kernel.org Cc: Roger Quadros rogerq@ti.com Cc: Kishon Vijay Abraham I kishon@ti.com Signed-off-by: Chanwoo Choi cw00.choi@samsung.com
drivers/extcon/extcon.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/drivers/extcon/extcon.c b/drivers/extcon/extcon.c index 8bff5fd18185..f75b08a45d4e 100644 --- a/drivers/extcon/extcon.c +++ b/drivers/extcon/extcon.c @@ -433,8 +433,8 @@ int extcon_sync(struct extcon_dev *edev, unsigned int id) return index;
spin_lock_irqsave(&edev->lock, flags);
- state = !!(edev->state & BIT(index));
spin_unlock_irqrestore(&edev->lock, flags);
/*
- Call functions in a raw notifier chain for the specific one
@@ -448,6 +448,7 @@ int extcon_sync(struct extcon_dev *edev, unsigned int id) */ raw_notifier_call_chain(&edev->nh_all, state, edev);
- spin_lock_irqsave(&edev->lock, flags); /* This could be in interrupt handler */ prop_buf = (char *)get_zeroed_page(GFP_ATOMIC); if (!prop_buf) {
I have tested on the Pyra handheld prototype and now it works. Plugging in an OTG cable enables/disables OTG power as expected and there are no kernel oops any more.
So you can add my
Reported-by: H. Nikolaus Schaller hns@goldelico.com Tested-by: H. Nikolaus Schaller hns@goldelico.com
BR and thank you for the quick fix, Nikolaus
Am 14.06.2018 um 12:39 schrieb H. Nikolaus Schaller hns@goldelico.com:
Hi Roger and Chanwoo,
Am 14.06.2018 um 12:18 schrieb Chanwoo Choi cw00.choi@samsung.com:
- H. Nikolaus Schaller hns@goldelico.com
On 2018년 06월 14일 13:14, Chanwoo Choi wrote:
Previously, extcon used the spinlock before calling the notifier_call_chain to prevent the scheduled out of task and to prevent the notification delay. When spinlock is locked for sending the notification, deadlock issue occured on the side of extcon consumer device. To fix this issue, extcon consumer device should always use the work. it is always not reasonable to use work.
To fix this issue on extcon consumer device, release locking when sending the notification of connector state.
Fixes: ab11af049f88 ("extcon: Add the synchronization extcon APIs to support the notification") Cc: stable@vger.kernel.org Cc: Roger Quadros rogerq@ti.com Cc: Kishon Vijay Abraham I kishon@ti.com Signed-off-by: Chanwoo Choi cw00.choi@samsung.com
drivers/extcon/extcon.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/drivers/extcon/extcon.c b/drivers/extcon/extcon.c index 8bff5fd18185..f75b08a45d4e 100644 --- a/drivers/extcon/extcon.c +++ b/drivers/extcon/extcon.c @@ -433,8 +433,8 @@ int extcon_sync(struct extcon_dev *edev, unsigned int id) return index;
spin_lock_irqsave(&edev->lock, flags);
- state = !!(edev->state & BIT(index));
spin_unlock_irqrestore(&edev->lock, flags);
/*
- Call functions in a raw notifier chain for the specific one
@@ -448,6 +448,7 @@ int extcon_sync(struct extcon_dev *edev, unsigned int id) */ raw_notifier_call_chain(&edev->nh_all, state, edev);
- spin_lock_irqsave(&edev->lock, flags); /* This could be in interrupt handler */ prop_buf = (char *)get_zeroed_page(GFP_ATOMIC); if (!prop_buf) {
I have tested on the Pyra handheld prototype and now it works. Plugging in an OTG cable enables/disables OTG power as expected and there are no kernel oops any more.
I did take some minutes to check and it now also works again on the OMAP5EVM.
BR, Nikolaus
Hi Roger,
If possible, Could you please review this patch?
Regards, Chanwoo Choi
On 2018년 06월 14일 20:33, H. Nikolaus Schaller wrote:
Am 14.06.2018 um 12:39 schrieb H. Nikolaus Schaller hns@goldelico.com:
Hi Roger and Chanwoo,
Am 14.06.2018 um 12:18 schrieb Chanwoo Choi cw00.choi@samsung.com:
- H. Nikolaus Schaller hns@goldelico.com
On 2018년 06월 14일 13:14, Chanwoo Choi wrote:
Previously, extcon used the spinlock before calling the notifier_call_chain to prevent the scheduled out of task and to prevent the notification delay. When spinlock is locked for sending the notification, deadlock issue occured on the side of extcon consumer device. To fix this issue, extcon consumer device should always use the work. it is always not reasonable to use work.
To fix this issue on extcon consumer device, release locking when sending the notification of connector state.
Fixes: ab11af049f88 ("extcon: Add the synchronization extcon APIs to support the notification") Cc: stable@vger.kernel.org Cc: Roger Quadros rogerq@ti.com Cc: Kishon Vijay Abraham I kishon@ti.com Signed-off-by: Chanwoo Choi cw00.choi@samsung.com
drivers/extcon/extcon.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/drivers/extcon/extcon.c b/drivers/extcon/extcon.c index 8bff5fd18185..f75b08a45d4e 100644 --- a/drivers/extcon/extcon.c +++ b/drivers/extcon/extcon.c @@ -433,8 +433,8 @@ int extcon_sync(struct extcon_dev *edev, unsigned int id) return index;
spin_lock_irqsave(&edev->lock, flags);
- state = !!(edev->state & BIT(index));
spin_unlock_irqrestore(&edev->lock, flags);
/*
- Call functions in a raw notifier chain for the specific one
@@ -448,6 +448,7 @@ int extcon_sync(struct extcon_dev *edev, unsigned int id) */ raw_notifier_call_chain(&edev->nh_all, state, edev);
- spin_lock_irqsave(&edev->lock, flags); /* This could be in interrupt handler */ prop_buf = (char *)get_zeroed_page(GFP_ATOMIC); if (!prop_buf) {
I have tested on the Pyra handheld prototype and now it works. Plugging in an OTG cable enables/disables OTG power as expected and there are no kernel oops any more.
I did take some minutes to check and it now also works again on the OMAP5EVM.
BR, Nikolaus
Hi,
2018-06-14 20:33 GMT+09:00 H. Nikolaus Schaller hns@goldelico.com:
Am 14.06.2018 um 12:39 schrieb H. Nikolaus Schaller hns@goldelico.com:
Hi Roger and Chanwoo,
Am 14.06.2018 um 12:18 schrieb Chanwoo Choi cw00.choi@samsung.com:
- H. Nikolaus Schaller hns@goldelico.com
On 2018년 06월 14일 13:14, Chanwoo Choi wrote:
Previously, extcon used the spinlock before calling the notifier_call_chain to prevent the scheduled out of task and to prevent the notification delay. When spinlock is locked for sending the notification, deadlock issue occured on the side of extcon consumer device. To fix this issue, extcon consumer device should always use the work. it is always not reasonable to use work.
To fix this issue on extcon consumer device, release locking when sending the notification of connector state.
Fixes: ab11af049f88 ("extcon: Add the synchronization extcon APIs to support the notification") Cc: stable@vger.kernel.org Cc: Roger Quadros rogerq@ti.com Cc: Kishon Vijay Abraham I kishon@ti.com Signed-off-by: Chanwoo Choi cw00.choi@samsung.com
drivers/extcon/extcon.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/drivers/extcon/extcon.c b/drivers/extcon/extcon.c index 8bff5fd18185..f75b08a45d4e 100644 --- a/drivers/extcon/extcon.c +++ b/drivers/extcon/extcon.c @@ -433,8 +433,8 @@ int extcon_sync(struct extcon_dev *edev, unsigned int id) return index;
spin_lock_irqsave(&edev->lock, flags);
- state = !!(edev->state & BIT(index));
spin_unlock_irqrestore(&edev->lock, flags);
/*
- Call functions in a raw notifier chain for the specific one
@@ -448,6 +448,7 @@ int extcon_sync(struct extcon_dev *edev, unsigned int id) */ raw_notifier_call_chain(&edev->nh_all, state, edev);
- spin_lock_irqsave(&edev->lock, flags); /* This could be in interrupt handler */ prop_buf = (char *)get_zeroed_page(GFP_ATOMIC); if (!prop_buf) {
I have tested on the Pyra handheld prototype and now it works. Plugging in an OTG cable enables/disables OTG power as expected and there are no kernel oops any more.
I did take some minutes to check and it now also works again on the OMAP5EVM.
BR, Nikolaus
Applied it.
On 14/06/18 07:14, Chanwoo Choi wrote:
Previously, extcon used the spinlock before calling the notifier_call_chain to prevent the scheduled out of task and to prevent the notification delay. When spinlock is locked for sending the notification, deadlock issue occured on the side of extcon consumer device. To fix this issue, extcon consumer device should always use the work. it is always not reasonable to use work.
To fix this issue on extcon consumer device, release locking when sending the notification of connector state.
Fixes: ab11af049f88 ("extcon: Add the synchronization extcon APIs to support the notification") Cc: stable@vger.kernel.org Cc: Roger Quadros rogerq@ti.com Cc: Kishon Vijay Abraham I kishon@ti.com Signed-off-by: Chanwoo Choi cw00.choi@samsung.com
Reviewed-by: Roger Quadros rogerq@ti.com
drivers/extcon/extcon.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/drivers/extcon/extcon.c b/drivers/extcon/extcon.c index 8bff5fd18185..f75b08a45d4e 100644 --- a/drivers/extcon/extcon.c +++ b/drivers/extcon/extcon.c @@ -433,8 +433,8 @@ int extcon_sync(struct extcon_dev *edev, unsigned int id) return index; spin_lock_irqsave(&edev->lock, flags);
- state = !!(edev->state & BIT(index));
- spin_unlock_irqrestore(&edev->lock, flags);
/* * Call functions in a raw notifier chain for the specific one @@ -448,6 +448,7 @@ int extcon_sync(struct extcon_dev *edev, unsigned int id) */ raw_notifier_call_chain(&edev->nh_all, state, edev);
- spin_lock_irqsave(&edev->lock, flags); /* This could be in interrupt handler */ prop_buf = (char *)get_zeroed_page(GFP_ATOMIC); if (!prop_buf) {
linux-stable-mirror@lists.linaro.org