]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
net: dsa: microchip: Fix error path in PTP IRQ setup
authorBastien Curutchet (Schneider Electric) <bastien.curutchet@bootlin.com>
Mon, 9 Mar 2026 13:15:43 +0000 (14:15 +0100)
committerJakub Kicinski <kuba@kernel.org>
Thu, 12 Mar 2026 01:06:22 +0000 (18:06 -0700)
If request_threaded_irq() fails during the PTP message IRQ setup, the
newly created IRQ mapping is never disposed. Indeed, the
ksz_ptp_irq_setup()'s error path only frees the mappings that were
successfully set up.

Dispose the newly created mapping if the associated
request_threaded_irq() fails at setup.

Cc: stable@vger.kernel.org
Fixes: d0b8fec8ae505 ("net: dsa: microchip: Fix symetry in ksz_ptp_msg_irq_{setup/free}()")
Signed-off-by: Bastien Curutchet (Schneider Electric) <bastien.curutchet@bootlin.com>
Reviewed-by: Simon Horman <horms@kernel.org>
Reviewed-by: Vladimir Oltean <olteanv@gmail.com>
Link: https://patch.msgid.link/20260309-ksz-ptp-irq-fix-v1-1-757b3b985955@bootlin.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/dsa/microchip/ksz_ptp.c

index 4a2cc57a628f97bd51fcb11057bc4effda9205dd..8b98039320adda7655ae2563b896b92033d2f1ad 100644 (file)
@@ -1108,6 +1108,7 @@ static int ksz_ptp_msg_irq_setup(struct ksz_port *port, u8 n)
        const struct ksz_dev_ops *ops = port->ksz_dev->dev_ops;
        struct ksz_irq *ptpirq = &port->ptpirq;
        struct ksz_ptp_irq *ptpmsg_irq;
+       int ret;
 
        ptpmsg_irq = &port->ptpmsg_irq[n];
        ptpmsg_irq->num = irq_create_mapping(ptpirq->domain, n);
@@ -1119,9 +1120,13 @@ static int ksz_ptp_msg_irq_setup(struct ksz_port *port, u8 n)
 
        strscpy(ptpmsg_irq->name, name[n]);
 
-       return request_threaded_irq(ptpmsg_irq->num, NULL,
-                                   ksz_ptp_msg_thread_fn, IRQF_ONESHOT,
-                                   ptpmsg_irq->name, ptpmsg_irq);
+       ret = request_threaded_irq(ptpmsg_irq->num, NULL,
+                                  ksz_ptp_msg_thread_fn, IRQF_ONESHOT,
+                                  ptpmsg_irq->name, ptpmsg_irq);
+       if (ret)
+               irq_dispose_mapping(ptpmsg_irq->num);
+
+       return ret;
 }
 
 int ksz_ptp_irq_setup(struct dsa_switch *ds, u8 p)