Received: by 2002:ac0:a591:0:0:0:0:0 with SMTP id m17-v6csp298796imm; Fri, 6 Jul 2018 20:23:48 -0700 (PDT) X-Google-Smtp-Source: AAOMgpdGNomUmvrIYtrqR9zwZIz8IwLIRGzP6H7oMk+RoxQMVue2w/xNYuS7zzOa4/u3KQ5VVu1T X-Received: by 2002:a17:902:2983:: with SMTP id h3-v6mr12557161plb.232.1530933828742; Fri, 06 Jul 2018 20:23:48 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1530933828; cv=none; d=google.com; s=arc-20160816; b=0y0H9UYXLpy+BofOqTUdkC5Kd3rx1NGdqyK+nGqUlt0v36kQI8XhanvEj2M3C+YCjX EXm2SV2RFnz+BGMkt/pXmSY4j90W3EHxCpzkmg3D/4b/EfVJBWQWlE6h7stAaYM549UU obJGC9DWuNUo2lJ9vyKq8DHMLvsxlWUIg3Zwgc/kQC03fnl8X70mcRz+9ykyAmBcBCIY CaMnJdHFfIgqJBE3frRgnDMgo6O8Sz/tuqxImW/RZCgwB5tr5BLztZj1trA7fx9pJMAD D2O3KUf05XHUrx+Qd8wYHfXK1GuodpuTGOt+xSJoSjJYgajHKMa1ocmsn+ZQoxeMI3eH +RSA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:cc:to:subject:message-id:date:from :references:in-reply-to:mime-version:dkim-signature :arc-authentication-results; bh=zIcH6RsX7uPocR+BriY98E7D8LuhySRc0eg+4miwd4I=; b=atLaugGwDFzNl1KYT2qH74MJh/GLkprFo64npraFq6nGIJCxPvDjPWBGui1rnczQVE hjGlHwu7AzoKTFsW3oR++G/ASqcpZ8Bdip8XpipjfQ0FkUY1nzDKGRE1TKJ5vTD6QhpJ YwzMzP/0jgWSld5BvW7Yr7FfI2zUt+0Oup57mxN0awqwooI7jL70spkNR/uXIL9CVXrj Fj3Wv/5QnhRotNpUFYymu4gxxcXhRU5ssIP3rBrpHqetSTSjikJjD9V/h4JTuhXhk5DF U+zbyMNse8ECuVhTYbG8QbLi5xBU8QTQz7cK+yVm7X/c2o0J6EqCKhizm2kQYWGgwehg 3f9A== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20161025 header.b=W9BhpTMK; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id b18-v6si9081768pge.666.2018.07.06.20.23.34; Fri, 06 Jul 2018 20:23:48 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@google.com header.s=20161025 header.b=W9BhpTMK; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932932AbeGGDW4 (ORCPT + 99 others); Fri, 6 Jul 2018 23:22:56 -0400 Received: from mail-io0-f193.google.com ([209.85.223.193]:42194 "EHLO mail-io0-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932713AbeGGDWv (ORCPT ); Fri, 6 Jul 2018 23:22:51 -0400 Received: by mail-io0-f193.google.com with SMTP id r24-v6so12518649ioh.9 for ; Fri, 06 Jul 2018 20:22:51 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=mime-version:in-reply-to:references:from:date:message-id:subject:to :cc; bh=zIcH6RsX7uPocR+BriY98E7D8LuhySRc0eg+4miwd4I=; b=W9BhpTMK1BQpZDZfJxRWmB0QJUa976Jfa5JDvCOBC2FIAJW0poxl1cUYHBU5NRFybC xx+AKZ83Tc1yNcNjbhWqxamwq6cf7XZmCkTCOFg1V6OJHmOprWG+SjFDf4qEeMRWyUR1 8ayPjzrnDtMyqa7g/nyYrtksSSrFxYc27vXXp/ZXxaucrd+/ORjhzrN6ji0ROeV1bzXy yz/B0e0JfzjgwYVqWOjHdgCiV/Qunhv2JoDxRRyNueCnVAoh/usoVqte4IeCI2PhDPhL nAD7EqLXgxQqMYDPsZyC4aAcOkwH7qwYgls6YfnQ+AYOTgjWh8rMxXsMBmHklIp1oFn1 4TEw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc; bh=zIcH6RsX7uPocR+BriY98E7D8LuhySRc0eg+4miwd4I=; b=Ryoy12dy06RLpJBxxfmHzQK1ptXSbZwK5o9x+CCiAEDKVTfWCdtNPsHEuoxDkz7vcw /A2lZQ688UZlo2VH2w1W0jqvjugBIBNnw208QStwM4gdXTCCg2pRX57RCy7u5vWS0zFA +qSVdLJthuWhASxRNkfND6vs2oe8hJ7i7kIDY1B5f8vCPsY69r3EB/Nqxy6rv+4E7x6c 7TZsRc7U0mfHUlkCFtYjo5+Yd3H9bjXs3x61RjTR5GnvPVlFwgCZS2tY5G9jVdqYUmXp p4a7m9S8YyaCgzA8xQWzIoXRakCgU8wCyIaIWmz776YbjwCzTnWY6e46b5Hhp8INld3T Nrkg== X-Gm-Message-State: APt69E1+4K09j5xDPogitfKEKxRlSwTIjo/j1AZcom5Lbyk5IuBIll47 Jlrka55slFZRf58s7tLf22HvOQifEmetT3oQnumDCA== X-Received: by 2002:a6b:b010:: with SMTP id z16-v6mr10432121ioe.206.1530933770354; Fri, 06 Jul 2018 20:22:50 -0700 (PDT) MIME-Version: 1.0 Received: by 2002:a4f:ba01:0:0:0:0:0 with HTTP; Fri, 6 Jul 2018 20:22:49 -0700 (PDT) In-Reply-To: <20180707025426.ssxipi7hsehoiuyo@ast-mbp.dhcp.thefacebook.com> References: <20180707015616.25988-1-dancol@google.com> <20180707025426.ssxipi7hsehoiuyo@ast-mbp.dhcp.thefacebook.com> From: Daniel Colascione Date: Fri, 6 Jul 2018 20:22:49 -0700 Message-ID: Subject: Re: [RFC] Add BPF_SYNCHRONIZE bpf(2) command To: Alexei Starovoitov Cc: Joel Fernandes , ast@fb.com, linux-kernel@vger.kernel.org, Tim Murray , daniel@iogearbox.net, netdev@vger.kernel.org Content-Type: text/plain; charset="UTF-8" Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Fri, Jul 6, 2018 at 7:54 PM, Alexei Starovoitov wrote: > On Fri, Jul 06, 2018 at 06:56:16PM -0700, Daniel Colascione wrote: >> BPF_SYNCHRONIZE waits for any BPF programs active at the time of >> BPF_SYNCHRONIZE to complete, allowing userspace to ensure atomicity of >> RCU data structure operations with respect to active programs. For >> example, userspace can update a map->map entry to point to a new map, >> use BPF_SYNCHRONIZE to wait for any BPF programs using the old map to >> complete, and then drain the old map without fear that BPF programs >> may still be updating it. >> >> Signed-off-by: Daniel Colascione >> --- >> include/uapi/linux/bpf.h | 1 + >> kernel/bpf/syscall.c | 14 ++++++++++++++ >> 2 files changed, 15 insertions(+) >> >> diff --git a/include/uapi/linux/bpf.h b/include/uapi/linux/bpf.h >> index b7db3261c62d..4365c50e8055 100644 >> --- a/include/uapi/linux/bpf.h >> +++ b/include/uapi/linux/bpf.h >> @@ -98,6 +98,7 @@ enum bpf_cmd { >> BPF_BTF_LOAD, >> BPF_BTF_GET_FD_BY_ID, >> BPF_TASK_FD_QUERY, >> + BPF_SYNCHRONIZE, >> }; >> >> enum bpf_map_type { >> diff --git a/kernel/bpf/syscall.c b/kernel/bpf/syscall.c >> index d10ecd78105f..60ec7811846e 100644 >> --- a/kernel/bpf/syscall.c >> +++ b/kernel/bpf/syscall.c >> @@ -2272,6 +2272,20 @@ SYSCALL_DEFINE3(bpf, int, cmd, union bpf_attr __user *, uattr, unsigned int, siz >> if (sysctl_unprivileged_bpf_disabled && !capable(CAP_SYS_ADMIN)) >> return -EPERM; >> >> + if (cmd == BPF_SYNCHRONIZE) { >> + if (uattr != NULL || size != 0) >> + return -EINVAL; >> + err = security_bpf(cmd, NULL, 0); >> + if (err < 0) >> + return err; >> + /* BPF programs are run with preempt disabled, so >> + * synchronize_sched is sufficient even with >> + * RCU_PREEMPT. >> + */ >> + synchronize_sched(); >> + return 0; > > I don't think it's necessary. sys_membarrier() can do this already > and some folks use it exactly for this use case. True --- implementation-wise, today. The point of the patch is to sort out contractual guarantees. membarrier isn't documented to have the BPF_SYNCHRONIZE effect right now, although it does. If we want to extend membarrier's contract, great, but that might make it more expensive than necessary for callers who, well, just want a memory barrier. It's worthwhile to have a dedicated BPF command for this task, especially considering the simplicity of the implementation.