Author: nwhitehorn
Date: Fri Jan 19 22:17:13 2018
New Revision: 328178
URL: https://svnweb.freebsd.org/changeset/base/328178

Log:
  Define PHYS_TO_DMAP() and DMAP_TO_PHYS() as panics on the architectures
  (i386 and arm) that never implement them. This allows the removal of
  #ifdef PHYS_TO_DMAP on code otherwise protected by a runtime check on
  PMAP_HAS_DMAP. It also fixes the build on ARM and i386 after I forgot an
  #ifdef in r328168.
  
  Reported by:  Milan Obuch
  Pointy hat to:        me

Modified:
  head/sys/arm/include/vmparam.h
  head/sys/compat/linuxkpi/common/src/linux_page.c
  head/sys/i386/include/vmparam.h
  head/sys/sys/sf_buf.h

Modified: head/sys/arm/include/vmparam.h
==============================================================================
--- head/sys/arm/include/vmparam.h      Fri Jan 19 22:10:29 2018        
(r328177)
+++ head/sys/arm/include/vmparam.h      Fri Jan 19 22:17:13 2018        
(r328178)
@@ -188,6 +188,8 @@ extern vm_offset_t vm_max_kernel_address;
 #define        SFBUF_MAP
 
 #define        PMAP_HAS_DMAP   0
+#define        PHYS_TO_DMAP(x) ({ panic("No direct map exists"); 0; })
+#define        DMAP_TO_PHYS(x) ({ panic("No direct map exists"); 0; })
 
 #define        DEVMAP_MAX_VADDR        ARM_VECTORS_HIGH
 

