]) # LN_CONFIG_SK_DATA_READY
#
-# LN_EXPORT_KMAP_TO_PAGE
-#
-# 3.10 Export kmap_to_page
-#
-AC_DEFUN([LN_EXPORT_KMAP_TO_PAGE], [
-LB_CHECK_EXPORT([kmap_to_page], [mm/highmem.c],
- [AC_DEFINE(HAVE_KMAP_TO_PAGE, 1,
- [kmap_to_page is exported by the kernel])])
-]) # LN_EXPORT_KMAP_TO_PAGE
-
-#
# LN_HAVE_HYPERVISOR_IS_TYPE
#
# 4.14 commit 79cc74155218316b9a5d28577c7077b2adba8e58
LN_CONFIG_O2IB
LN_CONFIG_GNILND
LN_CONFIG_KFILND
-# 3.10 - Check export
-LN_EXPORT_KMAP_TO_PAGE
]) # LN_PROG_LINUX
#
void lnet_md_unlink(struct lnet_libmd *md);
void lnet_md_deconstruct(struct lnet_libmd *lmd, struct lnet_event *ev);
-struct page *lnet_kvaddr_to_page(unsigned long vaddr);
struct page *lnet_get_first_page(struct lnet_libmd *md, unsigned int offset);
int lnet_cpt_of_md(struct lnet_libmd *md, unsigned int offset);
}
struct page *
-lnet_kvaddr_to_page(unsigned long vaddr)
-{
- if (is_vmalloc_addr((void *)vaddr))
- return vmalloc_to_page((void *)vaddr);
-
-#ifdef CONFIG_HIGHMEM
-
-#ifdef HAVE_KMAP_TO_PAGE
- /*
- * This ifdef is added to handle the kernel versions
- * which have kmap_to_page() function exported. If so,
- * we should use it. Otherwise, remain with the legacy check.
- */
- return kmap_to_page((void *)vaddr);
-#else
-
- if (vaddr >= PKMAP_ADDR(0) && vaddr < PKMAP_ADDR(LAST_PKMAP)) {
- /* No highmem pages only used for bulk (kiov) I/O */
- CERROR("find page for address in highmem\n");
- LBUG();
- }
- return virt_to_page(vaddr);
-#endif /* HAVE_KMAP_TO_PAGE */
-#else
-
- return virt_to_page(vaddr);
-#endif /* CONFIG_HIGHMEM */
-}
-EXPORT_SYMBOL(lnet_kvaddr_to_page);
-
-struct page *
lnet_get_first_page(struct lnet_libmd *md, unsigned int offset)
{
unsigned int niov;
lmd->md_length = len;
i = 0;
while (len) {
+ struct page *p;
int plen;
+ if (is_vmalloc_addr(pa))
+ p = vmalloc_to_page(pa);
+ else
+ p = virt_to_page(pa);
plen = min_t(int, len, PAGE_SIZE - offset_in_page(pa));
- lmd->md_kiov[i].bv_page =
- lnet_kvaddr_to_page((unsigned long) pa);
+ lmd->md_kiov[i].bv_page = p;
lmd->md_kiov[i].bv_offset = offset_in_page(pa);
lmd->md_kiov[i].bv_len = plen;
pa += plen;
i += 1;
}
+
WARN(!(lmd->md_options & LNET_MD_GNILND) && i > LNET_MAX_IOV,
"Max IOV exceeded: %d should be < %d\n",
i, LNET_MAX_IOV);
while (len > 0) {
int page_len = min_t(unsigned int, PAGE_SIZE - offset,
len);
- unsigned long vaddr = (unsigned long)frag;
+ struct page *p;
- ptlrpc_prep_bulk_page_nopin(desc,
- lnet_kvaddr_to_page(vaddr),
- offset, page_len);
+ if (!is_vmalloc_addr(frag))
+ p = virt_to_page((unsigned long)frag);
+ else
+ p = vmalloc_to_page(frag);
+ ptlrpc_prep_bulk_page_nopin(desc, p, offset, page_len);
offset = 0;
len -= page_len;
frag += page_len;