Commit 552d0e17 authored by Jeff Layton's avatar Jeff Layton Committed by Chuck Lever
Browse files

sunrpc: convert queue_wait from global to per-cache-detail waitqueue



The queue_wait waitqueue is currently a file-scoped global, so a
wake_up for one cache_detail wakes pollers on all caches. Convert it
to a per-cache-detail field so that only pollers on the relevant cache
are woken.

Signed-off-by: default avatarJeff Layton <jlayton@kernel.org>
Signed-off-by: default avatarChuck Lever <chuck.lever@oracle.com>
parent 17c1d665
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@
#include <linux/atomic.h>
#include <linux/kstrtox.h>
#include <linux/proc_fs.h>
#include <linux/wait.h>

/*
 * Each cache requires:
@@ -114,6 +115,7 @@ struct cache_detail {
	/* fields for communication over channel */
	struct list_head	queue;
	spinlock_t		queue_lock;
	wait_queue_head_t	queue_wait;

	atomic_t		writers;		/* how many time is /channel open */
	time64_t		last_close;		/* if no writers, when did last close */
+3 −4
Original line number Diff line number Diff line
@@ -401,6 +401,7 @@ void sunrpc_init_cache_detail(struct cache_detail *cd)
	spin_lock_init(&cd->hash_lock);
	INIT_LIST_HEAD(&cd->queue);
	spin_lock_init(&cd->queue_lock);
	init_waitqueue_head(&cd->queue_wait);
	spin_lock(&cache_list_lock);
	cd->nextcheck = 0;
	cd->entries = 0;
@@ -970,8 +971,6 @@ static ssize_t cache_write(struct file *filp, const char __user *buf,
	return ret;
}

static DECLARE_WAIT_QUEUE_HEAD(queue_wait);

static __poll_t cache_poll(struct file *filp, poll_table *wait,
			       struct cache_detail *cd)
{
@@ -979,7 +978,7 @@ static __poll_t cache_poll(struct file *filp, poll_table *wait,
	struct cache_reader *rp = filp->private_data;
	struct cache_queue *cq;

	poll_wait(filp, &queue_wait, wait);
	poll_wait(filp, &cd->queue_wait, wait);

	/* alway allow write */
	mask = EPOLLOUT | EPOLLWRNORM;
@@ -1259,7 +1258,7 @@ static int cache_pipe_upcall(struct cache_detail *detail, struct cache_head *h)
		/* Lost a race, no longer PENDING, so don't enqueue */
		ret = -EAGAIN;
	spin_unlock(&detail->queue_lock);
	wake_up(&queue_wait);
	wake_up(&detail->queue_wait);
	if (ret == -EAGAIN) {
		kfree(buf);
		kfree(crq);