From mboxrd@z Thu Jan 1 00:00:00 1970 From: Alexei Starovoitov Subject: Re: [PATCH v10 01/12] bpf: add bpf_prog_add api for bulk prog refcnt Date: Tue, 19 Jul 2016 14:46:09 -0700 Message-ID: <20160719214608.GD64618@ast-mbp.thefacebook.com> References: <1468955817-10604-1-git-send-email-bblanco@plumgrid.com> <1468955817-10604-2-git-send-email-bblanco@plumgrid.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Cc: davem@davemloft.net, netdev@vger.kernel.org, Jamal Hadi Salim , Saeed Mahameed , Martin KaFai Lau , Jesper Dangaard Brouer , Ari Saha , Or Gerlitz , john.fastabend@gmail.com, hannes@stressinduktion.org, Thomas Graf , Tom Herbert , Daniel Borkmann , Tariq Toukan To: Brenden Blanco Return-path: Received: from mail-pa0-f65.google.com ([209.85.220.65]:35808 "EHLO mail-pa0-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751720AbcGSVqO (ORCPT ); Tue, 19 Jul 2016 17:46:14 -0400 Received: by mail-pa0-f65.google.com with SMTP id cf3so1981142pad.2 for ; Tue, 19 Jul 2016 14:46:13 -0700 (PDT) Content-Disposition: inline In-Reply-To: <1468955817-10604-2-git-send-email-bblanco@plumgrid.com> Sender: netdev-owner@vger.kernel.org List-ID: On Tue, Jul 19, 2016 at 12:16:46PM -0700, Brenden Blanco wrote: > 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 > --- > 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); > +} that extension turned out to be smaller than I thought :) Acked-by: Alexei Starovoitov