net/macb: fix multiqueue support patch up
Subsystems (3)
cover net/macb: fix multiqueue support patch up
This series of patches is a fixup for the multiqueue support patch.
The first patch fixes a bug introduced by the multiqueue support patch. The second one doesn't fix a bug but simplify the source code by removing useless calls to devm_free_irq() since we use managed device resources for IRQs.
They were applied on the net-next tree and tested with a sama5d36ek board.
Cyrille Pitchen (2):
net/macb: fix misplaced call of free_netdev() in macb_remove() net/macb: remove useless calls of devm_free_irq()
drivers/net/ethernet/cadence/macb.c | 25 +++++++++---------------- 1 file changed, 9 insertions(+), 16 deletions(-)
Signature · 1 line
1.8.2.2
PATCH 1/2 net/macb: fix misplaced call of free_netdev() in macb_remove()
fix a bug introduced by the multiqueue support patch:
"net/macb: add TX multiqueue support for gem"
the "bp" pointer to the netdev private data was dereferenced and used after the associated memory had been freed by calling free_netdev().
--- drivers/net/ethernet/cadence/macb.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/ethernet/cadence/macb.c +1 -1
@@ -2408,11 +2408,11 @@ static int __exit macb_remove(struct platform_device *pdev) queue = bp->queues;for (q =0 ; q < bp->num_queues; ++q, ++queue)devm_free_irq (&pdev->dev, queue->irq, queue); -free_netdev (dev);if (!IS_ERR (bp->tx_clk))clk_disable_unprepare (bp->tx_clk);clk_disable_unprepare (bp->hclk);clk_disable_unprepare (bp->pclk); +free_netdev (dev); }return 0 ;
Signature · 1 line
1.8.2.2
PATCH 2/2 net/macb: remove useless calls of devm_free_irq()
In reply to Cyrille PitchenInside macb_probe(), when devm_request_irq() fails on queue q, there is no need to call devm_free_irq() on queues 0..q-1 because the managed device resources are released later when calling free_netdev().
Also removing devm_free_irq() call from macb_remove() for the same reason.
--- drivers/net/ethernet/cadence/macb.c | 23 ++++++++--------------- 1 file changed, 8 insertions(+), 15 deletions(-)
drivers/net/ethernet/cadence/macb.c +8 -15
@@ -2160,7 +2160,7 @@ static int __init macb_probe(struct platform_device *pdev)int err = -ENXIO ;const char *mac;void __iomem *mem; -unsigned int hw_q, queue_mask, q, num_queues, q_irq =0 ; +unsigned int hw_q, queue_mask, q, num_queues;struct clk *pclk, *hclk, *tx_clk; regs =platform_get_resource (pdev,IORESOURCE_MEM ,0 );
@@ -2235,11 +2235,11 @@ static int __init macb_probe(struct platform_device *pdev)* register mapping but we don't want to test the queue index then * compute the corresponding register offset at run time. */ -for (hw_q =0 ; hw_q <MACB_MAX_QUEUES ; ++hw_q) { +for (hw_q =0 , q =0 ; hw_q <MACB_MAX_QUEUES ; ++hw_q) {if (!(queue_mask & (1 << hw_q)))continue ; - queue = &bp->queues[q_irq]; + queue = &bp->queues[q]; queue->bp = bp;if (hw_q) { queue->ISR =GEM_ISR (hw_q -1 );
@@ -2261,18 +2261,18 @@ static int __init macb_probe(struct platform_device *pdev)* must remove the optional gaps that could exist in the * hardware queue mask. */ - queue->irq =platform_get_irq (pdev, q_irq); + queue->irq =platform_get_irq (pdev, q); err =devm_request_irq (&pdev->dev, queue->irq, macb_interrupt,0 , dev->name, queue);if (err) {dev_err (&pdev->dev,"Unable to request IRQ %d (error %d)\n" , queue->irq, err); - goto err_out_free_irq; + goto err_out_free_netdev; }INIT_WORK (&queue->tx_error_task, macb_tx_error_task); - q_irq++; + q++; } dev->irq = bp->queues[0 ].irq;
@@ -2350,7 +2350,7 @@ static int __init macb_probe(struct platform_device *pdev) err =register_netdev (dev);if (err) {dev_err (&pdev->dev,"Cannot register net device, aborting.\n" ); - goto err_out_free_irq; + goto err_out_free_netdev; } err =macb_mii_init (bp);
@@ -2373,9 +2373,7 @@ static int __init macb_probe(struct platform_device *pdev) err_out_unregister_netdev:unregister_netdev (dev); -err_out_free_irq: -for (q =0 , queue = bp->queues; q < q_irq; ++q, ++queue) -devm_free_irq (&pdev->dev, queue->irq, queue); +err_out_free_netdev:free_netdev (dev); err_out_disable_clocks:if (!IS_ERR (tx_clk))
@@ -2392,8 +2390,6 @@ static int __exit macb_remove(struct platform_device *pdev) {struct net_device *dev;struct macb *bp; -struct macb_queue *queue; -unsigned int q; dev =platform_get_drvdata (pdev);
@@ -2405,9 +2401,6 @@ static int __exit macb_remove(struct platform_device *pdev)kfree (bp->mii_bus->irq);mdiobus_free (bp->mii_bus);unregister_netdev (dev); - queue = bp->queues; -for (q =0 ; q < bp->num_queues; ++q, ++queue) -devm_free_irq (&pdev->dev, queue->irq, queue);if (!IS_ERR (bp->tx_clk))clk_disable_unprepare (bp->tx_clk);clk_disable_unprepare (bp->hclk);
Signature · 1 line
1.8.2.2
David Miller
maintainerFrom: Cyrille Pitchen <[email protected]>
Date: Mon, 15 Dec 2014 15:13:30 +0100
Quoted 8 lines
This series of patches is a fixup for the multiqueue support patch.
The first patch fixes a bug introduced by the multiqueue support patch. The second one doesn't fix a bug but simplify the source code by removing useless calls to
devm_free_irq()since we use managed device resources for IRQs.They were applied on the net-next tree and tested with a sama5d36ek board.
Series applied, thanks.