diff options
author | Jiri Pirko <jpirko@redhat.com> | 2011-09-02 23:34:30 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2011-09-15 17:32:26 -0400 |
commit | 4bc71cb983fd2844e603bf633df2bb53385182d2 (patch) | |
tree | 067b6df32fda6c554b2b9263a94a585c2e5a832d /net/packet | |
parent | c5dac7c9984d8a034eb7ae149cedf23ec9259f98 (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.c | 52 |
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 | ||