1. 28 9月, 2010 1 次提交
    • J
      3c59x: fix regression from patch "Add ethtool WOL support" · 3fd6c88e
      Jan Beulich 提交于
      This patch (commit 690a1f20) added a
      new call site for acpi_set_WOL() without checking that the function is
      actually suitable to be called via
      
       vortex_set_wol+0xcd/0xe0 [3c59x]
       dev_ethtool+0xa5a/0xb70
       dev_ioctl+0x2e0/0x4b0
       T.961+0x49/0x50
       sock_ioctl+0x47/0x290
       do_vfs_ioctl+0x7f/0x340
       sys_ioctl+0x80/0xa0
       system_call_fastpath+0x16/0x1b
      
      i.e. outside of code paths run when the device is not yet enabled or
      already disabled. In particular, putting the device into D3hot is a
      pretty bad idea when it was already brought up.
      
      Furthermore, all prior callers of the function made sure they're
      actually dealing with a PCI device, while the newly added one didn't.
      
      In the same spirit, the .get_wol handler shouldn't indicate support
      for WOL for non-PCI devices.
      Signed-off-by: NJan Beulich <jbeulich@novell.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      3fd6c88e
  2. 27 9月, 2010 10 次提交
  3. 25 9月, 2010 2 次提交
    • O
      de2104x: disable autonegotiation on broken hardware · e0f9c4f3
      Ondrej Zary 提交于
      At least on older 21041-AA chips (mine is rev. 11), TP duplex autonegotiation
      causes the card not to work at all (link is up but no packets are transmitted).
      
      de4x5 disables autonegotiation completely. But it seems to work on newer
      (21041-PA rev. 21) so disable it only on rev<20 chips.
      Signed-off-by: NOndrej Zary <linux@rainbow-software.org>
      Acked-by: NJeff Garzik <jgarzik@redhat.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      e0f9c4f3
    • E
      net: fix a lockdep splat · f064af1e
      Eric Dumazet 提交于
      We have for each socket :
      
      One spinlock (sk_slock.slock)
      One rwlock (sk_callback_lock)
      
      Possible scenarios are :
      
      (A) (this is used in net/sunrpc/xprtsock.c)
      read_lock(&sk->sk_callback_lock) (without blocking BH)
      <BH>
      spin_lock(&sk->sk_slock.slock);
      ...
      read_lock(&sk->sk_callback_lock);
      ...
      
      (B)
      write_lock_bh(&sk->sk_callback_lock)
      stuff
      write_unlock_bh(&sk->sk_callback_lock)
      
      (C)
      spin_lock_bh(&sk->sk_slock)
      ...
      write_lock_bh(&sk->sk_callback_lock)
      stuff
      write_unlock_bh(&sk->sk_callback_lock)
      spin_unlock_bh(&sk->sk_slock)
      
      This (C) case conflicts with (A) :
      
      CPU1 [A]                         CPU2 [C]
      read_lock(callback_lock)
      <BH>                             spin_lock_bh(slock)
      <wait to spin_lock(slock)>
                                       <wait to write_lock_bh(callback_lock)>
      
      We have one problematic (C) use case in inet_csk_listen_stop() :
      
      local_bh_disable();
      bh_lock_sock(child); // spin_lock_bh(&sk->sk_slock)
      WARN_ON(sock_owned_by_user(child));
      ...
      sock_orphan(child); // write_lock_bh(&sk->sk_callback_lock)
      
      lockdep is not happy with this, as reported by Tetsuo Handa
      
      It seems only way to deal with this is to use read_lock_bh(callbacklock)
      everywhere.
      
      Thanks to Jarek for pointing a bug in my first attempt and suggesting
      this solution.
      Reported-by: NTetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
      Tested-by: NTetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
      Signed-off-by: NEric Dumazet <eric.dumazet@gmail.com>
      CC: Jarek Poplawski <jarkao2@gmail.com>
      Tested-by: NEric Dumazet <eric.dumazet@gmail.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      f064af1e
  4. 23 9月, 2010 16 次提交
  5. 22 9月, 2010 4 次提交
  6. 21 9月, 2010 6 次提交
  7. 18 9月, 2010 1 次提交
    • E
      qlcnic: dont assume NET_IP_ALIGN is 2 · 04746ff1
      Eric Dumazet 提交于
      qlcnic driver allocates rx skbs and gives to hardware too bytes of extra
      storage, allowing for corruption of kernel data.
      
      NET_IP_ALIGN being 0 on some platforms (including x86), drivers should
      not assume it's 2.
      
      rds_ring->skb_size = rds_ring->dma_size + NET_IP_ALIGN;
      ...
      skb = dev_alloc_skb(rds_ring->skb_size);
      skb_reserve(skb, 2);
      pci_map_single(pdev, skb->data, rds_ring->dma_size, PCI_DMA_FROMDEVICE);
      
      (and rds_ring->skb_size == rds_ring->dma_size) -> bug
      
      
      Because of extra alignment (1500 + 32) -> four extra bytes are available
      before the struct skb_shared_info, so corruption is not noticed.
      
      Note: this driver could use netdev_alloc_skb_ip_align()
      Signed-off-by: NEric Dumazet <eric.dumazet@gmail.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      04746ff1