From patchwork Tue Dec 19 21:35:41 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jakub Kicinski X-Patchwork-Id: 851063 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@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; dkim=pass (2048-bit key; unprotected) header.d=netronome-com.20150623.gappssmtp.com header.i=@netronome-com.20150623.gappssmtp.com header.b="g7GtuUeA"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3z1WRc4gWyz9s1h for ; Wed, 20 Dec 2017 08:35:56 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753852AbdLSVfy (ORCPT ); Tue, 19 Dec 2017 16:35:54 -0500 Received: from mail-pl0-f68.google.com ([209.85.160.68]:36432 "EHLO mail-pl0-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752681AbdLSVfw (ORCPT ); Tue, 19 Dec 2017 16:35:52 -0500 Received: by mail-pl0-f68.google.com with SMTP id b12so7757725plm.3 for ; Tue, 19 Dec 2017 13:35:52 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=netronome-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id; bh=TA9baT0aa1HyR7bwFWIX+s4EaXU78M503PTrVEwIEy8=; b=g7GtuUeA2Glkze7n28u8JxKxQvcBO7kXlms66TsobD3HUEv/N/q9oX1zM/W0ul1/NL qNe0TMJLzzWE6QWtxpy3A42bvdABsGJ0At4lOWbm6yYWFDRmZ1ZHBexT1I3Ok+oGzMj4 TuJ0bjAkmUbeyPdQ2shO0GjFCP+jWR9pKXunJ1RMxYi+EDKkJIXoQVtvi7puwmuZkcnA TZj1l6tHvwK9TUY/dovSix01HGC3hRBg0MkVj7gPJFC8mbQE+8a9oaothX1cm6fXaGdk pprWae5XCKT+cTe9PZsijbNL4zbFHk9RnTg50uu2qd233wtivep49pYe+mDOXCgiPOsD 4oBw== 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; bh=TA9baT0aa1HyR7bwFWIX+s4EaXU78M503PTrVEwIEy8=; b=Pqq/g5rKuCKfFbBscQ7Z4FEElHQ1Zs2+opi+k4Cow6fkS78nKTositajjIpCEGZS+u RnqxGzVlV8+/q9VOXJi3R2jXOFKpyZIC2+N7KyfdM9w4tWayGV4aUpesDXBkp6Ur0BVM Ct0FR0NHZQFDmUNf1kDSNGeGF5ky1mpzRwNIHc531dpdG4ICTOGb8+qaDaXKir01V//c hypazgS2+fcGcHDYmIn7/kCXx1Rb7gq/aHN/XI7JHLRTqxKXwuk7GKvTge/vPxqMVhY/ DWqPZs9phoochsTaCdPzwNtxwfiznU+Hj2N+l86KadXwSz+pqBhBP1zE/TjGdATNpuVi biTg== X-Gm-Message-State: AKGB3mLuzCW0bdL/Wb677NzBEvrTLRQ5pUmCnfuV/yO2AVKwodr8dNvz T3BDEV75W2XIT6FlwvDaMicKwqMl X-Google-Smtp-Source: ACJfBovbwccjfccJ88s2jMn7A3St2xACqnPhKglwUbzXJeQkkgFxkrKnxnECA6UsbCGyY0gY6TsmyA== X-Received: by 10.84.179.193 with SMTP id b59mr4618688plc.12.1513719351449; Tue, 19 Dec 2017 13:35:51 -0800 (PST) Received: from jkicinski-Precision-T1700.netronome.com ([75.53.12.129]) by smtp.gmail.com with ESMTPSA id r62sm32371964pfi.184.2017.12.19.13.35.50 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 19 Dec 2017 13:35:50 -0800 (PST) From: Jakub Kicinski To: netdev@vger.kernel.org, davem@davemloft.net Cc: oss-drivers@netronome.com, jiri@resnulli.us, daniel@iogearbox.net, Jakub Kicinski Subject: [PATCH net-next (after merge)] netdevsim: bpf: align to cls_bpf changes Date: Tue, 19 Dec 2017 13:35:41 -0800 Message-Id: <20171219213541.1555-1-jakub.kicinski@netronome.com> X-Mailer: git-send-email 2.15.1 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org cls_bpf no longer takes care of offload tracking. Make sure netdevsim performs necessary checks. This fixes a warning caused by TC trying to remove a filter it has not added. Signed-off-by: Jakub Kicinski Reviewed-by: Quentin Monnet --- Dave, this will have to be applied to net-next as soon as the previous series comes in via net. netdevsim doesn't exist in net/master, so I can't fix it there :( I'm not sure how to handle this situation best... --- drivers/net/netdevsim/bpf.c | 25 ++++++++++++++----------- tools/testing/selftests/bpf/test_offload.py | 4 ++-- 2 files changed, 16 insertions(+), 13 deletions(-) diff --git a/drivers/net/netdevsim/bpf.c b/drivers/net/netdevsim/bpf.c index 7799942ed349..c977fece64a3 100644 --- a/drivers/net/netdevsim/bpf.c +++ b/drivers/net/netdevsim/bpf.c @@ -107,6 +107,7 @@ int nsim_bpf_setup_tc_block_cb(enum tc_setup_type type, struct tc_cls_bpf_offload *cls_bpf = type_data; struct bpf_prog *prog = cls_bpf->prog; struct netdevsim *ns = cb_priv; + struct bpf_prog *oldprog; if (type != TC_SETUP_CLSBPF || !tc_can_offload(ns->netdev) || @@ -114,25 +115,27 @@ int nsim_bpf_setup_tc_block_cb(enum tc_setup_type type, cls_bpf->common.chain_index) return -EOPNOTSUPP; - if (nsim_xdp_offload_active(ns)) - return -EBUSY; - if (!ns->bpf_tc_accept) return -EOPNOTSUPP; /* Note: progs without skip_sw will probably not be dev bound */ if (prog && !prog->aux->offload && !ns->bpf_tc_non_bound_accept) return -EOPNOTSUPP; - switch (cls_bpf->command) { - case TC_CLSBPF_REPLACE: - return nsim_bpf_offload(ns, prog, true); - case TC_CLSBPF_ADD: - return nsim_bpf_offload(ns, prog, false); - case TC_CLSBPF_DESTROY: - return nsim_bpf_offload(ns, NULL, true); - default: + if (cls_bpf->command != TC_CLSBPF_OFFLOAD) return -EOPNOTSUPP; + + oldprog = cls_bpf->oldprog; + + /* Don't remove if oldprog doesn't match driver's state */ + if (ns->bpf_offloaded != oldprog) { + oldprog = NULL; + if (!cls_bpf->prog) + return 0; + if (ns->bpf_offloaded) + return -EBUSY; } + + return nsim_bpf_offload(ns, cls_bpf->prog, oldprog); } int nsim_bpf_disable_tc(struct netdevsim *ns) diff --git a/tools/testing/selftests/bpf/test_offload.py b/tools/testing/selftests/bpf/test_offload.py index 3914f7a4585a..c940505c2978 100755 --- a/tools/testing/selftests/bpf/test_offload.py +++ b/tools/testing/selftests/bpf/test_offload.py @@ -647,8 +647,8 @@ samples = ["sample_ret0.o"] start_test("Test asking for TC offload of two filters...") sim.cls_bpf_add_filter(obj, da=True, skip_sw=True) - sim.cls_bpf_add_filter(obj, da=True, skip_sw=True) - # The above will trigger a splat until TC cls_bpf drivers are fixed + ret, _ = sim.cls_bpf_add_filter(obj, da=True, skip_sw=True, fail=False) + fail(ret == 0, "Managed to offload two TC filters at the same time") sim.tc_flush_filters(bound=2, total=2)