From: "Paul E. McKenney" <paulmck@linux.vnet.ibm.com>
To: Petko Manolov <petkan@mip-labs.com>
Cc: Mimi Zohar <zohar@linux.vnet.ibm.com>,
mdb@juniper.net, linux-security-module@vger.kernel.org,
rostedt@goodmis.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH] Introduces generic __list_splice_init_rcu();
Date: Fri, 9 Oct 2015 11:38:34 -0700 [thread overview]
Message-ID: <20151009183834.GA23998@linux.vnet.ibm.com> (raw)
In-Reply-To: <20151009182638.GX3910@linux.vnet.ibm.com>
On Fri, Oct 09, 2015 at 11:26:38AM -0700, Paul E. McKenney wrote:
> On Thu, Oct 08, 2015 at 04:02:19PM -0400, Mimi Zohar wrote:
> > On Tue, 2015-10-06 at 11:37 -0700, Paul E. McKenney wrote:
> > > On Sun, Sep 27, 2015 at 06:10:28PM +0300, Petko Manolov wrote:
> > > > __list_splice_init_rcu() can be used to splice lists forming both stack and
> > > > queue structures, depending on its arguments. It is based on the initial
> > > > list_splice_init_rcu() with a few minor modifications to help abstracting it.
> > > >
> > > > Signed-off-by: Petko Manolov <petkan@mip-labs.com>
> > >
> > > At first glance, this looks sane.
> > >
> > > But who is using the new list_splice_tail_init_rcu() function?
> >
> > Hi, Paul. Up to now a single policy was loaded, normally in the
> > initramfs, and never changed. Petko is adding support to extend the
> > policy rules. The additional policies would be appended to the existing
> > list, only after verifying the new set of rules are good.
> >
> > list.h contains list_splice() and list_splice_tail(), but the RCU
> > equivalent functions don't exist.
>
> OK, I have queued Petko's patch, updating the subject and changelog
> as shown below. I added you as Cc. If testing goes well, I will
> submit this for v4.5 (the merge window after next).
And reviewing the applied patch, this does need some help. Please see
below, fix, and resubmit.
Thanx, Paul
> ------------------------------------------------------------------------
>
> commit a7916adc2cc47e918ee66b9225c00d585ccd3a91
> Author: Petko Manolov <petkan@mip-labs.com>
> Date: Sun Sep 27 18:10:28 2015 +0300
>
> Introduce generic list_splice_tail_init_rcu()
>
> The list_splice_init_rcu() can be used as a stack onto which full lists
> are pushed, but queue-like behavior is now needed by some security
> policies. This requires a list_splice_tail_init_rcu().
>
> This commit therefore supplies a list_splice_tail_init_rcu() by
> pulling code common it and to list_splice_init_rcu() into a new
> __list_splice_init_rcu() function. This new function is based on the
> existing list_splice_init_rcu() implementation.
>
> Signed-off-by: Petko Manolov <petkan@mip-labs.com>
> Cc: Mimi Zohar <zohar@linux.vnet.ibm.com>
> Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
>
> diff --git a/include/linux/rculist.h b/include/linux/rculist.h
> index 5ed540986019..bbde2837d6be 100644
> --- a/include/linux/rculist.h
> +++ b/include/linux/rculist.h
> @@ -178,33 +178,13 @@ static inline void list_replace_rcu(struct list_head *old,
> old->prev = LIST_POISON2;
> }
>
> -/**
> - * list_splice_init_rcu - splice an RCU-protected list into an existing list.
> - * @list: the RCU-protected list to splice
> - * @head: the place in the list to splice the first list into
> - * @sync: function to sync: synchronize_rcu(), synchronize_sched(), ...
> - *
> - * @head can be RCU-read traversed concurrently with this function.
> - *
> - * Note that this function blocks.
> - *
> - * Important note: the caller must take whatever action is necessary to
> - * prevent any other updates to @head. In principle, it is possible
> - * to modify the list as soon as sync() begins execution.
> - * If this sort of thing becomes necessary, an alternative version
> - * based on call_rcu() could be created. But only if -really-
> - * needed -- there is no shortage of RCU API members.
> - */
> -static inline void list_splice_init_rcu(struct list_head *list,
> - struct list_head *head,
> - void (*sync)(void))
We need a header comment saying what this does. It should not be docbook,
but it does need to be there.
> +static inline void __list_splice_init_rcu(struct list_head *list,
> + struct list_head *prev,
> + struct list_head *next,
> + void (*sync)(void))
> {
> struct list_head *first = list->next;
> struct list_head *last = list->prev;
> - struct list_head *at = head->next;
> -
> - if (list_empty(list))
> - return;
>
> /*
> * "first" and "last" tracking list, so initialize it. RCU readers
> @@ -231,10 +211,46 @@ static inline void list_splice_init_rcu(struct list_head *list,
> * this function.
> */
>
> - last->next = at;
> - rcu_assign_pointer(list_next_rcu(head), first);
> - first->prev = head;
> - at->prev = last;
> + last->next = next;
> + rcu_assign_pointer(list_next_rcu(prev), first);
> + first->prev = prev;
> + next->prev = last;
> +}
> +
> +/**
> + * list_splice_init_rcu - splice an RCU-protected list into an existing list.
> + * @list: the RCU-protected list to splice
> + * @head: the place in the list to splice the first list into
> + * @sync: function to sync: synchronize_rcu(), synchronize_sched(), ...
> + *
> + * @head can be RCU-read traversed concurrently with this function.
> + *
> + * Note that this function blocks.
> + *
> + * Important note: the caller must take whatever action is necessary to
> + * prevent any other updates to @head. In principle, it is possible
> + * to modify the list as soon as sync() begins execution.
> + * If this sort of thing becomes necessary, an alternative version
> + * based on call_rcu() could be created. But only if -really-
> + * needed -- there is no shortage of RCU API members.
> + */
> +static inline void list_splice_init_rcu(struct list_head *list,
> + struct list_head *head,
> + void (*sync)(void))
> +{
> + if (!list_empty(list))
> + __list_splice_init_rcu(list, head, head->next, sync);
> +}
> +
> +/**
> + * list_splice_tail_init_rcu - same as above, but creates a queue
> + */
This is not sufficient. We do need docbook, but we need filled-out
docbook. The output of docbook is not guaranteed to always spit
out list_splice_init_rcu() and list_splice_tail_init_rcu() in that
order, after all.
> +static inline void list_splice_tail_init_rcu(struct list_head *list,
> + struct list_head *head,
> + void (*sync)(void))
> +{
> + if (!list_empty(list))
> + __list_splice_init_rcu(list, head->prev, head, sync);
> }
>
> /**
prev parent reply other threads:[~2015-10-09 18:38 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <1443366628-19897-1-git-send-email-petkan@mip-labs.com>
[not found] ` <1443366628-19897-2-git-send-email-petkan@mip-labs.com>
[not found] ` <20151006183701.GQ3910@linux.vnet.ibm.com>
[not found] ` <1444334539.2503.119.camel@linux.vnet.ibm.com>
2015-10-09 18:26 ` Paul E. McKenney
2015-10-09 18:38 ` Paul E. McKenney [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20151009183834.GA23998@linux.vnet.ibm.com \
--to=paulmck@linux.vnet.ibm.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-security-module@vger.kernel.org \
--cc=mdb@juniper.net \
--cc=petkan@mip-labs.com \
--cc=rostedt@goodmis.org \
--cc=zohar@linux.vnet.ibm.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
Powered by JetHome