Subject: Re: linux-next: build failure after merge of the rcu tree

From: Stephen Rothwell <[email-masked]>
Date: Fri, 17 Jan 2020 14:09:09 +1100

Hi all,

On Thu, 12 Dec 2019 13:45:16 +1100 Stephen Rothwell <[email-masked]> wrote:
>
> After merging the rcu tree, today's linux-next build (x86_64 allmodconfig)
> failed like this:
> 
> drivers/misc/watch_queue.c: In function 'watch_queue_set_filter':
> drivers/misc/watch_queue.c:526:2: error: implicit declaration of function 'rcu_swap_protected' [-Werror=implicit-function-declaration]
>   526 |  rcu_swap_protected(wqueue->filter, wfilter,
>       |  ^~~~~~~~~~~~~~~~~~
> 
> Caused by commit
> 
>   af8c9224182e ("rcu: Remove rcu_swap_protected()")
> 
> interacting with commit
> 
>   fe78d401ca6b ("General notification queue with user mmap()'able ring buffer")
> 
> from the keys tree.
> 
> I have added the following merge fix patch for today:
> 
> From: Stephen Rothwell <[email-masked]>
> Date: Thu, 12 Dec 2019 13:37:52 +1100
> Subject: [PATCH] rcu: fix up for "Remove rcu_swap_protected()"
> 
> Signed-off-by: Stephen Rothwell <[email-masked]>
> ---
>  drivers/misc/watch_queue.c | 4 ++--
>  1 file changed, 2 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/misc/watch_queue.c b/drivers/misc/watch_queue.c
> index b3fc59b4ef6c..a4a77ec977ac 100644
> --- a/drivers/misc/watch_queue.c
> +++ b/drivers/misc/watch_queue.c
> @@ -523,8 +523,8 @@ static long watch_queue_set_filter(struct inode *inode,
>  	kfree(tf);
>  set:
>  	inode_lock(inode);
> -	rcu_swap_protected(wqueue->filter, wfilter,
> -			   lockdep_is_held(&inode->i_rwsem));
> +	wfilter = rcu_replace_pointer(wqueue->filter, wfilter,
> +				      lockdep_is_held(&inode->i_rwsem));
>  	inode_unlock(inode);
>  	if (wfilter)
>  		kfree_rcu(wfilter, rcu);

This has bee replaced with this patch:

From: Stephen Rothwell <[email-masked]>
Date: Thu, 12 Dec 2019 13:37:52 +1100
Subject: [PATCH] rcu: fix up for "Remove rcu_swap_protected()"

Signed-off-by: Stephen Rothwell <[email-masked]>
---
 kernel/watch_queue.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/kernel/watch_queue.c b/kernel/watch_queue.c
index d48f422f391a..f195cbbbb3d3 100644
--- a/kernel/watch_queue.c
+++ b/kernel/watch_queue.c
@@ -354,8 +354,8 @@ long watch_queue_set_filter(struct pipe_inode_info *pipe,
 	kfree(tf);
 set:
 	pipe_lock(pipe);
-	rcu_swap_protected(wqueue->filter, wfilter,
-			   lockdep_is_held(&pipe->mutex));
+	wfilter = rcu_replace_pointer(wqueue->filter, wfilter,
+				      lockdep_is_held(&pipe->mutex));
 	pipe_unlock(pipe);
 	if (wfilter)
 		kfree_rcu(wfilter, rcu);

-- 
Cheers,
Stephen Rothwell