[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20211124200618.adaxuxuksrinkigv@box.shutemov.name>
Date: Wed, 24 Nov 2021 23:06:18 +0300
From: "Kirill A. Shutemov" <kirill@...temov.name>
To: Gang Li <ligang.bdlg@...edance.com>
Cc: Hugh Dickins <hughd@...gle.com>,
Andrew Morton <akpm@...ux-foundation.org>,
"Kirill A. Shutemov" <kirill.shutemov@...ux.intel.com>,
stable@...r.kernel.org, songmuchun@...edance.com,
linux-mm@...ck.org, linux-kernel@...r.kernel.org
Subject: Re: [PATCH v3] shmem: fix a race between shmem_unused_huge_shrink
and shmem_evict_inode
On Wed, Nov 24, 2021 at 05:43:16PM +0800, Gang Li wrote:
> +move_back:
> + /* inodes that are on @list and will not be deleted must be moved back to
> + * global list before iput for two reasons:
> + * 1. iput in lock: iput call shmem_evict_inode, then cause deadlock.
> + * 2. iput before lock: shmem_evict_inode may grab the inode on @list,
> + * which will cause race.
> + */
> + spin_lock(&sbinfo->shrinklist_lock);
> + list_move(&info->shrinklist, &sbinfo->shrinklist);
> + sbinfo->shrinklist_len++;
> + spin_unlock(&sbinfo->shrinklist_lock);
> +put:
> iput(inode);
> }
>
> - spin_lock(&sbinfo->shrinklist_lock);
> - list_splice_tail(&list, &sbinfo->shrinklist);
> - sbinfo->shrinklist_len -= removed;
> - spin_unlock(&sbinfo->shrinklist_lock);
> -
> return split;
> }
Okay, I guess it works. Locking is not pretty, but well..
Acked-by: Kirill A. Shutemov <kirill.shutemov@...ux.intel.com>
--
Kirill A. Shutemov
Powered by blists - more mailing lists