Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752445Ab1DOGIS (ORCPT ); Fri, 15 Apr 2011 02:08:18 -0400 Received: from mail-pv0-f174.google.com ([74.125.83.174]:63658 "EHLO mail-pv0-f174.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751119Ab1DOGIQ (ORCPT ); Fri, 15 Apr 2011 02:08:16 -0400 DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=from:to:cc:subject:date:message-id:x-mailer:in-reply-to:references; b=rz/Eb/hUgKj1D9jjdD1o8fW/WRmlu1l9bvV+lr03OIAiZChzRzm8/lq5rHe4v+opmv nzbYJwwpa0xvWq+Mxs2zipiE4SVGYCsl2uk1xag0AwtOVvZKNnN+F9TfpBQVkNF7DWIT UWDw8I7mxPykBj1R42fO+K5tMea+DBZfA6ObA= From: Namhyung Kim To: Minchan Kim Cc: Andrew Morton , linux-mm@kvack.org, linux-kernel@vger.kernel.org Subject: [PATCH v2] mempolicy: reduce references to the current Date: Fri, 15 Apr 2011 15:08:08 +0900 Message-Id: <1302847688-8076-1-git-send-email-namhyung@gmail.com> X-Mailer: git-send-email 1.7.4 In-Reply-To: References: Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 5522 Lines: 186 Remove duplicated reference to the 'current' task using a local variable. Since refering the current can be a burden, it'd better cache the reference, IMHO. At least this saves some bytes on x86_64. $ size mempolicy-{old,new}.o text data bss dec hex filename 25203 2448 9176 36827 8fdb mempolicy-old.o 25136 2448 9184 36768 8fa0 mempolicy-new.o Signed-off-by: Namhyung Kim --- mm/mempolicy.c | 58 +++++++++++++++++++++++++++++-------------------------- 1 files changed, 31 insertions(+), 27 deletions(-) diff --git a/mm/mempolicy.c b/mm/mempolicy.c index 959a8b8c7350..5a30065590aa 100644 --- a/mm/mempolicy.c +++ b/mm/mempolicy.c @@ -304,6 +304,7 @@ static void mpol_rebind_nodemask(struct mempolicy *pol, const nodemask_t *nodes, enum mpol_rebind_step step) { nodemask_t tmp; + struct task_struct *tsk = current; if (pol->flags & MPOL_F_STATIC_NODES) nodes_and(tmp, pol->w.user_nodemask, *nodes); @@ -335,12 +336,12 @@ static void mpol_rebind_nodemask(struct mempolicy *pol, const nodemask_t *nodes, else BUG(); - if (!node_isset(current->il_next, tmp)) { - current->il_next = next_node(current->il_next, tmp); - if (current->il_next >= MAX_NUMNODES) - current->il_next = first_node(tmp); - if (current->il_next >= MAX_NUMNODES) - current->il_next = numa_node_id(); + if (!node_isset(tsk->il_next, tmp)) { + tsk->il_next = next_node(tsk->il_next, tmp); + if (tsk->il_next >= MAX_NUMNODES) + tsk->il_next = first_node(tmp); + if (tsk->il_next >= MAX_NUMNODES) + tsk->il_next = numa_node_id(); } } @@ -714,7 +715,8 @@ static long do_set_mempolicy(unsigned short mode, unsigned short flags, nodemask_t *nodes) { struct mempolicy *new, *old; - struct mm_struct *mm = current->mm; + struct task_struct *tsk = current; + struct mm_struct *mm = tsk->mm; NODEMASK_SCRATCH(scratch); int ret; @@ -734,22 +736,22 @@ static long do_set_mempolicy(unsigned short mode, unsigned short flags, */ if (mm) down_write(&mm->mmap_sem); - task_lock(current); + task_lock(tsk); ret = mpol_set_nodemask(new, nodes, scratch); if (ret) { - task_unlock(current); + task_unlock(tsk); if (mm) up_write(&mm->mmap_sem); mpol_put(new); goto out; } - old = current->mempolicy; - current->mempolicy = new; + old = tsk->mempolicy; + tsk->mempolicy = new; mpol_set_task_struct_flag(); if (new && new->mode == MPOL_INTERLEAVE && nodes_weight(new->v.nodes)) - current->il_next = first_node(new->v.nodes); - task_unlock(current); + tsk->il_next = first_node(new->v.nodes); + task_unlock(tsk); if (mm) up_write(&mm->mmap_sem); @@ -805,9 +807,10 @@ static long do_get_mempolicy(int *policy, nodemask_t *nmask, unsigned long addr, unsigned long flags) { int err; - struct mm_struct *mm = current->mm; + struct task_struct *tsk = current; + struct mm_struct *mm = tsk->mm; struct vm_area_struct *vma = NULL; - struct mempolicy *pol = current->mempolicy; + struct mempolicy *pol = tsk->mempolicy; if (flags & ~(unsigned long)(MPOL_F_NODE|MPOL_F_ADDR|MPOL_F_MEMS_ALLOWED)) @@ -817,9 +820,9 @@ static long do_get_mempolicy(int *policy, nodemask_t *nmask, if (flags & (MPOL_F_NODE|MPOL_F_ADDR)) return -EINVAL; *policy = 0; /* just so it's initialized */ - task_lock(current); + task_lock(tsk); *nmask = cpuset_current_mems_allowed; - task_unlock(current); + task_unlock(tsk); return 0; } @@ -851,9 +854,9 @@ static long do_get_mempolicy(int *policy, nodemask_t *nmask, if (err < 0) goto out; *policy = err; - } else if (pol == current->mempolicy && + } else if (pol == tsk->mempolicy && pol->mode == MPOL_INTERLEAVE) { - *policy = current->il_next; + *policy = tsk->il_next; } else { err = -EINVAL; goto out; @@ -869,7 +872,7 @@ static long do_get_mempolicy(int *policy, nodemask_t *nmask, } if (vma) { - up_read(¤t->mm->mmap_sem); + up_read(&mm->mmap_sem); vma = NULL; } @@ -878,16 +881,16 @@ static long do_get_mempolicy(int *policy, nodemask_t *nmask, if (mpol_store_user_nodemask(pol)) { *nmask = pol->w.user_nodemask; } else { - task_lock(current); + task_lock(tsk); get_policy_nodemask(pol, nmask); - task_unlock(current); + task_unlock(tsk); } } out: mpol_cond_put(pol); if (vma) - up_read(¤t->mm->mmap_sem); + up_read(&mm->mmap_sem); return err; } @@ -1912,22 +1915,23 @@ EXPORT_SYMBOL(alloc_pages_current); /* Slow path of a mempolicy duplicate */ struct mempolicy *__mpol_dup(struct mempolicy *old) { + struct task_struct *tsk = current; struct mempolicy *new = kmem_cache_alloc(policy_cache, GFP_KERNEL); if (!new) return ERR_PTR(-ENOMEM); /* task's mempolicy is protected by alloc_lock */ - if (old == current->mempolicy) { - task_lock(current); + if (old == tsk->mempolicy) { + task_lock(tsk); *new = *old; - task_unlock(current); + task_unlock(tsk); } else *new = *old; rcu_read_lock(); if (current_cpuset_is_being_rebound()) { - nodemask_t mems = cpuset_mems_allowed(current); + nodemask_t mems = cpuset_mems_allowed(tsk); if (new->flags & MPOL_F_REBINDING) mpol_rebind_policy(new, &mems, MPOL_REBIND_STEP2); else -- 1.7.4 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/