From: David S. Miller Date: Mon, 7 Jun 2021 20:01:52 +0000 (-0700) Subject: Merge ra.kernel.org:/pub/scm/linux/kernel/git/netdev/net X-Git-Url: http://git.maquefel.me/?a=commitdiff_plain;h=126285651b7f95282a0afe3a1b0221419b31d989;p=linux.git Merge ra./pub/scm/linux/kernel/git/netdev/net Bug fixes overlapping feature additions and refactoring, mostly. Signed-off-by: David S. Miller --- 126285651b7f95282a0afe3a1b0221419b31d989 diff --cc drivers/net/ethernet/intel/igc/igc_main.c index 2e71b006b6606,f1adf154ec4ae..3f6b6d4543a8e --- a/drivers/net/ethernet/intel/igc/igc_main.c +++ b/drivers/net/ethernet/intel/igc/igc_main.c @@@ -2203,22 -2025,36 +2203,25 @@@ static int igc_xdp_xmit_back(struct igc return res; } -static struct sk_buff *igc_xdp_run_prog(struct igc_adapter *adapter, - struct xdp_buff *xdp) +/* This function assumes rcu_read_lock() is held by the caller. */ +static int __igc_xdp_run_prog(struct igc_adapter *adapter, + struct bpf_prog *prog, + struct xdp_buff *xdp) { - struct bpf_prog *prog; - int res; - u32 act; + u32 act = bpf_prog_run_xdp(prog, xdp); - rcu_read_lock(); - - prog = READ_ONCE(adapter->xdp_prog); - if (!prog) { - res = IGC_XDP_PASS; - goto unlock; - } - - act = bpf_prog_run_xdp(prog, xdp); switch (act) { case XDP_PASS: - res = IGC_XDP_PASS; - break; + return IGC_XDP_PASS; case XDP_TX: - return igc_xdp_xmit_back(adapter, xdp) < 0 ? - IGC_XDP_CONSUMED : IGC_XDP_TX; + if (igc_xdp_xmit_back(adapter, xdp) < 0) + goto out_failure; - res = IGC_XDP_TX; - break; ++ return IGC_XDP_TX; case XDP_REDIRECT: - return xdp_do_redirect(adapter->netdev, xdp, prog) < 0 ? - IGC_XDP_CONSUMED : IGC_XDP_REDIRECT; + if (xdp_do_redirect(adapter->netdev, xdp, prog) < 0) + goto out_failure; - res = IGC_XDP_REDIRECT; ++ return IGC_XDP_REDIRECT; + break; default: bpf_warn_invalid_xdp_action(act); fallthrough; diff --cc drivers/net/ethernet/stmicro/stmmac/stmmac_main.c index 6d41dd6f9f7a6,c87202cbd3d6d..0a266fa0af7ef --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c @@@ -1222,7 -1240,9 +1222,9 @@@ static int stmmac_phy_setup(struct stmm priv->phylink_config.dev = &priv->dev->dev; priv->phylink_config.type = PHYLINK_NETDEV; priv->phylink_config.pcs_poll = true; - priv->phylink_config.ovr_an_inband = mdio_bus_data->xpcs_an_inband; + if (priv->plat->mdio_bus_data) + priv->phylink_config.ovr_an_inband = - priv->plat->mdio_bus_data->xpcs_an_inband; ++ mdio_bus_data->xpcs_an_inband; if (!fwnode) fwnode = dev_fwnode(priv->device); diff --cc drivers/net/virtio_net.c index ed969b65126ea,78a01c71a17cf..f8f5b8646a431 --- a/drivers/net/virtio_net.c +++ b/drivers/net/virtio_net.c @@@ -398,25 -398,16 +398,28 @@@ static struct sk_buff *page_to_skb(stru else hdr_padded_len = sizeof(struct padded_vnet_hdr); - /* If headroom is not 0, there is an offset between the beginning of the + /* If whole_page, there is an offset between the beginning of the * data and the allocated space, otherwise the data and the allocated * space are aligned. + * + * Buffers with headroom use PAGE_SIZE as alloc size, see + * add_recvbuf_mergeable() + get_mergeable_buf_len() */ - truesize = headroom ? PAGE_SIZE : truesize; - tailroom = truesize - len - headroom - (hdr_padded_len - hdr_len); - buf = p - headroom; + if (whole_page) { + /* Buffers with whole_page use PAGE_SIZE as alloc size, + * see add_recvbuf_mergeable() + get_mergeable_buf_len() + */ + truesize = PAGE_SIZE; + + /* page maybe head page, so we should get the buf by p, not the + * page + */ + tailroom = truesize - len - offset_in_page(p); + buf = (char *)((unsigned long)p & PAGE_MASK); + } else { + tailroom = truesize - len; + buf = p; + } len -= hdr_len; offset += hdr_padded_len; diff --cc net/core/devlink.c index 464f564082475,051432ea4f69e..5260bdfb2403d --- a/net/core/devlink.c +++ b/net/core/devlink.c @@@ -9289,11 -8630,12 +9288,18 @@@ static int __devlink_port_phys_port_nam switch (attrs->flavour) { case DEVLINK_PORT_FLAVOUR_PHYSICAL: + case DEVLINK_PORT_FLAVOUR_VIRTUAL: + n = snprintf(name, len, "p%u", attrs->phys.port_number); + if (n < len && attrs->split) + n += snprintf(name + n, len - n, "s%u", + attrs->phys.split_subport_number); + if (!attrs->split) + n = snprintf(name, len, "p%u", attrs->phys.port_number); + else + n = snprintf(name, len, "p%us%u", + attrs->phys.port_number, + attrs->phys.split_subport_number); ++ break; case DEVLINK_PORT_FLAVOUR_CPU: case DEVLINK_PORT_FLAVOUR_DSA: