From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-16.6 required=3.0 tests=DKIMWL_WL_MED,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH, MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_PASS,USER_AGENT_GIT,USER_IN_DEF_DKIM_WL autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id E6768C43381 for ; Tue, 19 Feb 2019 18:54:21 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id AF4C12147C for ; Tue, 19 Feb 2019 18:54:21 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="dnAnp+go" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726630AbfBSSyU (ORCPT ); Tue, 19 Feb 2019 13:54:20 -0500 Received: from mail-pl1-f201.google.com ([209.85.214.201]:38473 "EHLO mail-pl1-f201.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725963AbfBSSyU (ORCPT ); Tue, 19 Feb 2019 13:54:20 -0500 Received: by mail-pl1-f201.google.com with SMTP id x11so3177443pln.5 for ; Tue, 19 Feb 2019 10:54:20 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=date:message-id:mime-version:subject:from:to:cc; bh=c3ZeF62tr0OAovKSBru9ofmMwiVnddb5t+pQItcrkEQ=; b=dnAnp+goDjP029xyzPXwzL2ab1d5yf5SzS5k1fLOxGJEJnVfJ3oTdqAyAaSVjnYrXB RJLXI3VVe17GFItg1HT4o45//2ei/ju9lu73KNTSMx6D8RXLGnF9U8Zq3WiaRdMKbbyJ R/vh49QQD9nQlTtXnHqAcpVItQG/9MdRYn8xQxJjY8CS1ic7c7o7n5ymVh7MF0sDexBk d0VmI/mAWKZrEj/CAOblVPD5boe2prKXtcdizvlXU1JwZ/K06Xs1xw43P/na2+RrQ1Tb H9tZinNBsenH/JSAkWLNQ5WcK8yYNWsM6m6ZSFr7qzii8wMwOEKofZCNba5QqvIiMGvx j8TQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:message-id:mime-version:subject:from:to:cc; bh=c3ZeF62tr0OAovKSBru9ofmMwiVnddb5t+pQItcrkEQ=; b=krT4CMzbvKoHtIt/7I90gGM7LZhFWEZZVluFGgdllXZA1tr05hZUwIIW48JMJJ+C1Q OlkTqk5BzaE05H3w8qIAXP3NcNpI+BRRs5Gt7BeljCFVa5LWntuJ235gd5Zqo/XiVyC8 MGK7VVLoaKfzocYOmUBEtfDkQEKxQri1KWm2ZB5ziSlhesVAKmoWPrYAreRPfBtrkSlq D1DOMJSZK85L6hu5E8ObtSDHTuCrpV959W3C3bkgvILI5Bf+mCjAoLBGlsp3CZ9lvSsh qkSQZl659nIJuQ1WeUgTu6mgDzh+z15z3pB2qNA63P8PoQgbKHIXTg1V4j/2vTmpNrCy TfeA== X-Gm-Message-State: AHQUAuYBDtB0HMOYB3AzMCw8Uc4CZJxF4x6E3OY8Ra2re00mobS05GjP rJjn3F2g1KqCBFq6q9cHysvYcZxQs0aIKEQkmz1LGO6SblK4ykRe6yjSh9V+YE5q9Rr5UcaHtA2 7xXdwiK2XtHc3H/K99k4OjvTs7hLwkiBzHuTdAYvYmjlux/cI85W9ng== X-Google-Smtp-Source: AHgI3IafaGX1dDoNqx0y9qmW/vOMJIUpp4eFQIw+MvU8RDRcLWVDAZy1MI/4drUqjDEGjfmFHfHpre8= X-Received: by 2002:a62:dd16:: with SMTP id w22mr11203672pff.4.1550602459678; Tue, 19 Feb 2019 10:54:19 -0800 (PST) Date: Tue, 19 Feb 2019 10:54:17 -0800 Message-Id: <20190219185417.145696-1-sdf@google.com> Mime-Version: 1.0 X-Mailer: git-send-email 2.21.0.rc0.258.g878e2cd30e-goog Subject: [PATCH bpf-next] bpf/test_run: fix unkillable BPF_PROG_TEST_RUN for flow dissector From: Stanislav Fomichev To: netdev@vger.kernel.org Cc: davem@davemloft.net, ast@kernel.org, daniel@iogearbox.net, Stanislav Fomichev , syzbot Content-Type: text/plain; charset="UTF-8" Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Syzbot found out that running BPF_PROG_TEST_RUN with repeat=0xffffffff makes process unkillable. The problem is that when CONFIG_PREEMPT is enabled, we never see need_resched() return true. This is due to the fact that preempt_enable() (which we do in bpf_test_run_one on each iteration) now handles resched if it's needed. Let's disable preemption for the whole run, not per test. In this case we can properly see whether resched is needed. Let's also properly return -EINTR to the userspace in case of a signal interrupt. This is a follow up for a recently fixed issue in bpf_test_run, see commit df1a2cb7c74b ("bpf/test_run: fix unkillable BPF_PROG_TEST_RUN"). Reported-by: syzbot Signed-off-by: Stanislav Fomichev --- net/bpf/test_run.c | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/net/bpf/test_run.c b/net/bpf/test_run.c index 2c5172b33209..619655db8d9e 100644 --- a/net/bpf/test_run.c +++ b/net/bpf/test_run.c @@ -293,31 +293,45 @@ int bpf_prog_test_run_flow_dissector(struct bpf_prog *prog, if (!repeat) repeat = 1; + rcu_read_lock(); + preempt_disable(); time_start = ktime_get_ns(); for (i = 0; i < repeat; i++) { - preempt_disable(); - rcu_read_lock(); retval = __skb_flow_bpf_dissect(prog, skb, &flow_keys_dissector, &flow_keys); - rcu_read_unlock(); - preempt_enable(); + + if (signal_pending(current)) { + preempt_enable(); + rcu_read_unlock(); + + ret = -EINTR; + goto out; + } if (need_resched()) { - if (signal_pending(current)) - break; time_spent += ktime_get_ns() - time_start; + preempt_enable(); + rcu_read_unlock(); + cond_resched(); + + rcu_read_lock(); + preempt_disable(); time_start = ktime_get_ns(); } } time_spent += ktime_get_ns() - time_start; + preempt_enable(); + rcu_read_unlock(); + do_div(time_spent, repeat); duration = time_spent > U32_MAX ? U32_MAX : (u32)time_spent; ret = bpf_test_finish(kattr, uattr, &flow_keys, sizeof(flow_keys), retval, duration); +out: kfree_skb(skb); kfree(sk); return ret; -- 2.21.0.rc0.258.g878e2cd30e-goog