From patchwork Tue Jul 19 19:16:46 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Brenden Blanco X-Patchwork-Id: 650390 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3rv8v80bJ9z9sf9 for ; Wed, 20 Jul 2016 05:17:40 +1000 (AEST) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=plumgrid-com.20150623.gappssmtp.com header.i=@plumgrid-com.20150623.gappssmtp.com header.b=zMUEvIsw; dkim-atps=neutral Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751905AbcGSTRb (ORCPT ); Tue, 19 Jul 2016 15:17:31 -0400 Received: from mail-pa0-f52.google.com ([209.85.220.52]:34432 "EHLO mail-pa0-f52.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751507AbcGSTRY (ORCPT ); Tue, 19 Jul 2016 15:17:24 -0400 Received: by mail-pa0-f52.google.com with SMTP id fi15so9754946pac.1 for ; Tue, 19 Jul 2016 12:17:23 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=plumgrid-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=h8Plr19lSevIuG6PzoADsDBxUdA6QvCBdEWtXCMEe2M=; b=zMUEvIswEqlwWQUA5YYVrn+6QvhJyqx9MmYLuSN2WEBdJRTlWTVH1B6BWnk8+n5tOr hDz6vIP7dvtwkhBO71U7eppB80XuUucbxvUWOuHfT137Y41ex3N7Kiz/5Qr7pvIws/Ma +nh4h8hu1OIeW0ivUQAEtlivpAANaXIPB6oMvf6xZBzG0vhTIQnEpi5GmkEvy54x9FLS gcjt/VwVd5814NAr8+njITCn0EDgCs1kVQtWJz+MkyYxwOGiUYoh3piBV6XqWx3K78BO Ry9sm3vdlOYhR/3T+8SERAkZKDhelYcQ/7huiFPHy4fJuyNUILqGBGkkcwxn0Zd7rPjh /QXg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=h8Plr19lSevIuG6PzoADsDBxUdA6QvCBdEWtXCMEe2M=; b=XR9dRs6Mx5nhFUvTFh8B6PHP+GHXRMHQxZ4DioleIBaGgxyknp4q9KEP8DzAvqtapE ORA/njsqfegiCo5WuJIbMR58ffosyMRbUiM6JmUYsL0kDTwDLVgls1LPgzvR5e4W+CHZ c112kOTIgZ+A6LeErucBrmOqW791dDRZKzeBi65grQAvdPmGD9h3d4qA9woE2phHLhzh YKPGOOEOj1OqPmwTxXNxesPkkLV1dfNzv3TR1HeN+uiA0PdARDfyOmQ2FrH5JN3dx3RK Y3kLTvOizVUh0419pwjAG+7NhI2QbT5TtHVs18vBt1yPJGLTDq4B+TzX9j/EVcTXlRwC hK6Q== X-Gm-Message-State: ALyK8tIxJMo758T0niPDfYEfTNN9oWrf4f60qdmsIP2eYaxXFAKj0E98T/wqaVGNakBUAULH X-Received: by 10.66.235.163 with SMTP id un3mr67539160pac.93.1468955843395; Tue, 19 Jul 2016 12:17:23 -0700 (PDT) Received: from iovisor-test1.plumgrid.com ([12.97.19.201]) by smtp.gmail.com with ESMTPSA id d5sm6644727pfc.4.2016.07.19.12.17.22 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 19 Jul 2016 12:17:22 -0700 (PDT) From: Brenden Blanco To: davem@davemloft.net, netdev@vger.kernel.org Cc: Brenden Blanco , Jamal Hadi Salim , Saeed Mahameed , Martin KaFai Lau , Jesper Dangaard Brouer , Ari Saha , Alexei Starovoitov , Or Gerlitz , john.fastabend@gmail.com, hannes@stressinduktion.org, Thomas Graf , Tom Herbert , Daniel Borkmann , Tariq Toukan Subject: [PATCH v10 01/12] bpf: add bpf_prog_add api for bulk prog refcnt Date: Tue, 19 Jul 2016 12:16:46 -0700 Message-Id: <1468955817-10604-2-git-send-email-bblanco@plumgrid.com> X-Mailer: git-send-email 2.8.2 In-Reply-To: <1468955817-10604-1-git-send-email-bblanco@plumgrid.com> References: <1468955817-10604-1-git-send-email-bblanco@plumgrid.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org A subsystem may need to store many copies of a bpf program, each deserving its own reference. Rather than requiring the caller to loop one by one (with possible mid-loop failure), add a bulk bpf_prog_add api. Signed-off-by: Brenden Blanco Acked-by: Alexei Starovoitov --- include/linux/bpf.h | 1 + kernel/bpf/syscall.c | 12 +++++++++--- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/include/linux/bpf.h b/include/linux/bpf.h index c13e92b..75a5ae6 100644 --- a/include/linux/bpf.h +++ b/include/linux/bpf.h @@ -224,6 +224,7 @@ void bpf_register_map_type(struct bpf_map_type_list *tl); struct bpf_prog *bpf_prog_get(u32 ufd); struct bpf_prog *bpf_prog_get_type(u32 ufd, enum bpf_prog_type type); +struct bpf_prog *bpf_prog_add(struct bpf_prog *prog, int i); struct bpf_prog *bpf_prog_inc(struct bpf_prog *prog); void bpf_prog_put(struct bpf_prog *prog); diff --git a/kernel/bpf/syscall.c b/kernel/bpf/syscall.c index 96d938a..228f962 100644 --- a/kernel/bpf/syscall.c +++ b/kernel/bpf/syscall.c @@ -670,14 +670,20 @@ static struct bpf_prog *____bpf_prog_get(struct fd f) return f.file->private_data; } -struct bpf_prog *bpf_prog_inc(struct bpf_prog *prog) +struct bpf_prog *bpf_prog_add(struct bpf_prog *prog, int i) { - if (atomic_inc_return(&prog->aux->refcnt) > BPF_MAX_REFCNT) { - atomic_dec(&prog->aux->refcnt); + if (atomic_add_return(i, &prog->aux->refcnt) > BPF_MAX_REFCNT) { + atomic_sub(i, &prog->aux->refcnt); return ERR_PTR(-EBUSY); } return prog; } +EXPORT_SYMBOL_GPL(bpf_prog_add); + +struct bpf_prog *bpf_prog_inc(struct bpf_prog *prog) +{ + return bpf_prog_add(prog, 1); +} static struct bpf_prog *__bpf_prog_get(u32 ufd, enum bpf_prog_type *type) {