Received: by 2002:ac0:a582:0:0:0:0:0 with SMTP id m2-v6csp609926imm; Fri, 12 Oct 2018 03:55:15 -0700 (PDT) X-Google-Smtp-Source: ACcGV62R2l8lTBSXItLVoT+EV6DnGZymQWd7x+sNxkcCGIq7BU2dGWRhFUrFSoGR0WYEddJbnJeC X-Received: by 2002:a65:66c9:: with SMTP id c9-v6mr5066325pgw.55.1539341715687; Fri, 12 Oct 2018 03:55:15 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1539341715; cv=none; d=google.com; s=arc-20160816; b=BZyWOr0j3eZqGXGIXqVd0TsEMa208fFklL3a5YIWbzALIroncws9FRddPvUxn6B6MP UU4pIuUnGlVe2s7PGiMHZTpDT7Qt30OWe/zsv5pp7x5PKBNbMLMZFFaF0sZPzKF+SOuF y1Okmd7J1kdsE3nzFYZdFU27Sr0Lz51HqcmjO4DGdUXIB2aW/dp/lAPznQBuBlM7zXM+ FTXgyt6+voG7mQCVC9rG9L3ePWjrcug58zA5Z4mtNTP40SFnvL7V8p07izS+q96Iat/X 3BRQss3PzyiAbakzBiECjnD5SqwV2Sph09a1TDokPv0fDnj3hqJhbnUnpiia03RMoFWp kS8Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:cc:to:from:subject:references :mime-version:message-id:in-reply-to:date:dkim-signature; bh=iJ0w2QmBeWzzXmgZ7T+6kotO8VQoLq5AqshPrpzTAw8=; b=qS1syh3zGpsR1BNl42+1NQwtl3OzVHo4XVb109mJBN7K24RReONm29KJ4zs1/frQcq DmAXXdiEapXwJGhDx5zbDYtHbBnEjoqQdIGYWa64qW+nuceK2d0BIezeoYH1Wy1FgDSF DdUE/gbKlo1WIxk/GPkY6NyVKGf2uUOa7wu/vdtkyKxO9J4lGyBUfXGzrcWfz324Z3zO Lpl5nRQw4dLShuoXzrYD5TiC3O2RK8XlZZquIV9tBxAP+M4SFRTfPUcjAYODkw+fP9UL rD+CfNtR12ZWDIL4PI7ILIqFsQx+24tt4wwLt9PgpwBNgCKoDOdyQc2YgI0kg6Kn7NsA PxWg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20161025 header.b="Q5/T4GfT"; 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 j15-v6si866784pgi.552.2018.10.12.03.55.00; Fri, 12 Oct 2018 03:55:15 -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="Q5/T4GfT"; 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 S1728078AbeJLS0a (ORCPT + 99 others); Fri, 12 Oct 2018 14:26:30 -0400 Received: from mail-yw1-f73.google.com ([209.85.161.73]:56894 "EHLO mail-yw1-f73.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727732AbeJLS0a (ORCPT ); Fri, 12 Oct 2018 14:26:30 -0400 Received: by mail-yw1-f73.google.com with SMTP id i79-v6so6813702ywc.23 for ; Fri, 12 Oct 2018 03:54:39 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=date:in-reply-to:message-id:mime-version:references:subject:from:to :cc; bh=iJ0w2QmBeWzzXmgZ7T+6kotO8VQoLq5AqshPrpzTAw8=; b=Q5/T4GfTAwtPDbwyWBdriWdM8m2pGkbJshMnLNOatEaEloUfO+3f5+xUvkFo/2VA5q vAxF51cFY3HY0cYuQyti3Avrci2kbjpFrULPr07B+ZLVbdfqcJWg7+PzanA3seDtlu4y YeSevBmE52zK2m8DTj4RqspkmA2cRvEvGGIip9G7Ppkfg1NfnAe3b3zh9H1Jx07M3SEj XXhCvaUaQ/73BaVvGVT/4SHWeujyNCXDAfJPSCcpbQjrr8L1hlKmEzhZfywLzAbLINId 5Ouh3tutwELqNsYFHHRXahWucR1LqMYwH2swGOEtXVryV2Xua/5bg4VGEsqJqymClunw pY/A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=iJ0w2QmBeWzzXmgZ7T+6kotO8VQoLq5AqshPrpzTAw8=; b=lHcriVx3CrEeckg1FUHU+YzsZH7bzMJu7aPyh4i5vlNvBb2YsMda1qDTpWxy+JU/A2 cJCw3UifcFKeMlVfBsPDvKvkREjnSdkXHNdSS66evJRyBi6SpET5qjX+cojzLcxsBK+q ch4oE7WjLfQUrEuTh9BMkSo3CUTgs59uztSkTeXKDMQYHW70NWTajg3NpEAmLYua2jlG Tc41DcZZ8P6hBN/aRRpXLzvmmTcLb44rJWJPSYkEPjlZOVlqnqSG2cy3zk+gjgCxjMyS 3Au8fsldOMLumdgj3Dyg+z4QnnuhKenLmyKuqIcUUCMMZE5rz2P9kv7dahMan1xQWEwt ekpw== X-Gm-Message-State: ABuFfohXNhrQ10Fl01/gB0ecmDJqz3JT9BNlsubh6DUEj0znNBDsXJZ9 y9aBFHiANCQ+iXia9Q+sknuL6+KyWkA= X-Received: by 2002:a25:844c:: with SMTP id r12-v6mr2984914ybm.35.1539341678744; Fri, 12 Oct 2018 03:54:38 -0700 (PDT) Date: Fri, 12 Oct 2018 03:54:27 -0700 In-Reply-To: <20180816040145.gqzqicab4s6kcbye@ast-mbp.dhcp.thefacebook.com> Message-Id: <20181012105427.243779-1-dancol@google.com> Mime-Version: 1.0 References: <20180816040145.gqzqicab4s6kcbye@ast-mbp.dhcp.thefacebook.com> X-Mailer: git-send-email 2.19.0.605.g01d371f741-goog Subject: [PATCH v4] Wait for running BPF programs when updating map-in-map From: Daniel Colascione To: joelaf@google.com Cc: linux-kernel@vger.kernel.org, timmurray@google.com, netdev@vger.kernel.org, Alexei Starovoitov , Lorenzo Colitti , Chenbo Feng , Mathieu Desnoyers , Alexei Starovoitov , Daniel Borkmann , Daniel Colascione 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 The map-in-map frequently serves as a mechanism for atomic snapshotting of state that a BPF program might record. The current implementation is dangerous to use in this way, however, since userspace has no way of knowing when all programs that might have retrieved the "old" value of the map may have completed. This change ensures that map update operations on map-in-map map types always wait for all references to the old map to drop before returning to userspace. Signed-off-by: Daniel Colascione --- kernel/bpf/syscall.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/kernel/bpf/syscall.c b/kernel/bpf/syscall.c index 8339d81cba1d..d7c16ae1e85a 100644 --- a/kernel/bpf/syscall.c +++ b/kernel/bpf/syscall.c @@ -741,6 +741,18 @@ static int map_lookup_elem(union bpf_attr *attr) return err; } +static void maybe_wait_bpf_programs(struct bpf_map *map) +{ + /* Wait for any running BPF programs to complete so that + * userspace, when we return to it, knows that all programs + * that could be running use the new map value. + */ + if (map->map_type == BPF_MAP_TYPE_HASH_OF_MAPS || + map->map_type == BPF_MAP_TYPE_ARRAY_OF_MAPS) { + synchronize_rcu(); + } +} + #define BPF_MAP_UPDATE_ELEM_LAST_FIELD flags static int map_update_elem(union bpf_attr *attr) @@ -831,6 +843,7 @@ static int map_update_elem(union bpf_attr *attr) } __this_cpu_dec(bpf_prog_active); preempt_enable(); + maybe_wait_bpf_programs(map); out: free_value: kfree(value); @@ -883,6 +896,7 @@ static int map_delete_elem(union bpf_attr *attr) rcu_read_unlock(); __this_cpu_dec(bpf_prog_active); preempt_enable(); + maybe_wait_bpf_programs(map); out: kfree(key); err_put: -- 2.19.0.605.g01d371f741-goog