Skip to content

Commit e976936

Browse files
Michal Hockoakpm00
authored andcommitted
mm/mempolicy: do not duplicate policy if it is not applicable for set_mempolicy_home_node
set_mempolicy_home_node tries to duplicate a memory policy before checking it whether it is applicable for the operation. There is no real reason for doing that and it might actually be a pointless memory allocation and deallocation exercise for MPOL_INTERLEAVE. Not a big problem but we can do better. Simply check the policy before acting on it. Link: https://lkml.kernel.org/r/20221216194537.238047-2-mathieu.desnoyers@efficios.com Signed-off-by: Michal Hocko <mhocko@suse.com> Reviewed-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com> Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com> Cc: Aneesh Kumar K.V <aneesh.kumar@linux.ibm.com> Cc: Dave Hansen <dave.hansen@linux.intel.com> Cc: Feng Tang <feng.tang@intel.com> Cc: Michal Hocko <mhocko@kernel.org> Cc: Andrea Arcangeli <aarcange@redhat.com> Cc: Mel Gorman <mgorman@techsingularity.net> Cc: Mike Kravetz <mike.kravetz@oracle.com> Cc: Randy Dunlap <rdunlap@infradead.org> Cc: Vlastimil Babka <vbabka@suse.cz> Cc: Andi Kleen <ak@linux.intel.com> Cc: Dan Williams <dan.j.williams@intel.com> Cc: Huang Ying <ying.huang@intel.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
1 parent a5fd839 commit e976936

File tree

1 file changed

+12
-16
lines changed

1 file changed

+12
-16
lines changed

mm/mempolicy.c

Lines changed: 12 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1489,7 +1489,7 @@ SYSCALL_DEFINE4(set_mempolicy_home_node, unsigned long, start, unsigned long, le
14891489
{
14901490
struct mm_struct *mm = current->mm;
14911491
struct vm_area_struct *vma;
1492-
struct mempolicy *new;
1492+
struct mempolicy *new, *old;
14931493
unsigned long vmstart;
14941494
unsigned long vmend;
14951495
unsigned long end;
@@ -1521,31 +1521,27 @@ SYSCALL_DEFINE4(set_mempolicy_home_node, unsigned long, start, unsigned long, le
15211521
return 0;
15221522
mmap_write_lock(mm);
15231523
for_each_vma_range(vmi, vma, end) {
1524-
vmstart = max(start, vma->vm_start);
1525-
vmend = min(end, vma->vm_end);
1526-
new = mpol_dup(vma_policy(vma));
1527-
if (IS_ERR(new)) {
1528-
err = PTR_ERR(new);
1529-
break;
1530-
}
1531-
/*
1532-
* Only update home node if there is an existing vma policy
1533-
*/
1534-
if (!new)
1535-
continue;
1536-
15371524
/*
15381525
* If any vma in the range got policy other than MPOL_BIND
15391526
* or MPOL_PREFERRED_MANY we return error. We don't reset
15401527
* the home node for vmas we already updated before.
15411528
*/
1542-
if (new->mode != MPOL_BIND && new->mode != MPOL_PREFERRED_MANY) {
1543-
mpol_put(new);
1529+
old = vma_policy(vma);
1530+
if (!old)
1531+
continue;
1532+
if (old->mode != MPOL_BIND && old->mode != MPOL_PREFERRED_MANY) {
15441533
err = -EOPNOTSUPP;
15451534
break;
15461535
}
1536+
new = mpol_dup(old);
1537+
if (IS_ERR(new)) {
1538+
err = PTR_ERR(new);
1539+
break;
1540+
}
15471541

15481542
new->home_node = home_node;
1543+
vmstart = max(start, vma->vm_start);
1544+
vmend = min(end, vma->vm_end);
15491545
err = mbind_range(mm, vmstart, vmend, new);
15501546
mpol_put(new);
15511547
if (err)

0 commit comments

Comments
 (0)