Messages in this thread Patch in this message | | | From | Arun Ramadoss <> | Subject | [PATCH net] net: dsa: microchip: Added the condition for scheduling ksz_mib_read_work | Date | Fri, 8 Oct 2021 14:13:48 +0530 |
| |
When the ksz module is installed and removed using rmmod, kernel crashes with null pointer dereferrence error. During rmmod, ksz_switch_remove function tries to cancel the mib_read_workqueue using cancel_delayed_work_sync routine.
At the end of mib_read_workqueue execution, it again reschedule the workqueue unconditionally. Due to which queue rescheduled after mib_interval, during this execution it tries to access dp->slave. But the slave is unregistered in the ksz_switch_remove function. Hence kernel crashes.
To avoid this crash, before canceling the workqueue, resetted the mib_interval to 0. In the work queue execution, it schedules the workqueue next time only if the mib_interval is non zero.
Fixes: 469b390e1ba3 ("net: dsa: microchip: use delayed_work instead of timer + work") Signed-off-by: Arun Ramadoss <arun.ramadoss@microchip.com> --- drivers/net/dsa/microchip/ksz_common.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/drivers/net/dsa/microchip/ksz_common.c b/drivers/net/dsa/microchip/ksz_common.c index 1542bfb8b5e5..ffc8e6fb300a 100644 --- a/drivers/net/dsa/microchip/ksz_common.c +++ b/drivers/net/dsa/microchip/ksz_common.c @@ -94,7 +94,8 @@ static void ksz_mib_read_work(struct work_struct *work) mutex_unlock(&mib->cnt_mutex); } - schedule_delayed_work(&dev->mib_read, dev->mib_read_interval); + if (dev->mib_read_interval) + schedule_delayed_work(&dev->mib_read, dev->mib_read_interval); } void ksz_init_mib_timer(struct ksz_device *dev) @@ -449,8 +450,10 @@ EXPORT_SYMBOL(ksz_switch_register); void ksz_switch_remove(struct ksz_device *dev) { /* timer started */ - if (dev->mib_read_interval) + if (dev->mib_read_interval) { + dev->mib_read_interval = 0; cancel_delayed_work_sync(&dev->mib_read); + } dev->dev_ops->exit(dev); dsa_unregister_switch(dev->ds); -- 2.33.0
| |