From patchwork Tue Apr 24 14:39:17 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Toshiaki Makita X-Patchwork-Id: 903537 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="hDy3dOc6"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 40VmFh3cR5z9ry1 for ; Wed, 25 Apr 2018 00:40:08 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754592AbeDXOj5 (ORCPT ); Tue, 24 Apr 2018 10:39:57 -0400 Received: from mail-pf0-f195.google.com ([209.85.192.195]:35331 "EHLO mail-pf0-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752765AbeDXOjq (ORCPT ); Tue, 24 Apr 2018 10:39:46 -0400 Received: by mail-pf0-f195.google.com with SMTP id j5so12435612pfh.2 for ; Tue, 24 Apr 2018 07:39:46 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=NgGLznUpGO7DKLf0fz6l78MvWABSL/omROv2uybaO9I=; b=hDy3dOc6TfXK2P+KpdU8STRb5SNeOBIRVrwGaofN7KjISvXLFitNY8x116LbUko/WD VsQI+T+FZXr7AalmrazsFRHApmV9g9L854SbgADHvXm9csEWoIzg3XQoLpCwyl8XsdVi S3gftl0Hc1sMaZFNLBcBdpFvpzRQBJbaXVbMTUSmJuyYWJTsUxK5u+SdHxibalfT+bOD ORtf9zf01bHB1c9CaWRul71cng8lpmeK4WN67XQqYsRD+F0jVIe87GgFyl/gtmY92Xtc lcBywPulUaOKKD3d4UnPwXXPN/dQaw8jzkMA9eEFJ0MHezrmi4QtdSOoIEgwDe/BMjxW LjzA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=NgGLznUpGO7DKLf0fz6l78MvWABSL/omROv2uybaO9I=; b=epQ86Dzqsc6VJIstD6w8sk8OYzWZsW020R/bziOXhBjABWXChImoi3Yxu4HU+933z5 uHGtvRkmGCZGjJJf+6/QZCPdJK2TOrhmhyVwi3igunHcktIg+3/J2Gxsafd3kDZOLZ75 5pwKd/fAlhW3SXsTGEwDnpvyRauCEobQiQVcigZbc0BGTz50XfYs82sAK/sdF96bwvOk qA7ifR2yHBd6v82J+azncs2LNmEDvTyPOzNQ8yOWLfrxpiFIAYNmveLMPhc2Pzr7KxSS Z6b21SHgKYa7+RNq6XUFn/IL0SdniIsOzq6XdlIeyQWdruPyQ+3kAhNcScEu96VGv2zH wThA== X-Gm-Message-State: ALQs6tDEVqtF1Mk6+Owsxv3og6UEuh1zfvz6E4JoHbR1+efIko+rrapz dN+uVzgC3uhmVj7KpNixGOg72uFiFdg= X-Google-Smtp-Source: AIpwx4/FBwc/CLca+NPKr5e2/1uaWtHLKloGLc3TAvLqSRfB33TPW2O/R8Nzd6LKAlZ2SFLmWLkoZw== X-Received: by 10.101.76.6 with SMTP id u6mr20225603pgq.388.1524580785522; Tue, 24 Apr 2018 07:39:45 -0700 (PDT) Received: from localhost.localdomain (i121-115-166-6.s42.a013.ap.plala.or.jp. [121.115.166.6]) by smtp.gmail.com with ESMTPSA id o64sm28179970pfb.62.2018.04.24.07.39.44 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Tue, 24 Apr 2018 07:39:45 -0700 (PDT) From: Toshiaki Makita To: netdev@vger.kernel.org Cc: Toshiaki Makita Subject: [PATCH RFC 3/9] veth: Avoid drops by oversized packets when XDP is enabled Date: Tue, 24 Apr 2018 23:39:17 +0900 Message-Id: <20180424143923.26519-4-toshiaki.makita1@gmail.com> X-Mailer: git-send-email 2.14.3 In-Reply-To: <20180424143923.26519-1-toshiaki.makita1@gmail.com> References: <20180424143923.26519-1-toshiaki.makita1@gmail.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Toshiaki Makita All oversized packets including GSO packets are dropped if XDP is enabled on receiver side, so don't send such packets from peer. Drop TSO and SCTP fragmentation features so that veth devices themselves segment packets with XDP enabled. Also cap MTU accordingly. Signed-off-by: Toshiaki Makita --- drivers/net/veth.c | 39 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git a/drivers/net/veth.c b/drivers/net/veth.c index 9c4197306716..7271d9582b4a 100644 --- a/drivers/net/veth.c +++ b/drivers/net/veth.c @@ -410,6 +410,23 @@ static int veth_get_iflink(const struct net_device *dev) return iflink; } +static netdev_features_t veth_fix_features(struct net_device *dev, + netdev_features_t features) +{ + struct veth_priv *priv = netdev_priv(dev); + struct net_device *peer; + + peer = rtnl_dereference(priv->peer); + if (peer) { + struct veth_priv *peer_priv = netdev_priv(peer); + + if (rtnl_dereference(peer_priv->xdp_prog)) + features &= ~NETIF_F_GSO_SOFTWARE; + } + + return features; +} + static void veth_set_rx_headroom(struct net_device *dev, int new_hr) { struct veth_priv *peer_priv, *priv = netdev_priv(dev); @@ -438,13 +455,32 @@ static int veth_xdp_set(struct net_device *dev, struct bpf_prog *prog, { struct veth_priv *priv = netdev_priv(dev); struct bpf_prog *old_prog; + struct net_device *peer; old_prog = rtnl_dereference(priv->xdp_prog); + peer = rtnl_dereference(priv->peer); + + if (!old_prog && prog && peer) { + peer->hw_features &= ~NETIF_F_GSO_SOFTWARE; + peer->max_mtu = PAGE_SIZE - VETH_XDP_HEADROOM - + peer->hard_header_len - + SKB_DATA_ALIGN(sizeof(struct skb_shared_info)); + if (peer->mtu > peer->max_mtu) + dev_set_mtu(peer, peer->max_mtu); + } rcu_assign_pointer(priv->xdp_prog, prog); - if (old_prog) + if (old_prog) { bpf_prog_put(old_prog); + if (!prog && peer) { + peer->hw_features |= NETIF_F_GSO_SOFTWARE; + peer->max_mtu = ETH_MAX_MTU; + } + } + + if ((!!old_prog ^ !!prog) && peer) + netdev_update_features(peer); return 0; } @@ -487,6 +523,7 @@ static const struct net_device_ops veth_netdev_ops = { .ndo_poll_controller = veth_poll_controller, #endif .ndo_get_iflink = veth_get_iflink, + .ndo_fix_features = veth_fix_features, .ndo_features_check = passthru_features_check, .ndo_set_rx_headroom = veth_set_rx_headroom, .ndo_bpf = veth_xdp,