X-Git-Url: http://git.rot13.org/?a=blobdiff_plain;ds=sidebyside;f=mm%2Fmempolicy.c;h=a9963ceddd65c483f589efe4f5c5124bddd36e8c;hb=0e367a15ed08710098e2ff59aa25cec723c0a9d4;hp=e07e27e846a22981a05804aefcdbdb31d88f15be;hpb=5f765b8d68fe99c8a575265d81c62382893e1e8a;p=powerpc.git diff --git a/mm/mempolicy.c b/mm/mempolicy.c index e07e27e846..a9963ceddd 100644 --- a/mm/mempolicy.c +++ b/mm/mempolicy.c @@ -1176,7 +1176,15 @@ static inline unsigned interleave_nid(struct mempolicy *pol, if (vma) { unsigned long off; - off = vma->vm_pgoff; + /* + * for small pages, there is no difference between + * shift and PAGE_SHIFT, so the bit-shift is safe. + * for huge pages, since vm_pgoff is in units of small + * pages, we need to shift off the always 0 bits to get + * a useful offset. + */ + BUG_ON(shift < PAGE_SHIFT); + off = vma->vm_pgoff >> (shift - PAGE_SHIFT); off += (addr - vma->vm_start) >> shift; return offset_il_node(pol, vma, off); } else