Re: ixgbe question
From: Eric Dumazet <hidden>
Date: 2009-11-24 09:55:49
Subsystem:
networking drivers, the rest · Maintainers:
Andrew Lunn, "David S. Miller", Eric Dumazet, Jakub Kicinski, Paolo Abeni, Linus Torvalds
Peter P Waskiewicz Jr a écrit :
quoted hunk ↗ jump to hunk
You might have this elsewhere, but it sounds like you're connecting back to back with another 82599 NIC. Our optics in that NIC are dual-rate, and the software mechanism that tries to "autoneg" link speed gets out of sync easily in back-to-back setups. If it's really annoying, and you're willing to run with a local patch to disable the autotry mechanism, try this:diff --git a/drivers/net/ixgbe/ixgbe_main.cb/drivers/net/ixgbe/ixgbe_main.c index a5036f7..62c0915 100644--- a/drivers/net/ixgbe/ixgbe_main.c +++ b/drivers/net/ixgbe/ixgbe_main.c@@ -4670,6 +4670,10 @@ static void ixgbe_multispeed_fiber_task(structwork_struct *work) autoneg = hw->phy.autoneg_advertised; if ((!autoneg) && (hw->mac.ops.get_link_capabilities)) hw->mac.ops.get_link_capabilities(hw, &autoneg, &negotiation); + + /* force 10G only */ + autoneg = IXGBE_LINK_SPEED_10GB_FULL; + if (hw->mac.ops.setup_link) hw->mac.ops.setup_link(hw, autoneg, negotiation, true); adapter->flags |= IXGBE_FLAG_NEED_LINK_UPDATE;
Thanks ! This did the trick :) If I am not mistaken, number of TX queues should be capped by number of possible cpus ? Its currently a fixed 128 value, allocating 128*128 = 16384 bytes, and polluting "tc -s -d class show dev fiber0" output. [PATCH net-next-2.6] ixgbe: Do not allocate too many netdev txqueues Instead of allocating 128 struct netdev_queue per device, use the minimum value between 128 and number of possible cpus, to reduce ram usage and "tc -s -d class show dev ..." output
diff --git a/drivers/net/ixgbe/ixgbe_main.c b/drivers/net/ixgbe/ixgbe_main.c
index ebcec30..ec2508d 100644
--- a/drivers/net/ixgbe/ixgbe_main.c
+++ b/drivers/net/ixgbe/ixgbe_main.c@@ -5582,7 +5583,10 @@ static int __devinit ixgbe_probe(struct pci_dev *pdev, pci_set_master(pdev); pci_save_state(pdev); - netdev = alloc_etherdev_mq(sizeof(struct ixgbe_adapter), MAX_TX_QUEUES); + netdev = alloc_etherdev_mq(sizeof(struct ixgbe_adapter), + min_t(unsigned int, + MAX_TX_QUEUES, + num_possible_cpus())); if (!netdev) { err = -ENOMEM; goto err_alloc_etherdev;