[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[win-pv-devel] [PATCH] Get rid of Granter abstraction



Since the addition of GNTTAB Caches in XENBUS, the Granter abstraction in
XENVIF has been fairly pointless. This patch finally gets rid of it.

Signed-off-by: Paul Durrant <paul.durrant@xxxxxxxxxx>
---
 src/xenvif/frontend.c        |  96 +++++---------
 src/xenvif/frontend.h        |   7 -
 src/xenvif/granter.c         | 310 -------------------------------------------
 src/xenvif/granter.h         |  93 -------------
 src/xenvif/receiver.c        | 181 ++++++++++++++++++-------
 src/xenvif/transmitter.c     | 255 ++++++++++++++++++++++++-----------
 vs2012/xenvif/xenvif.vcxproj |   1 -
 vs2013/xenvif/xenvif.vcxproj |   1 -
 8 files changed, 343 insertions(+), 601 deletions(-)
 delete mode 100644 src/xenvif/granter.c
 delete mode 100644 src/xenvif/granter.h

diff --git a/src/xenvif/frontend.c b/src/xenvif/frontend.c
index 7e9989a..88e387f 100644
--- a/src/xenvif/frontend.c
+++ b/src/xenvif/frontend.c
@@ -43,7 +43,6 @@
 #include "thread.h"
 #include "frontend.h"
 #include "names.h"
-#include "granter.h"
 #include "mac.h"
 #include "tcpip.h"
 #include "receiver.h"
@@ -65,7 +64,6 @@ struct _XENVIF_FRONTEND {
     USHORT                      BackendDomain;
     ULONG                       QueueCount;
 
-    PXENVIF_GRANTER             Granter;
     PXENVIF_MAC                 Mac;
     PXENVIF_RECEIVER            Receiver;
     PXENVIF_TRANSMITTER         Transmitter;
@@ -290,7 +288,6 @@ FrontendGet ## _Function(                               \
     return __FrontendGet ## _Function ## (Frontend);    \
 }
 
-DEFINE_FRONTEND_GET_FUNCTION(Granter, PXENVIF_GRANTER)
 DEFINE_FRONTEND_GET_FUNCTION(Mac, PXENVIF_MAC)
 DEFINE_FRONTEND_GET_FUNCTION(Transmitter, PXENVIF_TRANSMITTER)
 DEFINE_FRONTEND_GET_FUNCTION(Receiver, PXENVIF_RECEIVER)
@@ -1407,22 +1404,18 @@ __FrontendConnect(
     if (!NT_SUCCESS(status))
         goto fail2;
 
-    status = GranterConnect(__FrontendGetGranter(Frontend));
-    if (!NT_SUCCESS(status))
-        goto fail3;
-
     status = MacConnect(__FrontendGetMac(Frontend));
     if (!NT_SUCCESS(status))
-        goto fail4;
+        goto fail3;
 
     __FrontendReadQueueCount(Frontend);
     status = ReceiverConnect(__FrontendGetReceiver(Frontend));
     if (!NT_SUCCESS(status))
-        goto fail5;
+        goto fail4;
 
     status = TransmitterConnect(__FrontendGetTransmitter(Frontend));
     if (!NT_SUCCESS(status))
-        goto fail6;
+        goto fail5;
 
     Attempt = 0;
     do {
@@ -1472,7 +1465,7 @@ abort:
     } while (status == STATUS_RETRY);
 
     if (!NT_SUCCESS(status))
-        goto fail7;
+        goto fail6;
 
     status = XENBUS_STORE(Printf,
                           &Frontend->StoreInterface,
@@ -1482,25 +1475,22 @@ abort:
                           "%u",
                           XenbusStateConnected);
     if (!NT_SUCCESS(status))
-        goto fail8;
+        goto fail7;
 
     State = XenbusStateInitWait;
     status = __FrontendWaitForStateChange(Frontend, Path, &State);
     if (!NT_SUCCESS(status))
-        goto fail9;
+        goto fail8;
 
     status = STATUS_UNSUCCESSFUL;
     if (State != XenbusStateConnected)
-        goto fail10;
+        goto fail9;
 
     ThreadWake(Frontend->MibThread);
 
     Trace("<====\n");
     return STATUS_SUCCESS;
 
-fail10:
-    Error("fail10\n");
-
 fail9:
     Error("fail9\n");
 
@@ -1510,22 +1500,20 @@ fail8:
 fail7:
     Error("fail7\n");
 
-    TransmitterDisconnect(__FrontendGetTransmitter(Frontend));
-
 fail6:
     Error("fail6\n");
 
-    ReceiverDisconnect(__FrontendGetReceiver(Frontend));
+    TransmitterDisconnect(__FrontendGetTransmitter(Frontend));
 
 fail5:
     Error("fail5\n");
 
-    MacDisconnect(__FrontendGetMac(Frontend));
+    ReceiverDisconnect(__FrontendGetReceiver(Frontend));
 
 fail4:
     Error("fail4\n");
 
-    GranterDisconnect(__FrontendGetGranter(Frontend));
+    MacDisconnect(__FrontendGetMac(Frontend));
 
 fail3:
     Error("fail3\n");
@@ -1557,7 +1545,6 @@ __FrontendDisconnect(
     TransmitterDisconnect(__FrontendGetTransmitter(Frontend));
     ReceiverDisconnect(__FrontendGetReceiver(Frontend));
     MacDisconnect(__FrontendGetMac(Frontend));
-    GranterDisconnect(__FrontendGetGranter(Frontend));
 
     XENBUS_DEBUG(Deregister,
                  &Frontend->DebugInterface,
@@ -1580,39 +1567,30 @@ __FrontendEnable(
 
     Trace("====>\n");
 
-    status = GranterEnable(__FrontendGetGranter(Frontend));
-    if (!NT_SUCCESS(status))
-        goto fail1;
-
     status = MacEnable(__FrontendGetMac(Frontend));
     if (!NT_SUCCESS(status))
-        goto fail2;
+        goto fail1;
 
     status = ReceiverEnable(__FrontendGetReceiver(Frontend));
     if (!NT_SUCCESS(status))
-        goto fail3;
+        goto fail2;
 
     status = TransmitterEnable(__FrontendGetTransmitter(Frontend));
     if (!NT_SUCCESS(status))
-        goto fail4;
+        goto fail3;
 
     Trace("<====\n");
     return STATUS_SUCCESS;
 
-fail4:
-    Error("fail4\n");
-
-    ReceiverDisable(__FrontendGetReceiver(Frontend));
-
 fail3:
     Error("fail3\n");
 
-    MacDisable(__FrontendGetMac(Frontend));
+    ReceiverDisable(__FrontendGetReceiver(Frontend));
 
 fail2:
     Error("fail2\n");
 
-    GranterDisable(__FrontendGetGranter(Frontend));
+    MacDisable(__FrontendGetMac(Frontend));
 
 fail1:
     Error("fail1 (%08x)\n", status);
@@ -1630,7 +1608,6 @@ __FrontendDisable(
     TransmitterDisable(__FrontendGetTransmitter(Frontend));
     ReceiverDisable(__FrontendGetReceiver(Frontend));
     MacDisable(__FrontendGetMac(Frontend));
-    GranterDisable(__FrontendGetGranter(Frontend));
 
     Trace("<====\n");
 }
@@ -1981,64 +1958,57 @@ FrontendInitialize(
     FdoGetSuspendInterface(PdoGetFdo(Pdo), &(*Frontend)->SuspendInterface);
     FdoGetStoreInterface(PdoGetFdo(Pdo), &(*Frontend)->StoreInterface);
 
-    status = GranterInitialize(*Frontend, &(*Frontend)->Granter);
-    if (!NT_SUCCESS(status))
-        goto fail6;
-
     status = MacInitialize(*Frontend, &(*Frontend)->Mac);
     if (!NT_SUCCESS(status))
-        goto fail7;
+        goto fail6;
 
     status = ReceiverInitialize(*Frontend, &(*Frontend)->Receiver);
     if (!NT_SUCCESS(status))
-        goto fail8;
+        goto fail7;
 
     status = TransmitterInitialize(*Frontend, &(*Frontend)->Transmitter);
     if (!NT_SUCCESS(status))
-        goto fail9;
+        goto fail8;
 
     status = ThreadCreate(FrontendEject, *Frontend, &(*Frontend)->EjectThread);
     if (!NT_SUCCESS(status))
-        goto fail10;
+        goto fail9;
 
     status = ThreadCreate(FrontendMib, *Frontend, &(*Frontend)->MibThread);
     if (!NT_SUCCESS(status))
-        goto fail11;
+        goto fail10;
 
     Trace("<====\n");
 
     return STATUS_SUCCESS;
 
-fail11:
-    Error("fail11\n");
+fail10:
+    Error("fail10\n");
 
     ThreadAlert((*Frontend)->EjectThread);
     ThreadJoin((*Frontend)->EjectThread);
     (*Frontend)->EjectThread = NULL;
 
-fail10:
-    Error("fail10\n");
+fail9:
+    Error("fail9\n");
 
     TransmitterTeardown(__FrontendGetTransmitter(*Frontend));
     (*Frontend)->Transmitter = NULL;
 
-fail9:
-    Error("fail9\n");
+fail8:
+    Error("fail8\n");
 
     ReceiverTeardown(__FrontendGetReceiver(*Frontend));
     (*Frontend)->Receiver = NULL;
 
-fail8:
-    Error("fail8\n");
+fail7:
+    Error("fail7\n");
 
     MacTeardown(__FrontendGetMac(*Frontend));
     (*Frontend)->Mac = NULL;
 
-fail7:
-    Error("fail7\n");
-
-    GranterTeardown(__FrontendGetGranter(*Frontend));
-    (*Frontend)->Granter = NULL;
+fail6:
+    Error("fail6\n");
 
     RtlZeroMemory(&(*Frontend)->StoreInterface,
                   sizeof (XENBUS_STORE_INTERFACE));
@@ -2049,9 +2019,6 @@ fail7:
     RtlZeroMemory(&(*Frontend)->DebugInterface,
                   sizeof (XENBUS_DEBUG_INTERFACE));
 
-fail6:
-    Error("fail6\n");
-
     (*Frontend)->State = FRONTEND_STATE_INVALID;
     RtlZeroMemory(&(*Frontend)->Lock, sizeof (KSPIN_LOCK));
 
@@ -2124,9 +2091,6 @@ FrontendTeardown(
     MacTeardown(__FrontendGetMac(Frontend));
     Frontend->Mac = NULL;
 
-    GranterTeardown(__FrontendGetGranter(Frontend));
-    Frontend->Granter = NULL;
-
     RtlZeroMemory(&Frontend->StoreInterface,
                   sizeof (XENBUS_STORE_INTERFACE));
 
diff --git a/src/xenvif/frontend.h b/src/xenvif/frontend.h
index 21a370a..adcf53c 100644
--- a/src/xenvif/frontend.h
+++ b/src/xenvif/frontend.h
@@ -129,13 +129,6 @@ FrontendFreePath(
     IN  PCHAR               Path
     );
 
-#include "granter.h"
-
-extern PXENVIF_GRANTER
-FrontendGetGranter(
-    IN  PXENVIF_FRONTEND    Frontend
-    );
-
 #include "mac.h"
 
 extern PXENVIF_MAC
diff --git a/src/xenvif/granter.c b/src/xenvif/granter.c
deleted file mode 100644
index 5efbf81..0000000
--- a/src/xenvif/granter.c
+++ /dev/null
@@ -1,310 +0,0 @@
-/* Copyright (c) Citrix Systems Inc.
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, 
- * with or without modification, are permitted provided 
- * that the following conditions are met:
- * 
- * *   Redistributions of source code must retain the above 
- *     copyright notice, this list of conditions and the 
- *     following disclaimer.
- * *   Redistributions in binary form must reproduce the above 
- *     copyright notice, this list of conditions and the 
- *     following disclaimer in the documentation and/or other 
- *     materials provided with the distribution.
- * 
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 
- * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, 
- * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR 
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 
- * SUCH DAMAGE.
- */
-
-#include <ntddk.h>
-#include <ntstrsafe.h>
-#include <stdlib.h>
-#include <util.h>
-
-#include "pdo.h"
-#include "frontend.h"
-#include "granter.h"
-#include "dbg_print.h"
-#include "assert.h"
-
-struct _XENVIF_GRANTER {
-    PXENVIF_FRONTEND        Frontend;
-    KSPIN_LOCK              Lock;
-    XENBUS_GNTTAB_INTERFACE GnttabInterface;
-    PXENBUS_GNTTAB_CACHE    Cache;
-};
-
-#define XENVIF_GRANTER_TAG  'NARG'
-
-#define MAXNAMELEN  128
-
-static FORCEINLINE PVOID
-__GranterAllocate(
-    IN  ULONG   Length
-    )
-{
-    return __AllocateNonPagedPoolWithTag(Length, XENVIF_GRANTER_TAG);
-}
-
-static FORCEINLINE VOID
-__GranterFree(
-    IN  PVOID   Buffer
-    )
-{
-    __FreePoolWithTag(Buffer, XENVIF_GRANTER_TAG);
-}
-
-NTSTATUS
-GranterInitialize(
-    IN  PXENVIF_FRONTEND    Frontend,
-    OUT PXENVIF_GRANTER     *Granter
-    )
-{
-    NTSTATUS                status;
-
-    *Granter = __GranterAllocate(sizeof (XENVIF_GRANTER));
-
-    status = STATUS_NO_MEMORY;
-    if (*Granter == NULL)
-        goto fail1;
-
-    KeInitializeSpinLock(&(*Granter)->Lock);
-
-    FdoGetGnttabInterface(PdoGetFdo(FrontendGetPdo(Frontend)),
-                          &(*Granter)->GnttabInterface);
-
-    (*Granter)->Frontend = Frontend;
-
-    return STATUS_SUCCESS;
-
-fail1:
-    Error("fail1 (%08x)\n", status);
-
-    return status;
-}
-
-static VOID
-__drv_requiresIRQL(DISPATCH_LEVEL)
-GranterAcquireLock(
-    IN  PVOID       Argument
-    )
-{
-    PXENVIF_GRANTER Granter = Argument;
-
-    ASSERT3U(KeGetCurrentIrql(), ==, DISPATCH_LEVEL);
-
-    KeAcquireSpinLockAtDpcLevel(&Granter->Lock);
-}
-
-static VOID
-__drv_requiresIRQL(DISPATCH_LEVEL)
-GranterReleaseLock(
-    IN  PVOID       Argument
-    )
-{
-    PXENVIF_GRANTER Granter = Argument;
-
-    ASSERT3U(KeGetCurrentIrql(), ==, DISPATCH_LEVEL);
-
-#pragma prefast(disable:26110)
-    KeReleaseSpinLockFromDpcLevel(&Granter->Lock);
-}
-
-NTSTATUS
-GranterConnect(
-    IN  PXENVIF_GRANTER Granter
-    )
-{
-    PXENVIF_FRONTEND    Frontend;
-    CHAR                Name[MAXNAMELEN];
-    ULONG               Index;
-    NTSTATUS            status;
-
-    Frontend = Granter->Frontend;
-
-    status = XENBUS_GNTTAB(Acquire, &Granter->GnttabInterface);
-    if (!NT_SUCCESS(status))
-        goto fail1;
-
-    status = RtlStringCbPrintfA(Name,
-                                sizeof (Name),
-                                "%s",
-                                FrontendGetPath(Granter->Frontend));
-    if (!NT_SUCCESS(status))
-        goto fail2;
-
-    for (Index = 0; Name[Index] != '\0'; Index++)
-        if (Name[Index] == '/')
-            Name[Index] = '_';
-
-    ASSERT3P(Granter->Cache, ==, NULL);
-
-    status = XENBUS_GNTTAB(CreateCache,
-                           &Granter->GnttabInterface,
-                           Name,
-                           0,
-                           GranterAcquireLock,
-                           GranterReleaseLock,
-                           Granter,
-                           &Granter->Cache);
-    if (!NT_SUCCESS(status))
-        goto fail3;
-
-    return STATUS_SUCCESS;
-
-fail3:
-    Error("fail3\n");
-
-fail2:
-    Error("fail2\n");
-
-    XENBUS_GNTTAB(Release, &Granter->GnttabInterface);
-
-fail1:
-    Error("fail1 (%08x)\n", status);
-
-    return status;
-}
-
-NTSTATUS
-GranterEnable(
-    IN  PXENVIF_GRANTER     Granter
-    )
-{
-    UNREFERENCED_PARAMETER(Granter);
-
-    return STATUS_SUCCESS;
-}
-
-NTSTATUS
-GranterPermitAccess(
-    IN  PXENVIF_GRANTER         Granter,
-    IN  PFN_NUMBER              Pfn,
-    IN  BOOLEAN                 ReadOnly,
-    OUT PXENVIF_GRANTER_HANDLE  Handle
-    )
-{
-    PXENVIF_FRONTEND            Frontend;
-    PXENBUS_GNTTAB_ENTRY        Entry;
-    NTSTATUS                    status;
-
-    Frontend = Granter->Frontend;
-
-    ASSERT3P(Granter->Cache, !=, NULL);
-
-    status = XENBUS_GNTTAB(PermitForeignAccess,
-                           &Granter->GnttabInterface,
-                           Granter->Cache,
-                           FALSE,
-                           FrontendGetBackendDomain(Frontend),
-                           Pfn,
-                           ReadOnly,
-                           &Entry);
-    if (!NT_SUCCESS(status))
-        goto fail1;
-
-    *Handle = Entry;
-    return STATUS_SUCCESS;
-
-fail1:
-    Error("fail1 (%08x)\n", status);
-
-    return status;
-}
-
-VOID
-GranterRevokeAccess(
-    IN  PXENVIF_GRANTER         Granter,
-    IN  XENVIF_GRANTER_HANDLE   Handle
-    )
-{
-    PXENVIF_FRONTEND            Frontend;
-    PXENBUS_GNTTAB_ENTRY        Entry = Handle;
-    NTSTATUS                    status;
-
-    Frontend = Granter->Frontend;
-
-    ASSERT3P(Granter->Cache, !=, NULL);
-
-    status = XENBUS_GNTTAB(RevokeForeignAccess,
-                           &Granter->GnttabInterface,
-                           Granter->Cache,
-                           FALSE,
-                           Entry);
-    ASSERT(NT_SUCCESS(status));
-}
-
-ULONG
-GranterGetReference(
-    IN  PXENVIF_GRANTER         Granter,
-    IN  XENVIF_GRANTER_HANDLE   Handle
-    )
-{
-    PXENVIF_FRONTEND            Frontend;
-    PXENBUS_GNTTAB_ENTRY        Entry;
-
-    Frontend = Granter->Frontend;
-
-    Entry = Handle;
-
-    return XENBUS_GNTTAB(GetReference,
-                         &Granter->GnttabInterface,
-                         Entry);
-}
-
-VOID
-GranterDisable(
-    IN  PXENVIF_GRANTER Granter
-    )
-{
-    UNREFERENCED_PARAMETER(Granter);
-}
-
-VOID
-GranterDisconnect(
-    IN  PXENVIF_GRANTER Granter
-    )
-{
-    PXENVIF_FRONTEND    Frontend;
-
-    Frontend = Granter->Frontend;
-
-    ASSERT3P(Granter->Cache, !=, NULL);
-
-    XENBUS_GNTTAB(DestroyCache,
-                  &Granter->GnttabInterface,
-                  Granter->Cache);
-    Granter->Cache = NULL;
-
-    XENBUS_GNTTAB(Release, &Granter->GnttabInterface);
-}
-
-VOID
-GranterTeardown(
-    IN  PXENVIF_GRANTER     Granter
-    )
-{
-    Granter->Frontend = NULL;
-
-    RtlZeroMemory(&Granter->GnttabInterface,
-                  sizeof (XENBUS_GNTTAB_INTERFACE));
-
-    RtlZeroMemory(&Granter->Lock, sizeof (KSPIN_LOCK));
-
-    ASSERT(IsZeroMemory(Granter, sizeof (XENVIF_GRANTER)));
-
-    __GranterFree(Granter);
-}
diff --git a/src/xenvif/granter.h b/src/xenvif/granter.h
deleted file mode 100644
index b9e51c3..0000000
--- a/src/xenvif/granter.h
+++ /dev/null
@@ -1,93 +0,0 @@
-/* Copyright (c) Citrix Systems Inc.
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, 
- * with or without modification, are permitted provided 
- * that the following conditions are met:
- * 
- * *   Redistributions of source code must retain the above 
- *     copyright notice, this list of conditions and the 
- *     following disclaimer.
- * *   Redistributions in binary form must reproduce the above 
- *     copyright notice, this list of conditions and the 
- *     following disclaimer in the documentation and/or other 
- *     materials provided with the distribution.
- * 
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 
- * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, 
- * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR 
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 
- * SUCH DAMAGE.
- */
-
-#ifndef _XENVIF_GRANTER_H
-#define _XENVIF_GRANTER_H
-
-#include <ntddk.h>
-#include <gnttab_interface.h>
-
-typedef struct _XENVIF_GRANTER  XENVIF_GRANTER, *PXENVIF_GRANTER;
-
-typedef PVOID   XENVIF_GRANTER_HANDLE, *PXENVIF_GRANTER_HANDLE;
-
-NTSTATUS
-GranterInitialize(
-    IN  PXENVIF_FRONTEND    Frontend,
-    OUT PXENVIF_GRANTER     *Granter
-    );
-
-NTSTATUS
-GranterConnect(
-    IN  PXENVIF_GRANTER     Granter
-    );
-
-NTSTATUS
-GranterEnable(
-    IN  PXENVIF_GRANTER     Granter
-    );
-
-NTSTATUS
-GranterPermitAccess(
-    IN  PXENVIF_GRANTER         Granter,
-    IN  PFN_NUMBER              Pfn,
-    IN  BOOLEAN                 ReadOnly,
-    OUT PXENVIF_GRANTER_HANDLE  Handle
-    );
-
-VOID
-GranterRevokeAccess(
-    IN  PXENVIF_GRANTER         Granter,
-    IN  XENVIF_GRANTER_HANDLE   Handle
-    );
-
-ULONG
-GranterGetReference(
-    IN  PXENVIF_GRANTER         Granter,
-    IN  XENVIF_GRANTER_HANDLE   Handle
-    );
-
-VOID
-GranterDisable(
-    IN  PXENVIF_GRANTER Granter
-    );
-
-VOID
-GranterDisconnect(
-    IN  PXENVIF_GRANTER Granter
-    );
-
-VOID
-GranterTeardown(
-    IN  PXENVIF_GRANTER Granter
-    );
-
-#endif  // _XENVIF_GRANTER_H
diff --git a/src/xenvif/receiver.c b/src/xenvif/receiver.c
index da869d9..5318baf 100644
--- a/src/xenvif/receiver.c
+++ b/src/xenvif/receiver.c
@@ -37,6 +37,7 @@
 #include <debug_interface.h>
 #include <store_interface.h>
 #include <cache_interface.h>
+#include <gnttab_interface.h>
 #include <evtchn_interface.h>
 
 // This should be in public/io/netif.h
@@ -50,7 +51,6 @@
 #include "frontend.h"
 #include "checksum.h"
 #include "parse.h"
-#include "granter.h"
 #include "mac.h"
 #include "transmitter.h"
 #include "vif.h"
@@ -66,7 +66,7 @@ typedef struct _XENVIF_RECEIVER_FRAGMENT {
     LIST_ENTRY              ListEntry;
     ULONG                   Next;
     PVOID                   Context;
-    XENVIF_GRANTER_HANDLE   Handle;
+    PXENBUS_GNTTAB_ENTRY    Entry;
 } XENVIF_RECEIVER_FRAGMENT, *PXENVIF_RECEIVER_FRAGMENT;
 
 #define XENVIF_RECEIVER_RING_SIZE   (__CONST_RING_SIZE(netif_rx, PAGE_SIZE))
@@ -80,10 +80,11 @@ typedef struct _XENVIF_RECEIVER_RING {
     KSPIN_LOCK                  Lock;
     PXENBUS_CACHE               PacketCache;
     PXENBUS_CACHE               FragmentCache;
+    PXENBUS_GNTTAB_CACHE        GnttabCache;
     PMDL                        Mdl;
     netif_rx_front_ring_t       Front;
     netif_rx_sring_t            *Shared;
-    XENVIF_GRANTER_HANDLE       Handle;
+    PXENBUS_GNTTAB_ENTRY        Entry;
     PXENBUS_EVTCHN_CHANNEL      Channel;
     KDPC                        Dpc;
     ULONG                       Dpcs;
@@ -104,6 +105,7 @@ typedef struct _XENVIF_RECEIVER_RING {
 struct _XENVIF_RECEIVER {
     PXENVIF_FRONTEND        Frontend;
     XENBUS_CACHE_INTERFACE  CacheInterface;
+    XENBUS_GNTTAB_INTERFACE GnttabInterface;
     XENBUS_EVTCHN_INTERFACE EvtchnInterface;
     PXENVIF_RECEIVER_RING   Rings[MAXIMUM_PROCESSORS];
     BOOLEAN                 Split;
@@ -1449,6 +1451,7 @@ __ReceiverRingPreparePacket(
     PXENVIF_FRONTEND            Frontend;
     PXENVIF_RECEIVER_FRAGMENT   Fragment;
     PMDL                        Mdl;
+    PFN_NUMBER                  Pfn;
     NTSTATUS                    status;
 
     Receiver = Ring->Receiver;
@@ -1462,10 +1465,16 @@ __ReceiverRingPreparePacket(
 
     Mdl = &Packet->Mdl;
 
-    status = GranterPermitAccess(FrontendGetGranter(Frontend),
-                                 MmGetMdlPfnArray(Mdl)[0],
-                                 FALSE,
-                                 &Fragment->Handle);
+    Pfn = MmGetMdlPfnArray(Mdl)[0];
+
+    status = XENBUS_GNTTAB(PermitForeignAccess,
+                           &Receiver->GnttabInterface,
+                           Ring->GnttabCache,
+                           TRUE,
+                           FrontendGetBackendDomain(Frontend),
+                           Pfn,
+                           FALSE,
+                           &Fragment->Entry);
     if (!NT_SUCCESS(status))
         goto fail2;
 
@@ -1555,8 +1564,9 @@ ReceiverRingFill(
         Ring->RequestsPosted++;
 
         req->id = id;
-        req->gref = GranterGetReference(FrontendGetGranter(Frontend),
-                                        Fragment->Handle);
+        req->gref = XENBUS_GNTTAB(GetReference,
+                                  &Receiver->GnttabInterface,
+                                  Fragment->Entry);
 
         ASSERT3U(id, <=, XENVIF_RECEIVER_MAXIMUM_FRAGMENT_ID);
         ASSERT3P(Ring->Pending[id], ==, NULL);
@@ -1604,9 +1614,12 @@ __ReceiverRingEmpty(
         Mdl = Fragment->Context;
         Fragment->Context = NULL;
 
-        GranterRevokeAccess(FrontendGetGranter(Frontend),
-                            Fragment->Handle);
-        Fragment->Handle = NULL;
+        (VOID) XENBUS_GNTTAB(RevokeForeignAccess,
+                             &Receiver->GnttabInterface,
+                             Ring->GnttabCache,
+                             TRUE,
+                             Fragment->Entry);
+        Fragment->Entry = NULL;
 
         __ReceiverRingPutFragment(Ring, Fragment);
 
@@ -1738,9 +1751,12 @@ ReceiverRingPoll(
             Mdl = Fragment->Context;
             Fragment->Context = NULL;
 
-            GranterRevokeAccess(FrontendGetGranter(Frontend),
-                                Fragment->Handle);
-            Fragment->Handle = NULL;
+            (VOID) XENBUS_GNTTAB(RevokeForeignAccess,
+                                 &Receiver->GnttabInterface,
+                                 Ring->GnttabCache,
+                                 TRUE,
+                                 Fragment->Entry);
+            Fragment->Entry = NULL;
 
             __ReceiverRingPutFragment(Ring, Fragment);
 
@@ -2157,16 +2173,39 @@ __ReceiverRingConnect(
     PXENVIF_FRONTEND            Frontend;
     PFN_NUMBER                  Pfn;
     CHAR                        Name[MAXNAMELEN];
+    ULONG                       Index;
     NTSTATUS                    status;
 
     Receiver = Ring->Receiver;
     Frontend = Receiver->Frontend;
 
+    status = RtlStringCbPrintfA(Name,
+                                sizeof (Name),
+                                "%s_receiver",
+                                Ring->Path);
+    if (!NT_SUCCESS(status))
+        goto fail1;
+
+    for (Index = 0; Name[Index] != '\0'; Index++)
+        if (Name[Index] == '/')
+            Name[Index] = '_';
+
+    status = XENBUS_GNTTAB(CreateCache,
+                           &Receiver->GnttabInterface,
+                           Name,
+                           0,
+                           ReceiverRingAcquireLock,
+                           ReceiverRingReleaseLock,
+                           Ring,
+                           &Ring->GnttabCache);
+    if (!NT_SUCCESS(status))
+        goto fail2;
+
     Ring->Mdl = __AllocatePage();
 
     status = STATUS_NO_MEMORY;
     if (Ring->Mdl == NULL)
-        goto fail1;
+        goto fail3;
 
     Ring->Shared = MmGetSystemAddressForMdlSafe(Ring->Mdl, NormalPagePriority);
     ASSERT(Ring->Shared != NULL);
@@ -2177,19 +2216,23 @@ __ReceiverRingConnect(
 
     Pfn = MmGetMdlPfnArray(Ring->Mdl)[0];
     
-    status = GranterPermitAccess(FrontendGetGranter(Frontend),
-                                 Pfn,
-                                 FALSE,
-                                 &Ring->Handle);
+    status = XENBUS_GNTTAB(PermitForeignAccess,
+                           &Receiver->GnttabInterface,
+                           Ring->GnttabCache,
+                           TRUE,
+                           FrontendGetBackendDomain(Frontend),
+                           Pfn,
+                           FALSE,
+                           &Ring->Entry);
     if (!NT_SUCCESS(status))
-        goto fail2;
+        goto fail4;
 
     status = RtlStringCbPrintfA(Name,
                                 sizeof (Name),
                                 __MODULE__ "|RECEIVER[%u]",
                                 Ring->Index);
     if (!NT_SUCCESS(status))
-        goto fail3;
+        goto fail5;
 
     ASSERT(!Ring->Connected);
 
@@ -2203,7 +2246,7 @@ __ReceiverRingConnect(
 
     status = STATUS_UNSUCCESSFUL;
     if (Ring->Channel == NULL)
-        goto fail4;
+        goto fail6;
 
     if (FrontendGetQueueCount(Frontend) > 1) {
         (VOID) XENBUS_EVTCHN(Bind,
@@ -2229,12 +2272,12 @@ __ReceiverRingConnect(
                           Ring,
                           &Ring->DebugCallback);
     if (!NT_SUCCESS(status))
-        goto fail5;
+        goto fail7;
 
     return STATUS_SUCCESS;
 
-fail5:
-    Error("fail5\n");
+fail7:
+    Error("fail7\n");
 
     Ring->Connected = FALSE;
 
@@ -2245,18 +2288,21 @@ fail5:
 
     Ring->Events = 0;
 
-fail4:
-    Error("fail4\n");
+fail6:
+    Error("fail6\n");
 
-fail3:
-    Error("fail3\n");
+fail5:
+    Error("fail5\n");
 
-    GranterRevokeAccess(FrontendGetGranter(Frontend),
-                        Ring->Handle);
-    Ring->Handle = NULL;
+    (VOID) XENBUS_GNTTAB(RevokeForeignAccess,
+                         &Receiver->GnttabInterface,
+                         Ring->GnttabCache,
+                         TRUE,
+                         Ring->Entry);
+    Ring->Entry = NULL;
 
-fail2:
-    Error("fail2\n");
+fail4:
+    Error("fail4\n");
 
     RtlZeroMemory(&Ring->Front, sizeof (netif_rx_front_ring_t));
     RtlZeroMemory(Ring->Shared, PAGE_SIZE);
@@ -2265,6 +2311,17 @@ fail2:
     __FreePage(Ring->Mdl);
     Ring->Mdl = NULL;
 
+fail3:
+    Error("fail3\n");
+
+    XENBUS_GNTTAB(DestroyCache,
+                  &Receiver->GnttabInterface,
+                  Ring->GnttabCache);
+    Ring->GnttabCache = NULL;
+
+fail2:
+    Error("fail2\n");
+
 fail1:
     Error("fail1 (%08x)\n", status);
 
@@ -2297,9 +2354,9 @@ __ReceiverRingStoreWrite(
                           Path,
                           "rx-ring-ref",
                           "%u",
-                          GranterGetReference(FrontendGetGranter(Frontend),
-                                              Ring->Handle));
-
+                          XENBUS_GNTTAB(GetReference,
+                                        &Receiver->GnttabInterface,
+                                        Ring->Entry));
     if (!NT_SUCCESS(status))
         goto fail1;
 
@@ -2417,9 +2474,12 @@ __ReceiverRingDisconnect(
                  Ring->DebugCallback);
     Ring->DebugCallback = NULL;
 
-    GranterRevokeAccess(FrontendGetGranter(Frontend),
-                        Ring->Handle);
-    Ring->Handle = NULL;
+    (VOID) XENBUS_GNTTAB(RevokeForeignAccess,
+                         &Receiver->GnttabInterface,
+                         Ring->GnttabCache,
+                         TRUE,
+                         Ring->Entry);
+    Ring->Entry = NULL;
 
     RtlZeroMemory(&Ring->Front, sizeof (netif_rx_front_ring_t));
     RtlZeroMemory(Ring->Shared, PAGE_SIZE);
@@ -2427,6 +2487,11 @@ __ReceiverRingDisconnect(
     Ring->Shared = NULL;
     __FreePage(Ring->Mdl);
     Ring->Mdl = NULL;
+
+    XENBUS_GNTTAB(DestroyCache,
+                  &Receiver->GnttabInterface,
+                  Ring->GnttabCache);
+    Ring->GnttabCache = NULL;
 }
 
 static FORCEINLINE VOID
@@ -2592,6 +2657,9 @@ ReceiverInitialize(
     FdoGetCacheInterface(PdoGetFdo(FrontendGetPdo(Frontend)),
                          &(*Receiver)->CacheInterface);
 
+    FdoGetGnttabInterface(PdoGetFdo(FrontendGetPdo(Frontend)),
+                          &(*Receiver)->GnttabInterface);
+
     FdoGetEvtchnInterface(PdoGetFdo(FrontendGetPdo(Frontend)),
                           &(*Receiver)->EvtchnInterface);
 
@@ -2639,6 +2707,9 @@ fail2:
     RtlZeroMemory(&(*Receiver)->EvtchnInterface,
                   sizeof (XENBUS_EVTCHN_INTERFACE));
 
+    RtlZeroMemory(&(*Receiver)->GnttabInterface,
+                  sizeof (XENBUS_GNTTAB_INTERFACE));
+
     RtlZeroMemory(&(*Receiver)->CacheInterface,
                   sizeof (XENBUS_CACHE_INTERFACE));
 
@@ -2692,6 +2763,10 @@ ReceiverConnect(
     if (!NT_SUCCESS(status))
         goto fail3;
 
+    status = XENBUS_GNTTAB(Acquire, &Receiver->GnttabInterface);
+    if (!NT_SUCCESS(status))
+        goto fail4;
+
     status = XENBUS_STORE(Read,
                           &Receiver->StoreInterface,
                           NULL,
@@ -2720,7 +2795,7 @@ ReceiverConnect(
 
         status = __ReceiverRingConnect(Ring);
         if (!NT_SUCCESS(status))
-            goto fail4;
+            goto fail5;
     }    
 
     status = XENBUS_DEBUG(Register,
@@ -2730,16 +2805,16 @@ ReceiverConnect(
                           Receiver,
                           &Receiver->DebugCallback);
     if (!NT_SUCCESS(status))
-        goto fail5;
+        goto fail6;
 
     return STATUS_SUCCESS;
 
+fail6:
+    Error("fail6\n");
+
 fail5:
     Error("fail5\n");
 
-fail4:
-    Error("fail4\n");
-
     for (Index = 0; Index < Count; ++Index) {
         PXENVIF_RECEIVER_RING   Ring;
 
@@ -2750,6 +2825,11 @@ fail4:
         __ReceiverRingDisconnect(Ring);
     }
 
+    XENBUS_GNTTAB(Release, &Receiver->GnttabInterface);
+
+fail4:
+    Error("fail4\n");
+
     XENBUS_EVTCHN(Release, &Receiver->EvtchnInterface);
 
 fail3:
@@ -3039,11 +3119,13 @@ ReceiverDisconnect(
         __ReceiverRingDisconnect(Ring);
     }
 
+    XENBUS_GNTTAB(Release, &Receiver->GnttabInterface);
+
+    XENBUS_EVTCHN(Release, &Receiver->EvtchnInterface);
+
     XENBUS_STORE(Release, &Receiver->StoreInterface);
 
     XENBUS_DEBUG(Release, &Receiver->DebugInterface);
-
-    XENBUS_EVTCHN(Release, &Receiver->EvtchnInterface);
 }
 
 VOID
@@ -3080,6 +3162,9 @@ ReceiverTeardown(
     RtlZeroMemory(&Receiver->EvtchnInterface,
                   sizeof (XENBUS_EVTCHN_INTERFACE));
 
+    RtlZeroMemory(&Receiver->GnttabInterface,
+                  sizeof (XENBUS_GNTTAB_INTERFACE));
+
     RtlZeroMemory(&Receiver->CacheInterface,
                   sizeof (XENBUS_CACHE_INTERFACE));
 
diff --git a/src/xenvif/transmitter.c b/src/xenvif/transmitter.c
index 28b2613..7ccd675 100644
--- a/src/xenvif/transmitter.c
+++ b/src/xenvif/transmitter.c
@@ -49,7 +49,6 @@
 #include "checksum.h"
 #include "parse.h"
 #include "transmitter.h"
-#include "granter.h"
 #include "mac.h"
 #include "vif.h"
 #include "thread.h"
@@ -80,7 +79,7 @@ typedef struct _XENVIF_TRANSMITTER_FRAGMENT {
     USHORT                              Id;
     XENVIF_TRANSMITTER_FRAGMENT_TYPE    Type;
     PVOID                               Context;
-    XENVIF_GRANTER_HANDLE               Handle;
+    PXENBUS_GNTTAB_ENTRY                Entry;
     ULONG                               Offset;
     ULONG                               Length;
     BOOLEAN                             Extra;
@@ -106,11 +105,12 @@ typedef struct _XENVIF_TRANSMITTER_RING {
     PCHAR                           Path;
     PXENBUS_CACHE                   BufferCache;
     PXENBUS_CACHE                   FragmentCache;
+    PXENBUS_GNTTAB_CACHE            GnttabCache;
     PXENBUS_RANGE_SET               RangeSet;
     PMDL                            Mdl;
     netif_tx_front_ring_t           Front;
     netif_tx_sring_t                *Shared;
-    XENVIF_GRANTER_HANDLE           Handle;
+    PXENBUS_GNTTAB_ENTRY            Entry;
     PXENBUS_EVTCHN_CHANNEL          Channel;
     KDPC                            Dpc;
     ULONG                           Dpcs;
@@ -145,6 +145,7 @@ typedef struct _XENVIF_TRANSMITTER_RING {
 struct _XENVIF_TRANSMITTER {
     PXENVIF_FRONTEND            Frontend;
     XENBUS_CACHE_INTERFACE      CacheInterface;
+    XENBUS_GNTTAB_INTERFACE     GnttabInterface;
     XENBUS_RANGE_SET_INTERFACE  RangeSetInterface;
     XENBUS_EVTCHN_INTERFACE     EvtchnInterface;
     PXENVIF_TRANSMITTER_RING    Rings[MAXIMUM_PROCESSORS];
@@ -657,10 +658,14 @@ __TransmitterRingCopyPayload(
 
         Pfn = MmGetMdlPfnArray(Mdl)[0];
 
-        status = GranterPermitAccess(FrontendGetGranter(Frontend),
-                                     Pfn,
-                                     TRUE,
-                                     &Fragment->Handle);
+        status = XENBUS_GNTTAB(PermitForeignAccess,
+                               &Transmitter->GnttabInterface,
+                               Ring->GnttabCache,
+                               TRUE,
+                               FrontendGetBackendDomain(Frontend),
+                               Pfn,
+                               TRUE,
+                               &Fragment->Entry);
         if (!NT_SUCCESS(status))
             goto fail3;
 
@@ -719,9 +724,12 @@ fail1:
         Fragment->Length = 0;
         Fragment->Offset = 0;
 
-        GranterRevokeAccess(FrontendGetGranter(Frontend),
-                            Fragment->Handle);
-        Fragment->Handle = NULL;
+        (VOID) XENBUS_GNTTAB(RevokeForeignAccess,
+                             &Transmitter->GnttabInterface,
+                             Ring->GnttabCache,
+                             TRUE,
+                             Fragment->Entry);
+        Fragment->Entry = NULL;
 
         ASSERT3U(Fragment->Type, ==, XENVIF_TRANSMITTER_FRAGMENT_TYPE_BUFFER);
         Buffer = Fragment->Context;
@@ -803,10 +811,14 @@ __TransmitterRingGrantPayload(
             PageOffset = MdlOffset & (PAGE_SIZE - 1);
             PageLength = __min(MdlLength, PAGE_SIZE - PageOffset);
 
-            status = GranterPermitAccess(FrontendGetGranter(Frontend),
-                                         Pfn,
-                                         TRUE,
-                                         &Fragment->Handle);
+            status = XENBUS_GNTTAB(PermitForeignAccess,
+                                   &Transmitter->GnttabInterface,
+                                   Ring->GnttabCache,
+                                   TRUE,
+                                   FrontendGetBackendDomain(Frontend),
+                                   Pfn,
+                                   TRUE,
+                                   &Fragment->Entry);
             if (!NT_SUCCESS(status))
                 goto fail2;
 
@@ -877,9 +889,12 @@ fail1:
         Fragment->Length = 0;
         Fragment->Offset = 0;
 
-        GranterRevokeAccess(FrontendGetGranter(Frontend),
-                            Fragment->Handle);
-        Fragment->Handle = NULL;
+        (VOID) XENBUS_GNTTAB(RevokeForeignAccess,
+                             &Transmitter->GnttabInterface,
+                             Ring->GnttabCache,
+                             TRUE,
+                             Fragment->Entry);
+        Fragment->Entry = NULL;
 
         ASSERT3P(Fragment->Context, ==, Packet);
         Fragment->Context = NULL;
@@ -959,10 +974,14 @@ __TransmitterRingPrepareHeader(
 
     Pfn = MmGetMdlPfnArray(Mdl)[0];
 
-    status = GranterPermitAccess(FrontendGetGranter(Frontend),
-                                 Pfn,
-                                 TRUE,
-                                 &Fragment->Handle);
+    status = XENBUS_GNTTAB(PermitForeignAccess,
+                           &Transmitter->GnttabInterface,
+                           Ring->GnttabCache,
+                           TRUE,
+                           FrontendGetBackendDomain(Frontend),
+                           Pfn,
+                           TRUE,
+                           &Fragment->Entry);
     if (!NT_SUCCESS(status))
         goto fail4;
 
@@ -1126,9 +1145,12 @@ fail5:
     Fragment->Length = 0;
     Fragment->Offset = 0;
 
-    GranterRevokeAccess(FrontendGetGranter(Frontend),
-                        Fragment->Handle);
-    Fragment->Handle = NULL;
+    (VOID) XENBUS_GNTTAB(RevokeForeignAccess,
+                         &Transmitter->GnttabInterface,
+                         Ring->GnttabCache,
+                         TRUE,
+                         Fragment->Entry);
+    Fragment->Entry = NULL;
 
 fail4:
     Error("fail4\n");
@@ -1193,9 +1215,12 @@ __TransmitterRingUnprepareFragments(
         Fragment->Length = 0;
         Fragment->Offset = 0;
 
-        GranterRevokeAccess(FrontendGetGranter(Frontend),
-                            Fragment->Handle);
-        Fragment->Handle = NULL;
+        (VOID) XENBUS_GNTTAB(RevokeForeignAccess,
+                             &Transmitter->GnttabInterface,
+                             Ring->GnttabCache,
+                             TRUE,
+                             Fragment->Entry);
+        Fragment->Entry = NULL;
 
         switch (Fragment->Type) {
         case XENVIF_TRANSMITTER_FRAGMENT_TYPE_BUFFER: {
@@ -1501,10 +1526,14 @@ __TransmitterRingPrepareArp(
 
     Pfn = MmGetMdlPfnArray(Mdl)[0];
 
-    status = GranterPermitAccess(FrontendGetGranter(Frontend),
-                                 Pfn,
-                                 TRUE,
-                                 &Fragment->Handle);
+    status = XENBUS_GNTTAB(PermitForeignAccess,
+                           &Transmitter->GnttabInterface,
+                           Ring->GnttabCache,
+                           TRUE,
+                           FrontendGetBackendDomain(Frontend),
+                           Pfn,
+                           TRUE,
+                           &Fragment->Entry);
     if (!NT_SUCCESS(status))
         goto fail3;
 
@@ -1674,10 +1703,14 @@ __TransmitterRingPrepareNeighbourAdvertisement(
 
     Pfn = MmGetMdlPfnArray(Mdl)[0];
 
-    status = GranterPermitAccess(FrontendGetGranter(Frontend),
-                                 Pfn,
-                                 TRUE,
-                                 &Fragment->Handle);
+    status = XENBUS_GNTTAB(PermitForeignAccess,
+                           &Transmitter->GnttabInterface,
+                           Ring->GnttabCache,
+                           TRUE,
+                           FrontendGetBackendDomain(Frontend),
+                           Pfn,
+                           TRUE,
+                           &Fragment->Entry);
     if (!NT_SUCCESS(status))
         goto fail3;
 
@@ -1789,8 +1822,9 @@ __TransmitterRingPostFragments(
         Ring->RequestsPosted++;
 
         req->id = Fragment->Id;
-        req->gref = GranterGetReference(FrontendGetGranter(Frontend),
-                                        Fragment->Handle);
+        req->gref = XENBUS_GNTTAB(GetReference,
+                                  &Transmitter->GnttabInterface,
+                                  Fragment->Entry);
         req->offset = (USHORT)Fragment->Offset;
         req->size = (USHORT)Fragment->Length;
         req->flags = NETTXF_more_data;
@@ -2104,9 +2138,12 @@ TransmitterRingPoll(
             Fragment->Length = 0;
             Fragment->Offset = 0;
 
-            GranterRevokeAccess(FrontendGetGranter(Frontend),
-                                Fragment->Handle);
-            Fragment->Handle = NULL;
+            (VOID) XENBUS_GNTTAB(RevokeForeignAccess,
+                                 &Transmitter->GnttabInterface,
+                                 Ring->GnttabCache,
+                                 TRUE,
+                                 Fragment->Entry);
+            Fragment->Entry = NULL;
 
             Fragment->Extra = FALSE;
             __TransmitterPutFragment(Ring, Fragment);
@@ -2900,7 +2937,7 @@ __TransmitterRingInitialize(
                           TransmitterFragmentDtor,
                           TransmitterRingAcquireLock,
                           TransmitterRingReleaseLock,
-                          (*Ring),
+                          *Ring,
                           &(*Ring)->FragmentCache);
     if (!NT_SUCCESS(status))
         goto fail9;
@@ -2991,6 +3028,7 @@ __TransmitterRingConnect(
     PXENVIF_FRONTEND                Frontend;
     PFN_NUMBER                      Pfn;
     CHAR                            Name[MAXNAMELEN];
+    ULONG                           Index;
     NTSTATUS                        status;
 
     ASSERT(!Ring->Connected);
@@ -2998,11 +3036,33 @@ __TransmitterRingConnect(
     Transmitter = Ring->Transmitter;
     Frontend = Transmitter->Frontend;
 
+    status = RtlStringCbPrintfA(Name,
+                                sizeof (Name),
+                                "%s_transmitter",
+                                Ring->Path);
+    if (!NT_SUCCESS(status))
+        goto fail1;
+
+    for (Index = 0; Name[Index] != '\0'; Index++)
+        if (Name[Index] == '/')
+            Name[Index] = '_';
+
+    status = XENBUS_GNTTAB(CreateCache,
+                           &Transmitter->GnttabInterface,
+                           Name,
+                           0,
+                           TransmitterRingAcquireLock,
+                           TransmitterRingReleaseLock,
+                           Ring,
+                           &Ring->GnttabCache);
+    if (!NT_SUCCESS(status))
+        goto fail2;
+
     Ring->Mdl = __AllocatePage();
 
     status = STATUS_NO_MEMORY;
     if (Ring->Mdl == NULL)
-        goto fail1;
+        goto fail3;
 
     Ring->Shared = MmGetSystemAddressForMdlSafe(Ring->Mdl, NormalPagePriority);
     ASSERT(Ring->Shared != NULL);
@@ -3013,19 +3073,23 @@ __TransmitterRingConnect(
 
     Pfn = MmGetMdlPfnArray(Ring->Mdl)[0];
 
-    status = GranterPermitAccess(FrontendGetGranter(Frontend),
-                                 Pfn,
-                                 FALSE,
-                                 &Ring->Handle);
+    status = XENBUS_GNTTAB(PermitForeignAccess,
+                           &Transmitter->GnttabInterface,
+                           Ring->GnttabCache,
+                           TRUE,
+                           FrontendGetBackendDomain(Frontend),
+                           Pfn,
+                           FALSE,
+                           &Ring->Entry);
     if (!NT_SUCCESS(status))
-        goto fail2;
+        goto fail4;
 
     status = RtlStringCbPrintfA(Name,
                                 sizeof (Name),
                                 __MODULE__ "|TRANSMITTER[%u]",
                                 Ring->Index);
     if (!NT_SUCCESS(status))
-        goto fail3;
+        goto fail5;
 
     ASSERT3U(KeGetCurrentIrql(), ==, DISPATCH_LEVEL);
 
@@ -3040,7 +3104,7 @@ __TransmitterRingConnect(
 
         status = STATUS_UNSUCCESSFUL;
         if (Ring->Channel == NULL)
-            goto fail4;
+            goto fail6;
 
         if (FrontendGetQueueCount(Frontend) > 1) {
             (VOID) XENBUS_EVTCHN(Bind,
@@ -3065,14 +3129,14 @@ __TransmitterRingConnect(
                           Ring,
                           &Ring->DebugCallback);
     if (!NT_SUCCESS(status))
-        goto fail5;
+        goto fail7;
 
     Ring->Connected = TRUE;
 
     return STATUS_SUCCESS;
 
-fail5:
-    Error("fail5\n");
+fail7:
+    Error("fail7\n");
 
     XENBUS_EVTCHN(Close,
                   &Transmitter->EvtchnInterface,
@@ -3081,18 +3145,21 @@ fail5:
 
     Ring->Events = 0;
 
-fail4:
-    Error("fail4\n");
+fail6:
+    Error("fail6\n");
 
-fail3:
-    Error("fail3\n");
+fail5:
+    Error("fail5\n");
 
-    GranterRevokeAccess(FrontendGetGranter(Frontend),
-                        Ring->Handle);
-    Ring->Handle = NULL;
+    (VOID) XENBUS_GNTTAB(RevokeForeignAccess,
+                         &Transmitter->GnttabInterface,
+                         Ring->GnttabCache,
+                         TRUE,
+                         Ring->Entry);
+    Ring->Entry = NULL;
 
-fail2:
-    Error("fail2\n");
+fail4:
+    Error("fail4\n");
 
     RtlZeroMemory(&Ring->Front, sizeof (netif_tx_front_ring_t));
     RtlZeroMemory(Ring->Shared, PAGE_SIZE);
@@ -3101,6 +3168,17 @@ fail2:
     __FreePage(Ring->Mdl);
     Ring->Mdl = NULL;
 
+fail3:
+    Error("fail3\n");
+
+    XENBUS_GNTTAB(DestroyCache,
+                  &Transmitter->GnttabInterface,
+                  Ring->GnttabCache);
+    Ring->GnttabCache = NULL;
+
+fail2:
+    Error("fail2\n");
+
 fail1:
     Error("fail1 (%08x)\n", status);
 
@@ -3133,9 +3211,9 @@ __TransmitterRingStoreWrite(
                           Path,
                           "tx-ring-ref",
                           "%u",
-                          GranterGetReference(FrontendGetGranter(Frontend),
-                                              Ring->Handle));
-
+                          XENBUS_GNTTAB(GetReference,
+                                        &Transmitter->GnttabInterface,
+                                        Ring->Entry));
     if (!NT_SUCCESS(status))
         goto fail1;
 
@@ -3292,9 +3370,12 @@ __TransmitterRingDisconnect(
                  Ring->DebugCallback);
     Ring->DebugCallback = NULL;
 
-    GranterRevokeAccess(FrontendGetGranter(Frontend),
-                        Ring->Handle);
-    Ring->Handle = NULL;
+    (VOID) XENBUS_GNTTAB(RevokeForeignAccess,
+                         &Transmitter->GnttabInterface,
+                         Ring->GnttabCache,
+                         TRUE,
+                         Ring->Entry);
+    Ring->Entry = NULL;
 
     RtlZeroMemory(&Ring->Front, sizeof (netif_tx_front_ring_t));
     RtlZeroMemory(Ring->Shared, PAGE_SIZE);
@@ -3303,6 +3384,10 @@ __TransmitterRingDisconnect(
     __FreePage(Ring->Mdl);
     Ring->Mdl = NULL;
 
+    XENBUS_GNTTAB(DestroyCache,
+                  &Transmitter->GnttabInterface,
+                  Ring->GnttabCache);
+    Ring->GnttabCache = NULL;
 }
 
 static FORCEINLINE VOID
@@ -3527,6 +3612,9 @@ TransmitterInitialize(
     FdoGetCacheInterface(PdoGetFdo(FrontendGetPdo(Frontend)),
                          &(*Transmitter)->CacheInterface);
 
+    FdoGetGnttabInterface(PdoGetFdo(FrontendGetPdo(Frontend)),
+                          &(*Transmitter)->GnttabInterface);
+
     FdoGetEvtchnInterface(PdoGetFdo(FrontendGetPdo(Frontend)),
                           &(*Transmitter)->EvtchnInterface);
 
@@ -3584,6 +3672,9 @@ fail2:
     RtlZeroMemory(&(*Transmitter)->Lock,
                   sizeof (KSPIN_LOCK));
 
+    RtlZeroMemory(&(*Transmitter)->GnttabInterface,
+                  sizeof (XENBUS_GNTTAB_INTERFACE));
+
     RtlZeroMemory(&(*Transmitter)->CacheInterface,
                   sizeof (XENBUS_CACHE_INTERFACE));
 
@@ -3634,6 +3725,10 @@ TransmitterConnect(
     if (!NT_SUCCESS(status))
         goto fail3;
 
+    status = XENBUS_GNTTAB(Acquire, &Transmitter->GnttabInterface);
+    if (!NT_SUCCESS(status))
+        goto fail4;
+
     status = XENBUS_CACHE(Create,
                           &Transmitter->CacheInterface,
                           "packet_cache",
@@ -3646,7 +3741,7 @@ TransmitterConnect(
                           Transmitter,
                           &Transmitter->PacketCache);
     if (!NT_SUCCESS(status))
-        goto fail4;
+        goto fail5;
 
     status = XENBUS_STORE(Read,
                           &Transmitter->StoreInterface,
@@ -3676,7 +3771,7 @@ TransmitterConnect(
 
         status = __TransmitterRingConnect(Ring);
         if (!NT_SUCCESS(status))
-            goto fail5;
+            goto fail6;
     }    
 
     status = XENBUS_DEBUG(Register,
@@ -3686,16 +3781,16 @@ TransmitterConnect(
                           Transmitter,
                           &Transmitter->DebugCallback);
     if (!NT_SUCCESS(status))
-        goto fail6;
+        goto fail7;
 
     return STATUS_SUCCESS;
 
+fail7:
+    Error("fail7\n");
+
 fail6:
     Error("fail6\n");
 
-fail5:
-    Error("fail5\n");
-
     for (Index = 0; Index < MAXIMUM_PROCESSORS; ++Index) {
         PXENVIF_TRANSMITTER_RING    Ring;
 
@@ -3711,6 +3806,11 @@ fail5:
                  Transmitter->PacketCache);
     Transmitter->PacketCache = NULL;
 
+fail5:
+    Error("fail5\n");
+
+    XENBUS_GNTTAB(Release, &Transmitter->GnttabInterface);
+
 fail4:
     Error("fail4\n");
 
@@ -3847,11 +3947,13 @@ TransmitterDisconnect(
                  Transmitter->PacketCache);
     Transmitter->PacketCache = NULL;
 
+    XENBUS_GNTTAB(Release, &Transmitter->GnttabInterface);
+
+    XENBUS_EVTCHN(Release, &Transmitter->EvtchnInterface);
+
     XENBUS_STORE(Release, &Transmitter->StoreInterface);
 
     XENBUS_DEBUG(Release, &Transmitter->DebugInterface);
-
-    XENBUS_EVTCHN(Release, &Transmitter->EvtchnInterface);
 }
 
 VOID
@@ -3889,6 +3991,9 @@ TransmitterTeardown(
     RtlZeroMemory(&Transmitter->Lock,
                   sizeof (KSPIN_LOCK));
 
+    RtlZeroMemory(&Transmitter->GnttabInterface,
+                  sizeof (XENBUS_GNTTAB_INTERFACE));
+
     RtlZeroMemory(&Transmitter->CacheInterface,
                   sizeof (XENBUS_CACHE_INTERFACE));
 
diff --git a/vs2012/xenvif/xenvif.vcxproj b/vs2012/xenvif/xenvif.vcxproj
index edd71ea..4120018 100644
--- a/vs2012/xenvif/xenvif.vcxproj
+++ b/vs2012/xenvif/xenvif.vcxproj
@@ -93,7 +93,6 @@
                <ClCompile Include="../../src/xenvif/driver.c" />
                <ClCompile Include="../../src/xenvif/fdo.c" />
                <ClCompile Include="../../src/xenvif/frontend.c" />
-               <ClCompile Include="../../src/xenvif/granter.c" />
                <ClCompile Include="../../src/xenvif/link.c" />
                <ClCompile Include="../../src/xenvif/mac.c" />
                <ClCompile Include="../../src/xenvif/parse.c" />
diff --git a/vs2013/xenvif/xenvif.vcxproj b/vs2013/xenvif/xenvif.vcxproj
index 3dd8d9a..0e774b7 100644
--- a/vs2013/xenvif/xenvif.vcxproj
+++ b/vs2013/xenvif/xenvif.vcxproj
@@ -124,7 +124,6 @@
     <ClCompile Include="../../src/xenvif/driver.c" />
     <ClCompile Include="../../src/xenvif/fdo.c" />
     <ClCompile Include="../../src/xenvif/frontend.c" />
-    <ClCompile Include="../../src/xenvif/granter.c" />
     <ClCompile Include="../../src/xenvif/link.c" />
     <ClCompile Include="../../src/xenvif/mac.c" />
     <ClCompile Include="../../src/xenvif/parse.c" />
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@xxxxxxxxxxxxxxxxxxxx
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.