diff options
author | Daiane Angolini <daiane.angolini@foundries.io> | 2023-01-11 21:15:41 -0300 |
---|---|---|
committer | Daiane Angolini <daiane.angolini@foundries.io> | 2023-01-11 21:15:41 -0300 |
commit | e120342f45674fe68a42f95c4ba563dd83dd4f38 (patch) | |
tree | c7d2c2a90d24121af29aed99ad47d639b20402b8 /drivers/uio | |
parent | 77f469806a061dc9a144a204a08f0d278c486344 (diff) | |
parent | 90ffbb727c511c6de9c5905c8d5aba69e413bcba (diff) |
Merge tag 'v5.15.86' into 5.15-2.2.x-imx
This is the 5.15.86 stable release
Conflicts:
arch/arm64/kernel/traps.c
drivers/gpu/drm/bridge/adv7511/adv7511.h
drivers/gpu/drm/bridge/adv7511/adv7533.c
drivers/gpu/drm/rockchip/cdn-dp-core.c
drivers/net/ethernet/freescale/enetc/enetc.c
drivers/usb/dwc3/core.c
Signed-off-by: Daiane Angolini <daiane.angolini@foundries.io>
Diffstat (limited to 'drivers/uio')
-rw-r--r-- | drivers/uio/uio_dmem_genirq.c | 13 |
1 files changed, 7 insertions, 6 deletions
diff --git a/drivers/uio/uio_dmem_genirq.c b/drivers/uio/uio_dmem_genirq.c index 6b5cfa5b0673..28be820b546e 100644 --- a/drivers/uio/uio_dmem_genirq.c +++ b/drivers/uio/uio_dmem_genirq.c @@ -110,8 +110,10 @@ static irqreturn_t uio_dmem_genirq_handler(int irq, struct uio_info *dev_info) * remember the state so we can allow user space to enable it later. */ + spin_lock(&priv->lock); if (!test_and_set_bit(0, &priv->flags)) disable_irq_nosync(irq); + spin_unlock(&priv->lock); return IRQ_HANDLED; } @@ -125,20 +127,19 @@ static int uio_dmem_genirq_irqcontrol(struct uio_info *dev_info, s32 irq_on) * in the interrupt controller, but keep track of the * state to prevent per-irq depth damage. * - * Serialize this operation to support multiple tasks. + * Serialize this operation to support multiple tasks and concurrency + * with irq handler on SMP systems. */ spin_lock_irqsave(&priv->lock, flags); if (irq_on) { if (test_and_clear_bit(0, &priv->flags)) enable_irq(dev_info->irq); - spin_unlock_irqrestore(&priv->lock, flags); } else { - if (!test_and_set_bit(0, &priv->flags)) { - spin_unlock_irqrestore(&priv->lock, flags); - disable_irq(dev_info->irq); - } + if (!test_and_set_bit(0, &priv->flags)) + disable_irq_nosync(dev_info->irq); } + spin_unlock_irqrestore(&priv->lock, flags); return 0; } |