diff options
Diffstat (limited to 'net/unix/garbage.c')
| -rw-r--r-- | net/unix/garbage.c | 14 | 
1 files changed, 11 insertions, 3 deletions
| diff --git a/net/unix/garbage.c b/net/unix/garbage.c index 12e2ddaf887f..d45d5366115a 100644 --- a/net/unix/garbage.c +++ b/net/unix/garbage.c @@ -192,8 +192,11 @@ void wait_for_unix_gc(void)  {  	/* If number of inflight sockets is insane,  	 * force a garbage collect right now. +	 * Paired with the WRITE_ONCE() in unix_inflight(), +	 * unix_notinflight() and gc_in_progress().  	 */ -	if (unix_tot_inflight > UNIX_INFLIGHT_TRIGGER_GC && !gc_in_progress) +	if (READ_ONCE(unix_tot_inflight) > UNIX_INFLIGHT_TRIGGER_GC && +	    !READ_ONCE(gc_in_progress))  		unix_gc();  	wait_event(unix_gc_wait, gc_in_progress == false);  } @@ -213,7 +216,9 @@ void unix_gc(void)  	if (gc_in_progress)  		goto out; -	gc_in_progress = true; +	/* Paired with READ_ONCE() in wait_for_unix_gc(). */ +	WRITE_ONCE(gc_in_progress, true); +  	/* First, select candidates for garbage collection.  Only  	 * in-flight sockets are considered, and from those only ones  	 * which don't have any external reference. @@ -299,7 +304,10 @@ void unix_gc(void)  	/* All candidates should have been detached by now. */  	BUG_ON(!list_empty(&gc_candidates)); -	gc_in_progress = false; + +	/* Paired with READ_ONCE() in wait_for_unix_gc(). */ +	WRITE_ONCE(gc_in_progress, false); +  	wake_up(&unix_gc_wait);   out: |