diff options
author | Takashi Iwai <tiwai@suse.de> | 2021-01-26 07:51:48 +0100 |
---|---|---|
committer | Takashi Iwai <tiwai@suse.de> | 2021-01-26 07:51:48 +0100 |
commit | 4f2da3324eaff382ab1c6aaef8c10180b2f4d08c (patch) | |
tree | 38dab378ba4ad014d83151f020cc1e5979be0d6d /mm/hugetlb.c | |
parent | 6755568ad111394da224c823e8baf31a05a1469c (diff) | |
parent | 30e88d017fcbeb50c4b07577fe059558361067e7 (diff) | |
download | linux-4f2da3324eaff382ab1c6aaef8c10180b2f4d08c.tar.gz linux-4f2da3324eaff382ab1c6aaef8c10180b2f4d08c.tar.bz2 linux-4f2da3324eaff382ab1c6aaef8c10180b2f4d08c.zip |
Merge tag 'tags/isa-void-remove-callback' into for-next
isa: Make the remove callback for isa drivers return void
Link: https://lore.kernel.org/r/20210122092449.426097-1-uwe@kleine-koenig.org
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Diffstat (limited to 'mm/hugetlb.c')
-rw-r--r-- | mm/hugetlb.c | 24 |
1 files changed, 22 insertions, 2 deletions
diff --git a/mm/hugetlb.c b/mm/hugetlb.c index cbf32d2824fd..18f6ee317900 100644 --- a/mm/hugetlb.c +++ b/mm/hugetlb.c @@ -4105,10 +4105,30 @@ retry_avoidcopy: * may get SIGKILLed if it later faults. */ if (outside_reserve) { + struct address_space *mapping = vma->vm_file->f_mapping; + pgoff_t idx; + u32 hash; + put_page(old_page); BUG_ON(huge_pte_none(pte)); + /* + * Drop hugetlb_fault_mutex and i_mmap_rwsem before + * unmapping. unmapping needs to hold i_mmap_rwsem + * in write mode. Dropping i_mmap_rwsem in read mode + * here is OK as COW mappings do not interact with + * PMD sharing. + * + * Reacquire both after unmap operation. + */ + idx = vma_hugecache_offset(h, vma, haddr); + hash = hugetlb_fault_mutex_hash(mapping, idx); + mutex_unlock(&hugetlb_fault_mutex_table[hash]); + i_mmap_unlock_read(mapping); + unmap_ref_private(mm, vma, old_page, haddr); - BUG_ON(huge_pte_none(pte)); + + i_mmap_lock_read(mapping); + mutex_lock(&hugetlb_fault_mutex_table[hash]); spin_lock(ptl); ptep = huge_pte_offset(mm, haddr, huge_page_size(h)); if (likely(ptep && @@ -4351,7 +4371,7 @@ retry: * So we need to block hugepage fault by PG_hwpoison bit check. */ if (unlikely(PageHWPoison(page))) { - ret = VM_FAULT_HWPOISON | + ret = VM_FAULT_HWPOISON_LARGE | VM_FAULT_SET_HINDEX(hstate_index(h)); goto backout_unlocked; } |