From: Vitaly Kuznetsov <vkuznets@redhat.com>
To: David Miller <davem@davemloft.net>
Cc: haiyangz@microsoft.com, netdev@vger.kernel.org,
kys@microsoft.com, olaf@aepfle.de, linux-kernel@vger.kernel.org,
driverdev-devel@linuxdriverproject.org
Subject: Re: [PATCH net-next] hv_netvsc: Increase delay for RNDIS_STATUS_NETWORK_CHANGE
Date: Wed, 17 Feb 2016 13:53:14 +0100 [thread overview]
Message-ID: <878u2jmrb9.fsf@vitty.brq.redhat.com> (raw)
In-Reply-To: <20160216.152827.2202202588726087877.davem@davemloft.net> (David Miller's message of "Tue, 16 Feb 2016 15:28:27 -0500 (EST)")
David Miller <davem@davemloft.net> writes:
> From: Haiyang Zhang <haiyangz@microsoft.com>
> Date: Tue, 9 Feb 2016 15:31:34 +0000
>
>> 1) I share your concern as well. Is there a universal way to immediately trigger
>> DHCP renew of all current and future daemons with a single event from kernel?
>> If not, can we put the delay (RNDIS_STATUS_NETWORK_CHANGE only) into a
>> tunable variable of this driver?
>>
>> 2) We used to have the call_usermodehelper "/etc/init.d/network restart" to
>> trigger DHCP renew. In commit 27a70af3f4, Vitaly has replaced it with the current
>> code that updates the link status with at least 2 seconds interval, so that the
>> "link_watch infrastructure" can send notification out. link_watch infrastructure
>> only sends one notification per second.
>
> If the daemon is waiting for the link state change properly, there should be
> no delay necessary at all.
The daemon won't get 2 state change notifications if they happen within
1 second, it will get the last state only so our link will transition
from 'UP' to 'UP'. Why is that? To signal link state change we call
netif_carrier_on()/netif_carrier_off() from the driver. These functions
do linkwatch_fire_event() which has the following code for non-urgent events:
if (!test_and_set_bit(__LINK_STATE_LINKWATCH_PENDING, &dev->state)) {
linkwatch_add_event(dev);
} else if (!urgent)
return;
linkwatch_schedule_work(urgent);
So we'll add just one event (because of test_and_set_bit) for a pair of
consequent netif_carrier_off()/netif_carrier_on() calls.
linkwatch_schedule_work() does the following:
unsigned long delay = linkwatch_nextevent - jiffies;
....
/* If we wrap around we'll delay it by at most HZ. */
if (delay > HZ)
delay = 0;
so here is where mandatory ' > 1s' wait comes from.
....
schedule_delayed_work(&linkwatch_work, delay);
linkwatch_work is linkwatch_event() which calls __linkwatch_run_queue()
which does linkwatch_do_dev() for the list of events we have. But
linkwatch_do_dev() checks current carrier status (which in our case if
'UP' if we didn't wait for > 1s before doing /netif_carrier_on()).
Hyper-V driver is not the only one which has this delay. e1000 driver,
for example, has the following:
...
* Need to wait a few seconds after link up to get diagnostic information from
* the phy
*/
static void e1000_update_phy_info_task(struct work_struct *work)
...
which we schedule with
schedule_delayed_work(&adapter->phy_info_task, 2 * HZ);
To my understanding this code serves the same purpose, so even if you're
super fast with unplugging and plugging back your cable you'll have 2
seconds between 'down' and 'up'. I don't think there is something wrong
with linkwatch, the '1s' protection against drivers going mad is fine so
'2s' workarounds in drivers seem legit.
--
Vitaly
prev parent reply other threads:[~2016-02-17 12:53 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-02-03 0:15 [PATCH net-next] hv_netvsc: Increase delay for RNDIS_STATUS_NETWORK_CHANGE Haiyang Zhang
2016-02-03 13:05 ` Vitaly Kuznetsov
2016-02-03 15:46 ` Haiyang Zhang
2016-02-03 16:06 ` Vitaly Kuznetsov
2016-02-03 16:39 ` Haiyang Zhang
2016-02-09 10:04 ` David Miller
2016-02-09 15:31 ` Haiyang Zhang
2016-02-16 20:28 ` David Miller
2016-02-17 12:53 ` Vitaly Kuznetsov [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=878u2jmrb9.fsf@vitty.brq.redhat.com \
--to=vkuznets@redhat.com \
--cc=davem@davemloft.net \
--cc=driverdev-devel@linuxdriverproject.org \
--cc=haiyangz@microsoft.com \
--cc=kys@microsoft.com \
--cc=linux-kernel@vger.kernel.org \
--cc=netdev@vger.kernel.org \
--cc=olaf@aepfle.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox