diff options
Diffstat (limited to 'net/packet/af_packet.c')
-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 | ||