kernel-janitors.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [bug report] net: macb: WoL support for GEM type of Ethernet controller
@ 2022-01-19 10:47 Dan Carpenter
  0 siblings, 0 replies; only message in thread
From: Dan Carpenter @ 2022-01-19 10:47 UTC (permalink / raw)
  To: nicolas.ferre; +Cc: kernel-janitors

Hello Nicolas Ferre,

The patch 558e35ccfe95: "net: macb: WoL support for GEM type of
Ethernet controller" from Jul 20, 2020, leads to the following Smatch
static checker warning:

	./include/linux/interrupt.h:215 devm_request_irq()
	warn: sleeping in atomic context

The call tree is:

macb_suspend() <- disables preempt
macb_resume() <- disables preempt
-> devm_request_irq()

drivers/net/ethernet/cadence/macb_main.c
  4922        static int __maybe_unused macb_resume(struct device *dev)
  4923        {
  4924                struct net_device *netdev = dev_get_drvdata(dev);
  4925                struct macb *bp = netdev_priv(netdev);
  4926                struct macb_queue *queue;
  4927                unsigned long flags;
  4928                unsigned int q;
  4929                int err;
  4930
  4931                if (!netif_running(netdev))
  4932                        return 0;
  4933
  4934                if (!device_may_wakeup(dev))
  4935                        pm_runtime_force_resume(dev);
  4936
  4937                if (bp->wol & MACB_WOL_ENABLED) {
  4938                        spin_lock_irqsave(&bp->lock, flags);

Holding a spinlock

  4939                        /* Disable WoL */
  4940                        if (macb_is_gem(bp)) {
  4941                                queue_writel(bp->queues, IDR, GEM_BIT(WOL));
  4942                                gem_writel(bp, WOL, 0);
  4943                        } else {
  4944                                queue_writel(bp->queues, IDR, MACB_BIT(WOL));
  4945                                macb_writel(bp, WOL, 0);
  4946                        }
  4947                        /* Clear ISR on queue 0 */
  4948                        queue_readl(bp->queues, ISR);
  4949                        if (bp->caps & MACB_CAPS_ISR_CLEAR_ON_WRITE)
  4950                                queue_writel(bp->queues, ISR, -1);
  4951                        /* Replace interrupt handler on queue 0 */
  4952                        devm_free_irq(dev, bp->queues[0].irq, bp->queues);
  4953                        err = devm_request_irq(dev, bp->queues[0].irq, macb_interrupt,

devm_request_irq() has a GFP_KERNEL allocation in it.  The suspend and
resume function have this same bug.

  4954                                               IRQF_SHARED, netdev->name, bp->queues);
  4955                        if (err) {
  4956                                dev_err(dev,
  4957                                        "Unable to request IRQ %d (error %d)\n",
  4958                                        bp->queues[0].irq, err);
  4959                                spin_unlock_irqrestore(&bp->lock, flags);
  4960                                return err;
  4961                        }
  4962                        spin_unlock_irqrestore(&bp->lock, flags);
  4963
  4964                        disable_irq_wake(bp->queues[0].irq);
  4965

regards,
dan carpenter

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2022-01-19 10:47 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2022-01-19 10:47 [bug report] net: macb: WoL support for GEM type of Ethernet controller Dan Carpenter

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).