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@linux.intel.com