<br><font size=2><tt>Roland Dreier <rolandd@cisco.com> wrote:</tt></font>
<br>
<br><font size=2><tt>...</tt></font>
<br><font size=2><tt>> +int ipath_mlock(unsigned long start_page, size_t
num_pages, struct page **p)<br>
> +{<br>
> +   int n;<br>
> +<br>
> +   _IPATH_VDBG("pin %lx pages from vaddr %lx\n", num_pages,
start_page);<br>
> +   down_read(&current->mm->mmap_sem);<br>
> +   n = get_user_pages(current, current->mm, start_page, num_pages,
1, 1,<br>
> +            p, NULL);<br>
> +   up_read(&current->mm->mmap_sem);<br>
> +   if (n != num_pages) {<br>
> +      _IPATH_INFO<br>
> +          ("get_user_pages (0x%lx pages
starting at 0x%lx failed with %d\n",<br>
> +           num_pages, start_page, n);<br>
> +      if (n < 0)   /* it's an errno */<br>
> +         return n;<br>
> +      return -ENOMEM;   /* no way to know actual
error */<br>
> +   }<br>
> +<br>
> +   return 0;<br>
> +}</tt></font>
<br>
<br><font size=2 face="sans-serif">For this routine </font><font size=2><tt>(where
num_pages can be >1)</tt></font><font size=2 face="sans-serif">, in
</font><font size=2><tt>the error case you</tt></font><font size=2 face="sans-serif">
need to </font>
<br><font size=2 face="sans-serif">page_cache_release() the pages that
were successfully 'got' (get_page()'d).</font>
<br>
<br><font size=2 face="sans-serif">- KK</font>
<br>