Skip to content

Commit 6207252

Browse files
committed
Merge tag 'mm-hotfixes-stable-2022-07-29' of git://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm
Pull misc fixes from Andrew Morton: "Two hotfixes, both cc:stable" * tag 'mm-hotfixes-stable-2022-07-29' of git://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm: mm/hmm: fault non-owner device private entries page_alloc: fix invalid watermark check on a negative value
2 parents 8a91f86 + 8a295db commit 6207252

File tree

2 files changed

+16
-15
lines changed

2 files changed

+16
-15
lines changed

mm/hmm.c

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -212,14 +212,6 @@ int hmm_vma_handle_pmd(struct mm_walk *walk, unsigned long addr,
212212
unsigned long end, unsigned long hmm_pfns[], pmd_t pmd);
213213
#endif /* CONFIG_TRANSPARENT_HUGEPAGE */
214214

215-
static inline bool hmm_is_device_private_entry(struct hmm_range *range,
216-
swp_entry_t entry)
217-
{
218-
return is_device_private_entry(entry) &&
219-
pfn_swap_entry_to_page(entry)->pgmap->owner ==
220-
range->dev_private_owner;
221-
}
222-
223215
static inline unsigned long pte_to_hmm_pfn_flags(struct hmm_range *range,
224216
pte_t pte)
225217
{
@@ -252,10 +244,12 @@ static int hmm_vma_handle_pte(struct mm_walk *walk, unsigned long addr,
252244
swp_entry_t entry = pte_to_swp_entry(pte);
253245

254246
/*
255-
* Never fault in device private pages, but just report
256-
* the PFN even if not present.
247+
* Don't fault in device private pages owned by the caller,
248+
* just report the PFN.
257249
*/
258-
if (hmm_is_device_private_entry(range, entry)) {
250+
if (is_device_private_entry(entry) &&
251+
pfn_swap_entry_to_page(entry)->pgmap->owner ==
252+
range->dev_private_owner) {
259253
cpu_flags = HMM_PFN_VALID;
260254
if (is_writable_device_private_entry(entry))
261255
cpu_flags |= HMM_PFN_WRITE;
@@ -273,6 +267,9 @@ static int hmm_vma_handle_pte(struct mm_walk *walk, unsigned long addr,
273267
if (!non_swap_entry(entry))
274268
goto fault;
275269

270+
if (is_device_private_entry(entry))
271+
goto fault;
272+
276273
if (is_device_exclusive_entry(entry))
277274
goto fault;
278275

mm/page_alloc.c

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3968,11 +3968,15 @@ static inline bool zone_watermark_fast(struct zone *z, unsigned int order,
39683968
* need to be calculated.
39693969
*/
39703970
if (!order) {
3971-
long fast_free;
3971+
long usable_free;
3972+
long reserved;
39723973

3973-
fast_free = free_pages;
3974-
fast_free -= __zone_watermark_unusable_free(z, 0, alloc_flags);
3975-
if (fast_free > mark + z->lowmem_reserve[highest_zoneidx])
3974+
usable_free = free_pages;
3975+
reserved = __zone_watermark_unusable_free(z, 0, alloc_flags);
3976+
3977+
/* reserved may over estimate high-atomic reserves. */
3978+
usable_free -= min(usable_free, reserved);
3979+
if (usable_free > mark + z->lowmem_reserve[highest_zoneidx])
39763980
return true;
39773981
}
39783982

0 commit comments

Comments
 (0)