mirror of
https://github.com/torvalds/linux.git
synced 2024-11-01 04:53:36 +01:00
mm: move can_modify_vma to mm/vma.h
Patch series "mm: Optimize mseal checks", v3. Optimize mseal checks by removing the separate can_modify_mm() step, and just doing checks on the individual vmas, when various operations are themselves iterating through the tree. This provides a nice speedup and restores performance parity with pre-mseal[3]. will-it-scale mmap1_process[1] -t 1 results: commit 3450fe2b574b4345e4296ccae395149e1a357fee: min:277605 max:277605 total:277605 min:281784 max:281784 total:281784 min:277238 max:277238 total:277238 min:281761 max:281761 total:281761 min:274279 max:274279 total:274279 min:254854 max:254854 total:254854 measurement min:269143 max:269143 total:269143 min:270454 max:270454 total:270454 min:243523 max:243523 total:243523 min:251148 max:251148 total:251148 min:209669 max:209669 total:209669 min:190426 max:190426 total:190426 min:231219 max:231219 total:231219 min:275364 max:275364 total:275364 min:266540 max:266540 total:266540 min:242572 max:242572 total:242572 min:284469 max:284469 total:284469 min:278882 max:278882 total:278882 min:283269 max:283269 total:283269 min:281204 max:281204 total:281204 After this patch set: min:280580 max:280580 total:280580 min:290514 max:290514 total:290514 min:291006 max:291006 total:291006 min:290352 max:290352 total:290352 min:294582 max:294582 total:294582 min:293075 max:293075 total:293075 measurement min:295613 max:295613 total:295613 min:294070 max:294070 total:294070 min:293193 max:293193 total:293193 min:291631 max:291631 total:291631 min:295278 max:295278 total:295278 min:293782 max:293782 total:293782 min:290361 max:290361 total:290361 min:294517 max:294517 total:294517 min:293750 max:293750 total:293750 min:293572 max:293572 total:293572 min:295239 max:295239 total:295239 min:292932 max:292932 total:292932 min:293319 max:293319 total:293319 min:294954 max:294954 total:294954 This was a Completely Unscientific test but seems to show there were around 5-10% gains on ops per second. Oliver performed his own tests and showed[3] a similar ~5% gain in them. [1]: mmap1_process does mmap and munmap in a loop. I didn't bother testing multithreading cases. [2]: https://lore.kernel.org/all/20240807124103.85644-1-mpe@ellerman.id.au/ [3]: https://lore.kernel.org/all/ZrMMJfe9aXSWxJz6@xsang-OptiPlex-9020/ Link: https://lore.kernel.org/all/202408041602.caa0372-oliver.sang@intel.com/ This patch (of 7): Move can_modify_vma to vma.h so it can be inlined properly (with the intent to remove can_modify_mm callsites). Link: https://lkml.kernel.org/r/20240817-mseal-depessimize-v3-1-d8d2e037df30@gmail.com Signed-off-by: Pedro Falcato <pedro.falcato@gmail.com> Reviewed-by: Liam R. Howlett <Liam.Howlett@Oracle.com> Reviewed-by: Lorenzo Stoakes <lorenzo.stoakes@oracle.com> Cc: Jeff Xu <jeffxu@chromium.org> Cc: Kees Cook <kees@kernel.org> Cc: Linus Torvalds <torvalds@linux-foundation.org> Cc: Michael Ellerman <mpe@ellerman.id.au> Cc: Pedro Falcato <pedro.falcato@gmail.com> Cc: Shuah Khan <shuah@kernel.org> Cc: Vlastimil Babka <vbabka@suse.cz> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
This commit is contained in:
parent
0a2d82946b
commit
4d1b341665
2 changed files with 28 additions and 17 deletions
17
mm/mseal.c
17
mm/mseal.c
|
@ -16,28 +16,11 @@
|
|||
#include <linux/sched.h>
|
||||
#include "internal.h"
|
||||
|
||||
static inline bool vma_is_sealed(struct vm_area_struct *vma)
|
||||
{
|
||||
return (vma->vm_flags & VM_SEALED);
|
||||
}
|
||||
|
||||
static inline void set_vma_sealed(struct vm_area_struct *vma)
|
||||
{
|
||||
vm_flags_set(vma, VM_SEALED);
|
||||
}
|
||||
|
||||
/*
|
||||
* check if a vma is sealed for modification.
|
||||
* return true, if modification is allowed.
|
||||
*/
|
||||
static bool can_modify_vma(struct vm_area_struct *vma)
|
||||
{
|
||||
if (unlikely(vma_is_sealed(vma)))
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool is_madv_discard(int behavior)
|
||||
{
|
||||
switch (behavior) {
|
||||
|
|
28
mm/vma.h
28
mm/vma.h
|
@ -361,4 +361,32 @@ struct vm_area_struct *vma_iter_prev_range(struct vma_iterator *vmi)
|
|||
return mas_prev_range(&vmi->mas, 0);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_64BIT
|
||||
|
||||
static inline bool vma_is_sealed(struct vm_area_struct *vma)
|
||||
{
|
||||
return (vma->vm_flags & VM_SEALED);
|
||||
}
|
||||
|
||||
/*
|
||||
* check if a vma is sealed for modification.
|
||||
* return true, if modification is allowed.
|
||||
*/
|
||||
static inline bool can_modify_vma(struct vm_area_struct *vma)
|
||||
{
|
||||
if (unlikely(vma_is_sealed(vma)))
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
static inline bool can_modify_vma(struct vm_area_struct *vma)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#endif /* __MM_VMA_H */
|
||||
|
|
Loading…
Reference in a new issue