aboutsummaryrefslogtreecommitdiffstats
path: root/net/packet
diff options
context:
space:
mode:
authorJiri Pirko <jpirko@redhat.com>2011-09-02 23:34:30 -0400
committerDavid S. Miller <davem@davemloft.net>2011-09-15 17:32:26 -0400
commit4bc71cb983fd2844e603bf633df2bb53385182d2 (patch)
tree067b6df32fda6c554b2b9263a94a585c2e5a832d /net/packet
parentc5dac7c9984d8a034eb7ae149cedf23ec9259f98 (diff)
net: consolidate and fix ethtool_ops->get_settings calling
This patch does several things: - introduces __ethtool_get_settings which is called from ethtool code and from drivers as well. Put ASSERT_RTNL there. - dev_ethtool_get_settings() is replaced by __ethtool_get_settings() - changes calling in drivers so rtnl locking is respected. In iboe_get_rate was previously ->get_settings() called unlocked. This fixes it. Also prb_calc_retire_blk_tmo() in af_packet.c had the same problem. Also fixed by calling __dev_get_by_index() instead of dev_get_by_index() and holding rtnl_lock for both calls. - introduces rtnl_lock in bnx2fc_vport_create() and fcoe_vport_create() so bnx2fc_if_create() and fcoe_if_create() are called locked as they are from other places. - use __ethtool_get_settings() in bonding code Signed-off-by: Jiri Pirko <jpirko@redhat.com> v2->v3: -removed dev_ethtool_get_settings() -added ASSERT_RTNL into __ethtool_get_settings() -prb_calc_retire_blk_tmo - use __dev_get_by_index() and lock around it and __ethtool_get_settings() call v1->v2: add missing export_symbol Reviewed-by: Ben Hutchings <bhutchings@solarflare.com> [except FCoE bits] Acked-by: Ralf Baechle <ralf@linux-mips.org> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/packet')
-rw-r--r--net/packet/af_packet.c52
1 files changed, 27 insertions, 25 deletions
diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c
index 2ea3d63e1d4c..25e68f56b4ba 100644
--- a/net/packet/af_packet.c
+++ b/net/packet/af_packet.c
@@ -530,33 +530,35 @@ static int prb_calc_retire_blk_tmo(struct packet_sock *po,
530{ 530{
531 struct net_device *dev; 531 struct net_device *dev;
532 unsigned int mbits = 0, msec = 0, div = 0, tmo = 0; 532 unsigned int mbits = 0, msec = 0, div = 0, tmo = 0;
533 struct ethtool_cmd ecmd;
534 int err;
533 535
534 dev = dev_get_by_index(sock_net(&po->sk), po->ifindex); 536 rtnl_lock();
535 if (unlikely(dev == NULL)) 537 dev = __dev_get_by_index(sock_net(&po->sk), po->ifindex);
538 if (unlikely(!dev)) {
539 rtnl_unlock();
536 return DEFAULT_PRB_RETIRE_TOV; 540 return DEFAULT_PRB_RETIRE_TOV;
537 541 }
538 if (dev->ethtool_ops && dev->ethtool_ops->get_settings) { 542 err = __ethtool_get_settings(dev, &ecmd);
539 struct ethtool_cmd ecmd = { .cmd = ETHTOOL_GSET, }; 543 rtnl_unlock();
540 544 if (!err) {
541 if (!dev->ethtool_ops->get_settings(dev, &ecmd)) { 545 switch (ecmd.speed) {
542 switch (ecmd.speed) { 546 case SPEED_10000:
543 case SPEED_10000: 547 msec = 1;
544 msec = 1; 548 div = 10000/1000;
545 div = 10000/1000; 549 break;
546 break; 550 case SPEED_1000:
547 case SPEED_1000: 551 msec = 1;
548 msec = 1; 552 div = 1000/1000;
549 div = 1000/1000; 553 break;
550 break; 554 /*
551 /* 555 * If the link speed is so slow you don't really
552 * If the link speed is so slow you don't really 556 * need to worry about perf anyways
553 * need to worry about perf anyways 557 */
554 */ 558 case SPEED_100:
555 case SPEED_100: 559 case SPEED_10:
556 case SPEED_10: 560 default:
557 default: 561 return DEFAULT_PRB_RETIRE_TOV;
558 return DEFAULT_PRB_RETIRE_TOV;
559 }
560 } 562 }
561 } 563 }
562 564