Use KPROCESSOR_MODE when mapping I/O space.

Signed-off-by: Fab Tillier <[email protected]>

diff -dwup3 -x *svn* -r 
c:\dev\openib\ofw\gen1\branches\mlx4_30\trunk\hw\mlx4\kernel\bus\inc\ib_verbs_ex.h
 .\hw\mlx4\kernel\bus\inc\ib_verbs_ex.h
--- 
c:\dev\openib\ofw\gen1\branches\mlx4_30\trunk\hw\mlx4\kernel\bus\inc\ib_verbs_ex.h
  Thu May 31 11:22:18 2012
+++ .\hw\mlx4\kernel\bus\inc\ib_verbs_ex.h      Thu Jul 26 15:31:14 2012
@@ -83,7 +83,6 @@ typedef struct {
        PVOID   uva;
        PMDL    mdl;
        PVOID   kva;
-       int             mapped;
 } umap_t;
 
 struct ib_ucontext_ex 
diff -dwup3 -x *svn* -r 
c:\dev\openib\ofw\gen1\branches\mlx4_30\trunk\hw\mlx4\kernel\hca\hverbs.c 
.\hw\mlx4\kernel\hca\hverbs.c
--- c:\dev\openib\ofw\gen1\branches\mlx4_30\trunk\hw\mlx4\kernel\hca\hverbs.c   
Thu May 31 11:22:19 2012
+++ .\hw\mlx4\kernel\hca\hverbs.c       Thu Jul 26 15:31:14 2012
@@ -554,6 +554,7 @@ int ib_destroy_srq(struct ib_srq *srq)
        IN              io_addr_t       addr,
        IN              SIZE_T          size,
        IN              MEMORY_CACHING_TYPE mem_type,
+       IN              KPROCESSOR_MODE mode,
        OUT             umap_t  *       p_map
        )
 {
@@ -561,8 +562,6 @@ static NTSTATUS __map_memory_for_user(
 
        HCA_ENTER(HCA_DBG_SHIM);
 
-       p_map->mapped = 0;
-       
        // map UAR to kernel 
        p_map->kva = ioremap(addr, size, mem_type);
        if (!p_map->kva) {
@@ -572,6 +571,14 @@ static NTSTATUS __map_memory_for_user(
                goto err_ioremap;
        }
 
+       if( mode == KernelMode )
+       {
+               p_map->mdl = NULL;
+               p_map->uva = p_map->kva;
+               status = STATUS_SUCCESS;
+               goto done;
+       }
+
        // build MDL 
        p_map->mdl = IoAllocateMdl( p_map->kva, (ULONG)size,
                FALSE, TRUE, NULL );
@@ -591,15 +598,16 @@ static NTSTATUS __map_memory_for_user(
                goto err_map;
        }
 
-       p_map->mapped = 1;
        status = STATUS_SUCCESS;
        goto done;
 
 err_map:
        IoFreeMdl(p_map->mdl);
+       p_map->mdl = NULL;
 
 err_alloc_mdl: 
        iounmap(p_map->kva, PAGE_SIZE);
+       p_map->kva = NULL;
 
 err_ioremap:
 done:  
@@ -611,11 +619,14 @@ static void __unmap_memory_for_user(
        IN              umap_t  *       p_map
        )
 {
-       if (p_map->mapped) {
-               p_map->mapped = 0;
+       if (p_map->mdl != NULL) {
                MmUnmapLockedPages( p_map->uva, p_map->mdl );
                IoFreeMdl(p_map->mdl);
+               p_map->mdl = NULL;
+       }
+       if( p_map->kva != NULL ){
                iounmap(p_map->kva, PAGE_SIZE);
+               p_map->kva = NULL;
        }
 }
 
@@ -658,7 +669,7 @@ ib_api_status_t ibv_um_open(        
        // map uar to user space
        status = __map_memory_for_user( 
                (io_addr_t)p_muctx->uar.pfn << PAGE_SHIFT, 
-               PAGE_SIZE, MmNonCached, &p_uctx->x.uar );
+               PAGE_SIZE, MmNonCached, mode, &p_uctx->x.uar );
        if( !NT_SUCCESS(status) ) {
                goto err_map_uar;
        }
@@ -677,7 +688,7 @@ ib_api_status_t ibv_um_open(        
                status = __map_memory_for_user( 
                        (io_addr_t)(p_muctx->uar.pfn + 
                        to_mdev(p_ibdev)->dev->caps.num_uars) << PAGE_SHIFT, 
-                       PAGE_SIZE, MmWriteCombined, &p_uctx->x.bf );
+                       PAGE_SIZE, MmWriteCombined, mode, &p_uctx->x.bf );
                if( !NT_SUCCESS(status) ) {
                        HCA_PRINT(TRACE_LEVEL_WARNING ,HCA_DBG_SHIM,
                                ("BlueFlame available, but failed to be mapped 
(%#x)\n", status));

Attachment: ndv2.12.patch
Description: ndv2.12.patch

_______________________________________________
ofw mailing list
[email protected]
http://lists.openfabrics.org/cgi-bin/mailman/listinfo/ofw

Reply via email to