lists.openwall.net | lists / announce owl-users owl-dev john-users john-dev passwdqc-users yescrypt popa3d-users / oss-security kernel-hardening musl sabotage tlsify passwords / crypt-dev xvendor / Bugtraq Full-Disclosure linux-kernel linux-netdev linux-ext4 linux-hardening linux-cve-announce PHC | |
Open Source and information security mailing list archives
| ||
|
Message-ID: <20151008062115.GA876@swordfish> Date: Thu, 8 Oct 2015 15:21:15 +0900 From: Sergey Senozhatsky <sergey.senozhatsky.work@...il.com> To: Davidlohr Bueso <dave@...olabs.net> Cc: Andrew Morton <akpm@...ux-foundation.org>, linux-mm@...ck.org, linux-kernel@...r.kernel.org, Davidlohr Bueso <dbueso@...e.de>, Sergey Senozhatsky <sergey.senozhatsky@...il.com>, Sergey Senozhatsky <sergey.senozhatsky.work@...il.com> Subject: Re: [PATCH -next] mm/vmacache: inline vmacache_valid_mm() On (10/07/15 21:17), Davidlohr Bueso wrote: > This function incurs in very hot paths and merely > does a few loads for validity check. Lets inline it, > such that we can save the function call overhead. > > Signed-off-by: Davidlohr Bueso <dbueso@...e.de> > --- > mm/vmacache.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/mm/vmacache.c b/mm/vmacache.c > index b6e3662..fd09dc9 100644 > --- a/mm/vmacache.c > +++ b/mm/vmacache.c > @@ -52,7 +52,7 @@ void vmacache_flush_all(struct mm_struct *mm) > * Also handle the case where a kernel thread has adopted this mm via use_mm(). > * That kernel thread's vmacache is not applicable to this mm. > */ > -static bool vmacache_valid_mm(struct mm_struct *mm) > +static inline bool vmacache_valid_mm(struct mm_struct *mm) > { > return current->mm == mm && !(current->flags & PF_KTHREAD); > } Seems to be inlined anyway. do you want to inline vmacache_update()? It looks simple enough (vmacache_valid_mm() is inlined): void vmacache_update(unsigned long addr, struct vm_area_struct *newvma) { if (vmacache_valid_mm(newvma->vm_mm)) current->vmacache[VMACACHE_HASH(addr)] = newvma; } After moving vmacache_update() and vmacache_valid_mm() to include/linux/vmacache.h (both `static inline') ./scripts/bloat-o-meter vmlinux.o.old vmlinux.o add/remove: 0/1 grow/shrink: 1/0 up/down: 22/-54 (-32) function old new delta find_vma 97 119 +22 vmacache_update 54 - -54 Something like this, perhaps? --- include/linux/vmacache.h | 21 ++++++++++++++++++++- mm/vmacache.c | 20 -------------------- 2 files changed, 20 insertions(+), 21 deletions(-) diff --git a/include/linux/vmacache.h b/include/linux/vmacache.h index c3fa0fd4..0ec750b 100644 --- a/include/linux/vmacache.h +++ b/include/linux/vmacache.h @@ -15,8 +15,27 @@ static inline void vmacache_flush(struct task_struct *tsk) memset(tsk->vmacache, 0, sizeof(tsk->vmacache)); } +/* + * This task may be accessing a foreign mm via (for example) + * get_user_pages()->find_vma(). The vmacache is task-local and this + * task's vmacache pertains to a different mm (ie, its own). There is + * nothing we can do here. + * + * Also handle the case where a kernel thread has adopted this mm via use_mm(). + * That kernel thread's vmacache is not applicable to this mm. + */ +static bool vmacache_valid_mm(struct mm_struct *mm) +{ + return current->mm == mm && !(current->flags & PF_KTHREAD); +} + +static inline void vmacache_update(unsigned long addr, struct vm_area_struct *newvma) +{ + if (vmacache_valid_mm(newvma->vm_mm)) + current->vmacache[VMACACHE_HASH(addr)] = newvma; +} + extern void vmacache_flush_all(struct mm_struct *mm); -extern void vmacache_update(unsigned long addr, struct vm_area_struct *newvma); extern struct vm_area_struct *vmacache_find(struct mm_struct *mm, unsigned long addr); diff --git a/mm/vmacache.c b/mm/vmacache.c index b6e3662..14fec21 100644 --- a/mm/vmacache.c +++ b/mm/vmacache.c @@ -43,26 +43,6 @@ void vmacache_flush_all(struct mm_struct *mm) rcu_read_unlock(); } -/* - * This task may be accessing a foreign mm via (for example) - * get_user_pages()->find_vma(). The vmacache is task-local and this - * task's vmacache pertains to a different mm (ie, its own). There is - * nothing we can do here. - * - * Also handle the case where a kernel thread has adopted this mm via use_mm(). - * That kernel thread's vmacache is not applicable to this mm. - */ -static bool vmacache_valid_mm(struct mm_struct *mm) -{ - return current->mm == mm && !(current->flags & PF_KTHREAD); -} - -void vmacache_update(unsigned long addr, struct vm_area_struct *newvma) -{ - if (vmacache_valid_mm(newvma->vm_mm)) - current->vmacache[VMACACHE_HASH(addr)] = newvma; -} - static bool vmacache_valid(struct mm_struct *mm) { struct task_struct *curr; -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@...r.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Powered by blists - more mailing lists