Modified: head/sys/compat/linuxkpi/common/src/linux_page.c
==============================================================================
--- head/sys/compat/linuxkpi/common/src/linux_page.c    Fri Jan 19 22:10:29 
2018        (r328177)
+++ head/sys/compat/linuxkpi/common/src/linux_page.c    Fri Jan 19 22:17:13 
2018        (r328178)
@@ -68,12 +68,8 @@ linux_page_address(struct page *page)
 {
 
        if (page->object != kmem_object && page->object != kernel_object) {
-#ifdef PHYS_TO_DMAP
                return (PMAP_HAS_DMAP ?
                    ((void *)PHYS_TO_DMAP(VM_PAGE_TO_PHYS(page))) : NULL);
-#else
-               return (NULL);
-#endif
        }
        return ((void *)(uintptr_t)(VM_MIN_KERNEL_ADDRESS +
            IDX_TO_OFF(page->pindex)));
@@ -82,66 +78,65 @@ linux_page_address(struct page *page)
 vm_page_t
 linux_alloc_pages(gfp_t flags, unsigned int order)
 {
-#ifdef PHYS_TO_DMAP
-       KASSERT(PMAP_HAS_DMAP, ("Direct map unavailable"));
-       unsigned long npages = 1UL << order;
-       int req = (flags & M_ZERO) ? (VM_ALLOC_ZERO | VM_ALLOC_NOOBJ |
-           VM_ALLOC_NORMAL) : (VM_ALLOC_NOOBJ | VM_ALLOC_NORMAL);
        vm_page_t page;
 
-       if (order == 0 && (flags & GFP_DMA32) == 0) {
-               page = vm_page_alloc(NULL, 0, req);
-               if (page == NULL)
-                       return (NULL);
-       } else {
-               vm_paddr_t pmax = (flags & GFP_DMA32) ?
-                   BUS_SPACE_MAXADDR_32BIT : BUS_SPACE_MAXADDR;
-retry:
-               page = vm_page_alloc_contig(NULL, 0, req,
-                   npages, 0, pmax, PAGE_SIZE, 0, VM_MEMATTR_DEFAULT);
+       if (PMAP_HAS_DMAP) {
+               unsigned long npages = 1UL << order;
+               int req = (flags & M_ZERO) ? (VM_ALLOC_ZERO | VM_ALLOC_NOOBJ |
+                   VM_ALLOC_NORMAL) : (VM_ALLOC_NOOBJ | VM_ALLOC_NORMAL);
 
-               if (page == NULL) {
-                       if (flags & M_WAITOK) {
-                               if (!vm_page_reclaim_contig(req,
-                                   npages, 0, pmax, PAGE_SIZE, 0)) {
-                                       VM_WAIT;
+               if (order == 0 && (flags & GFP_DMA32) == 0) {
+                       page = vm_page_alloc(NULL, 0, req);
+                       if (page == NULL)
+                               return (NULL);
+               } else {
+                       vm_paddr_t pmax = (flags & GFP_DMA32) ?
+                           BUS_SPACE_MAXADDR_32BIT : BUS_SPACE_MAXADDR;
+               retry:
+                       page = vm_page_alloc_contig(NULL, 0, req,
+                           npages, 0, pmax, PAGE_SIZE, 0, VM_MEMATTR_DEFAULT);
+
+                       if (page == NULL) {
+                               if (flags & M_WAITOK) {
+                                       if (!vm_page_reclaim_contig(req,
+                                           npages, 0, pmax, PAGE_SIZE, 0)) {
+                                               VM_WAIT;
+                                       }
+                                       flags &= ~M_WAITOK;
+                                       goto retry;
                                }
-                               flags &= ~M_WAITOK;
-                               goto retry;
+                               return (NULL);
                        }
-                       return (NULL);
                }
-       }
-       if (flags & M_ZERO) {
-               unsigned long x;
+               if (flags & M_ZERO) {
+                       unsigned long x;
 
-               for (x = 0; x != npages; x++) {
-                       vm_page_t pgo = page + x;
+                       for (x = 0; x != npages; x++) {
+                               vm_page_t pgo = page + x;
 
-                       if ((pgo->flags & PG_ZERO) == 0)
-                               pmap_zero_page(pgo);
+                               if ((pgo->flags & PG_ZERO) == 0)
+                                       pmap_zero_page(pgo);
+                       }
                }
-       }
-#else
-       vm_offset_t vaddr;
-       vm_page_t page;
+       } else {
+               vm_offset_t vaddr;
 
-       vaddr = linux_alloc_kmem(flags, order);
-       if (vaddr == 0)
-               return (NULL);
+               vaddr = linux_alloc_kmem(flags, order);
+               if (vaddr == 0)
+                       return (NULL);
 
-       page = PHYS_TO_VM_PAGE(vtophys((void *)vaddr));
+               page = PHYS_TO_VM_PAGE(vtophys((void *)vaddr));
 
-       KASSERT(vaddr == (vm_offset_t)page_address(page),
-           ("Page address mismatch"));
-#endif
+               KASSERT(vaddr == (vm_offset_t)page_address(page),
+                   ("Page address mismatch"));
+       }
+
        return (page);
 }
 
 void
 linux_free_pages(vm_page_t page, unsigned int order)
 {
-#ifdef PHYS_TO_DMAP
        if (PMAP_HAS_DMAP) {
                unsigned long npages = 1UL << order;
                unsigned long x;
@@ -154,15 +149,12 @@ linux_free_pages(vm_page_t page, unsigned int order)
                        vm_page_unlock(pgo);
                }
        } else {
-#endif
                vm_offset_t vaddr;
 
                vaddr = (vm_offset_t)page_address(page);
 
                linux_free_kmem(vaddr, order);
-#ifdef PHYS_TO_DMAP
        }
-#endif
 }
 
 vm_offset_t

Modified: head/sys/i386/include/vmparam.h
==============================================================================
--- head/sys/i386/include/vmparam.h     Fri Jan 19 22:10:29 2018        
(r328177)
+++ head/sys/i386/include/vmparam.h     Fri Jan 19 22:17:13 2018        
(r328178)
@@ -203,5 +203,7 @@
 #define        SFBUF_PROCESS_PAGE
 
 #define        PMAP_HAS_DMAP   0
+#define        PHYS_TO_DMAP(x) ({ panic("No direct map exists"); 0; })
+#define        DMAP_TO_PHYS(x) ({ panic("No direct map exists"); 0; })
 
 #endif /* _MACHINE_VMPARAM_H_ */

Modified: head/sys/sys/sf_buf.h
==============================================================================
--- head/sys/sys/sf_buf.h       Fri Jan 19 22:10:29 2018        (r328177)
+++ head/sys/sys/sf_buf.h       Fri Jan 19 22:17:13 2018        (r328178)
@@ -115,10 +115,8 @@ void sf_buf_ref(struct sf_buf *);
 static inline vm_offset_t
 sf_buf_kva(struct sf_buf *sf)
 {
-#ifdef PMAP_HAS_DMAP
        if (PMAP_HAS_DMAP)
                return (PHYS_TO_DMAP(VM_PAGE_TO_PHYS((vm_page_t)sf)));
-#endif
 
         return (sf->kva);
 }
@@ -126,10 +124,8 @@ sf_buf_kva(struct sf_buf *sf)
 static inline vm_page_t
 sf_buf_page(struct sf_buf *sf)
 {
-#ifdef PMAP_HAS_DMAP
        if (PMAP_HAS_DMAP)
                return ((vm_page_t)sf);
-#endif
 
         return (sf->m);
 }
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to