The linkwatch_event work queue runs up to one second later. When the MicroVM starts, it takes 300+ms for the ethX flag to change from '+UP +LOWER_UP' to '+RUNNING', as follows: Jul 20 22:00:47.432552 systemd-networkd[210]: eth0: bringing link up ... Jul 20 22:00:47.446108 systemd-networkd[210]: eth0: flags change: +UP +LOWER_UP ... Jul 20 22:00:47.781463 systemd-networkd[210]: eth0: flags change: +RUNNING
Let's manually trigger it here to make the network service start faster. After applying this patch, the time consumption of systemd-networkd.service was reduced from 366ms to 50ms. Signed-off-by: Wen Yang <weny...@linux.alibaba.com> Cc: "David S. Miller" <da...@davemloft.net> Cc: Jakub Kicinski <k...@kernel.org> Cc: Andrew Lunn <and...@lunn.ch> Cc: Eric Dumazet <eduma...@google.com> Cc: Jiri Pirko <j...@mellanox.com> Cc: Leon Romanovsky <l...@kernel.org> Cc: Julian Wiedmann <j...@linux.ibm.com> Cc: netdev@vger.kernel.org Cc: linux-ker...@vger.kernel.org --- net/core/link_watch.c | 3 +++ net/core/rtnetlink.c | 1 + 2 files changed, 4 insertions(+) diff --git a/net/core/link_watch.c b/net/core/link_watch.c index 75431ca..6b9d44b 100644 --- a/net/core/link_watch.c +++ b/net/core/link_watch.c @@ -98,6 +98,9 @@ static bool linkwatch_urgent_event(struct net_device *dev) if (netif_is_lag_port(dev) || netif_is_lag_master(dev)) return true; + if ((dev->flags & IFF_UP) && dev->operstate == IF_OPER_DOWN) + return true; + return netif_carrier_ok(dev) && qdisc_tx_changing(dev); } diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c index 58c484a..fd0b3b6 100644 --- a/net/core/rtnetlink.c +++ b/net/core/rtnetlink.c @@ -2604,6 +2604,7 @@ static int do_setlink(const struct sk_buff *skb, extack); if (err < 0) goto errout; + linkwatch_fire_event(dev); } if (tb[IFLA_MASTER]) { -- 1.8.3.1