> diff --git a/drivers/infiniband/core/umem.c b/drivers/infiniband/core/umem.c > index a841123..f8f47dc 100644 > --- a/drivers/infiniband/core/umem.c > +++ b/drivers/infiniband/core/umem.c > @@ -137,17 +137,22 @@ struct ib_umem *ib_umem_get (struct ib_ucontext *context, unsigned long addr, > > down_write(¤t->mm->mmap_sem); > > - locked = npages + current->mm->pinned_vm; > + locked = npages + mm_locked_pages(current->mm); > lock_limit = rlimit(RLIMIT_MEMLOCK) >> PAGE_SHIFT; > > if ((locked > lock_limit) && !capable(CAP_IPC_LOCK)) { > ret = -ENOMEM; > - goto out; > + goto err; > } > > cur_base = addr & PAGE_MASK; > + umem->start_addr = cur_base; > + umem->end_addr = cur_base + npages; > + > + ret = mm_mpin(umem->start_addr, umem->end_addr); > + if (ret) > + goto err; I believe RLIMIT_MEMLOCK should be checked within mm_mpin(). > +static inline unsigned long mm_locked_pages(struct mm_struct *mm) > +{ > + return mm->pinned_vm + mm->locked_vm; > +} This is acceptable. but if we create mm_locked_pages(), /proc should also use this. Otherwise pinning operation magically decrease VmLck field in /proc/pid/status and people get a confusion. > @@ -310,9 +309,49 @@ static int mlock_fixup(struct vm_area_struct *vma, struct vm_area_struct **prev, > * Keep track of amount of locked VM. > */ > nr_pages = (end - start) >> PAGE_SHIFT; > - if (!lock) > - nr_pages = -nr_pages; > - mm->locked_vm += nr_pages; > + > + /* > + * We should only account pages once, if VM_PINNED is set pages are > + * accounted in mm_struct::pinned_vm, otherwise if VM_LOCKED is set, > + * we'll account them in mm_struct::locked_vm. > + * > + * PL := vma->vm_flags > + * PL' := newflags > + * PLd := {pinned,locked}_vm delta > + * > + * PL->PL' PLd > + * ----------- > + * 00 01 0+ > + * 00 10 +0 > + * 01 11 +- > + * 01 00 0- > + * 10 00 -0 > + * 10 11 00 > + * 11 01 -+ > + * 11 10 00 > + */ This comment is too cryptic. :-) -- To unsubscribe from this list: send the line "unsubscribe trinity" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html