Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 14 Aug 2015 14:31:54 +0300
From:      Andriy Gapon <avg@FreeBSD.org>
To:        Alexander Motin <mav@FreeBSD.org>, src-committers@FreeBSD.org, svn-src-all@FreeBSD.org, svn-src-head@FreeBSD.org
Subject:   Re: svn commit: r286623 - head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs
Message-ID:  <55CDD1AA.40008@FreeBSD.org>
In-Reply-To: <201508110918.t7B9IpGA039354@repo.freebsd.org>
References:  <201508110918.t7B9IpGA039354@repo.freebsd.org>

next in thread | previous in thread | raw e-mail | index | archive | help
On 11/08/2015 12:18, Alexander Motin wrote:
> Author: mav
> Date: Tue Aug 11 09:18:51 2015
> New Revision: 286623
> URL: https://svnweb.freebsd.org/changeset/base/286623
> 
> Log:
>   Remove extra lock, that IMO only creates potential problems now.
> 
> Modified:
>   head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/arc.c

In my tree I dropped arc_reclaim_thr_lock from arc_lowmem().  Because of
that I had to drop msleep() as well.

I encountered the following deadlock.
Thread X does I/O through ARC, it has got an ARC hash lock, it needs to
allocate some memory, but the system has grown low on memory, so the
thread has to wait on the page daemon to page some memory.
The ARC eviction thread is already running, it holds
arc_reclaim_thr_lock and it got blocked on the hash lock held by thread X.
The page daemon thread invokes the low memory hook and enters
arc_lowmem() where it gets blocked on arc_reclaim_thr_lock() and thus no
pages can be paged out.

I would prefer to have the pageout path free of indefinite waiting.


> Modified: head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/arc.c
> ==============================================================================
> --- head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/arc.c	Tue Aug 11 09:00:27 2015	(r286622)
> +++ head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/arc.c	Tue Aug 11 09:18:51 2015	(r286623)
> @@ -4773,7 +4773,6 @@ arc_tempreserve_space(uint64_t reserve, 
>  	return (0);
>  }
>  
> -static kmutex_t arc_lowmem_lock;
>  #ifdef _KERNEL
>  static eventhandler_tag arc_event_lowmem = NULL;
>  
> @@ -4781,8 +4780,6 @@ static void
>  arc_lowmem(void *arg __unused, int howto __unused)
>  {
>  
> -	/* Serialize access via arc_lowmem_lock. */
> -	mutex_enter(&arc_lowmem_lock);
>  	mutex_enter(&arc_reclaim_thr_lock);
>  	needfree = 1;
>  	DTRACE_PROBE(arc__needfree);
> @@ -4793,12 +4790,9 @@ arc_lowmem(void *arg __unused, int howto
>  	 * here from ARC itself and may hold ARC locks and thus risk a deadlock
>  	 * with ARC reclaim thread.
>  	 */
> -	if (curproc == pageproc) {
> -		while (needfree)
> -			msleep(&needfree, &arc_reclaim_thr_lock, 0, "zfs:lowmem", 0);
> -	}
> +	if (curproc == pageproc)
> +		msleep(&needfree, &arc_reclaim_thr_lock, 0, "zfs:lowmem", 0);
>  	mutex_exit(&arc_reclaim_thr_lock);
> -	mutex_exit(&arc_lowmem_lock);
>  }
>  #endif
>  
> @@ -4809,7 +4803,6 @@ arc_init(void)
>  
>  	mutex_init(&arc_reclaim_thr_lock, NULL, MUTEX_DEFAULT, NULL);
>  	cv_init(&arc_reclaim_thr_cv, NULL, CV_DEFAULT, NULL);
> -	mutex_init(&arc_lowmem_lock, NULL, MUTEX_DEFAULT, NULL);
>  
>  	/* Convert seconds to clock ticks */
>  	arc_min_prefetch_lifespan = 1 * hz;
> @@ -5049,7 +5042,6 @@ arc_fini(void)
>  
>  	ASSERT0(arc_loaned_bytes);
>  
> -	mutex_destroy(&arc_lowmem_lock);
>  #ifdef _KERNEL
>  	if (arc_event_lowmem != NULL)
>  		EVENTHANDLER_DEREGISTER(vm_lowmem, arc_event_lowmem);
> 


-- 
Andriy Gapon



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?55CDD1AA.40008>