From: ebiederm@xmission.com (Eric W. Biederman)
To: Adam Litke <agl@us.ibm.com>
Cc: dean gaudet <dean@arctic.org>,
William Lee Irwin III <wli@holomorphy.com>,
linux-kernel@vger.kernel.org, ak@suse.de, clameter@sgi.com
Subject: Re: [shm][hugetlb] Fix get_policy for stacked shared memory files
Date: Tue, 12 Jun 2007 00:20:52 -0600 [thread overview]
Message-ID: <m1odjlpubf.fsf@ebiederm.dsl.xmission.com> (raw)
In-Reply-To: <1181597696.22671.2.camel@localhost.localdomain> (Adam Litke's message of "Mon, 11 Jun 2007 16:34:54 -0500")
Adam Litke <agl@us.ibm.com> writes:
> Here's another breakage as a result of shared memory stacked files :(
>
> The NUMA policy for a VMA is determined by checking the following (in the order
> given):
>
> 1) vma->vm_ops->get_policy() (if defined)
> 2) vma->vm_policy (if defined)
> 3) task->mempolicy (if defined)
> 4) Fall back to default_policy
>
> By switching to stacked files for shared memory, get_policy() is now always set
> to shm_get_policy which is a wrapper function. This causes us to stop at step
> 1, which yields NULL for hugetlb instead of task->mempolicy which was the
> previous (and correct) result.
>
> This patch modifies the shm_get_policy() wrapper to maintain steps 1-3 for the
> wrapped vm_ops. Andi and Christoph, does this look right to you?
I'm confused.
I agree that the behavior you describe is correct.
However I only see two code paths were get_policy is called and
both of them take a NULL result and change it to task->mempolicy:
>From mm/mempolicy.c
> long do_get_mempolicy(int *policy, nodemask_t *nmask,
> unsigned long addr, unsigned long flags)
> {
> int err;
> struct mm_struct *mm = current->mm;
> struct vm_area_struct *vma = NULL;
> struct mempolicy *pol = current->mempolicy;
>
> cpuset_update_task_memory_state();
> if (flags & ~(unsigned long)(MPOL_F_NODE|MPOL_F_ADDR))
> return -EINVAL;
> if (flags & MPOL_F_ADDR) {
> down_read(&mm->mmap_sem);
> vma = find_vma_intersection(mm, addr, addr+1);
> if (!vma) {
> up_read(&mm->mmap_sem);
> return -EFAULT;
> }
> if (vma->vm_ops && vma->vm_ops->get_policy)
> pol = vma->vm_ops->get_policy(vma, addr);
> else
> pol = vma->vm_policy;
> } else if (addr)
> return -EINVAL;
>
> if (!pol)
> pol = &default_policy;
> /* Return effective policy for a VMA */
> static struct mempolicy * get_vma_policy(struct task_struct *task,
> struct vm_area_struct *vma, unsigned long addr)
> {
> struct mempolicy *pol = task->mempolicy;
>
> if (vma) {
> if (vma->vm_ops && vma->vm_ops->get_policy)
> pol = vma->vm_ops->get_policy(vma, addr);
> else if (vma->vm_policy &&
> vma->vm_policy->policy != MPOL_DEFAULT)
> pol = vma->vm_policy;
> }
> if (!pol)
> pol = &default_policy;
> return pol;
> }
Does this perhaps need to be:
> Signed-off-by: Adam Litke <agl@us.ibm.com>
>
> diff --git a/ipc/shm.c b/ipc/shm.c
> index 4fefbad..8d2672d 100644
> --- a/ipc/shm.c
> +++ b/ipc/shm.c
> @@ -254,8 +254,10 @@ struct mempolicy *shm_get_policy(struct vm_area_struct
> *vma, unsigned long addr)
+ pol = NULL;
>
> if (sfd->vm_ops->get_policy)
> pol = sfd->vm_ops->get_policy(vma, addr);
> - else
> + else if (vma->vm_policy && vma->vm_policy->policy != MPOL_DEFAULT)
> pol = vma->vm_policy;
> return pol;
> }
> #endif
Sorry I'm just a little dense at the moment.
Eric
next prev parent reply other threads:[~2007-06-12 6:22 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-05-16 5:41 2.6.21 numa policy and huge pages not working dean gaudet
2007-05-16 6:12 ` William Lee Irwin III
2007-06-09 18:06 ` dean gaudet
2007-06-10 4:10 ` dean gaudet
2007-06-10 4:51 ` William Lee Irwin III
2007-06-11 16:23 ` Adam Litke
2007-06-11 21:34 ` [shm][hugetlb] Fix get_policy for stacked shared memory files Adam Litke
2007-06-12 3:36 ` dean gaudet
2007-06-12 3:51 ` William Lee Irwin III
2007-06-12 4:30 ` Andrew Morton
2007-06-12 4:48 ` William Lee Irwin III
2007-06-12 10:20 ` Andi Kleen
2007-06-12 6:20 ` Eric W. Biederman [this message]
2007-06-12 6:58 ` William Lee Irwin III
2007-06-12 14:32 ` Adam Litke
2007-06-12 18:22 ` Eric W. Biederman
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=m1odjlpubf.fsf@ebiederm.dsl.xmission.com \
--to=ebiederm@xmission.com \
--cc=agl@us.ibm.com \
--cc=ak@suse.de \
--cc=clameter@sgi.com \
--cc=dean@arctic.org \
--cc=linux-kernel@vger.kernel.org \
--cc=wli@holomorphy.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.