Подробности

[В начало]

Проблема в реализации № L0020

Краткое описание

drivers/net/3c505.c: Двойная блокировка spin_lock_irqsave

Подробное описание

Драйвер drivers/net/3c505.c. Двойная блокировка. Первая блокировка spin_lock_irqsave устанавливается на adapter->lock в строке 1075 в функции netdev_tx_t elp_start_xmi: drivers/net/3c505.c:

1070 static netdev_tx_t elp_start_xmit(struct sk_buff *skb, struct net_device 
*dev)
1071 {
1072         unsigned long flags;
1073         elp_device *adapter = netdev_priv(dev);
1074
1075         spin_lock_irqsave(&adapter->lock, flags);
1076         check_3c505_dma(dev);
...
А вторая внутри check_3c505_dma в строке 301: Путь до второго spin_lock_irqsave из elp_start_xmit:
  • netdev_tx_t elp_start_xmit вызывает check_3c505_dma в строке 1076
  • check_3c505_dma вызывает spin_lock_irqsave в строке 301
  •  293 static inline void check_3c505_dma(struct net_device *dev)
     294 {
     295         elp_device *adapter = netdev_priv(dev);
     296         if (adapter->dmaing && time_after(jiffies, adapter-
    >current_dma.start_time + 10)) {
     297                 unsigned long flags, f;
     298                 pr_err("%s: DMA %s timed out, %d bytes left
    ", dev-
    >name,
     299                         adapter->current_dma.direction ? "download" : 
    "upload",
     300                         get_dma_residue(dev->dma));
     301                 spin_lock_irqsave(&adapter->lock, flags);
    

    Компонент

    linux-kernel 2.6.35-rc1

    Принято

    https://lkml.org/lkml/2010/6/17/408

    Статус

    Признано ошибкой

    [В начало]