]> xenbits.xensource.com Git - pvdrivers/win/xenvif.git/commitdiff
Allocate grant references as needed rather than up-front.
authorPaul Durrant <paul.durrant@citrix.com>
Fri, 11 Apr 2014 14:35:59 +0000 (15:35 +0100)
committerPaul Durrant <paul.durrant@citrix.com>
Fri, 11 Apr 2014 14:35:59 +0000 (15:35 +0100)
Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
src/xenvif/granter.c
src/xenvif/granter.h
src/xenvif/receiver.c
src/xenvif/transmitter.c

index 4d819ff219b339e2f11478ce35458d609ace682f..6f5f106503093e57354a4150eb2cc4cf37d94c69 100644 (file)
@@ -117,57 +117,45 @@ GranterEnable(
 }
 
 NTSTATUS
-GranterGet(
+GranterPermitAccess(
     IN  PXENVIF_GRANTER         Granter,
+    IN  PFN_NUMBER              Pfn,
+    IN  BOOLEAN                 ReadOnly,
     OUT PXENVIF_GRANTER_HANDLE  Handle
     )
 {
+    PXENVIF_FRONTEND            Frontend;
     ULONG                       Reference;
     NTSTATUS                    status;
 
+    Frontend = Granter->Frontend;
+
     status = GNTTAB(Get,
                     Granter->GnttabInterface,
                     &Reference);
     if (!NT_SUCCESS(status))
         goto fail1;
 
-    *Handle = (XENVIF_GRANTER_HANDLE)(ULONG_PTR)Reference;
-    return STATUS_SUCCESS;
-
-fail1:
-    Error("fail1 (%08x)\n", status);
-
-    return status;
-}
-
-NTSTATUS
-GranterPermitAccess(
-    IN  PXENVIF_GRANTER         Granter,
-    IN  XENVIF_GRANTER_HANDLE   Handle,
-    IN  PFN_NUMBER              Pfn,
-    IN  BOOLEAN                 ReadOnly
-    )
-{
-    PXENVIF_FRONTEND            Frontend;
-    ULONG_PTR                   Reference;
-    NTSTATUS                    status;
-
-    Frontend = Granter->Frontend;
-
-    Reference = (ULONG_PTR)Handle;
-
     status = GNTTAB(PermitForeignAccess,
                     Granter->GnttabInterface,
-                    (ULONG)Reference,
+                    Reference,
                     FrontendGetBackendDomain(Frontend),
                     GNTTAB_ENTRY_FULL_PAGE,
                     Pfn,
                     ReadOnly);
     if (!NT_SUCCESS(status))
-        goto fail1;
+        goto fail2;
 
+    *Handle = (XENVIF_GRANTER_HANDLE)(ULONG_PTR)Reference;
     return STATUS_SUCCESS;
 
+fail2:
+    Error("fail2\n");
+
+    GNTTAB(Put,
+           Granter->GnttabInterface,
+           Reference);
+
 fail1:
     Error("fail1 (%08x)\n", status);
 
@@ -181,27 +169,24 @@ GranterRevokeAccess(
     )
 {
     ULONG_PTR                   Reference;
+    NTSTATUS                    status;
 
     Reference = (ULONG_PTR)Handle;
 
-    (VOID) GNTTAB(RevokeForeignAccess,
-                  Granter->GnttabInterface,
-                  (ULONG)Reference);
-}
-
-VOID
-GranterPut(
-    IN  PXENVIF_GRANTER         Granter,
-    IN  XENVIF_GRANTER_HANDLE   Handle
-    )
-{
-    ULONG_PTR                   Reference;
-
-    Reference = (ULONG_PTR)Handle;
+    status = GNTTAB(RevokeForeignAccess,
+                    Granter->GnttabInterface,
+                    (ULONG)Reference);
+    if (!NT_SUCCESS(status))
+        goto fail1;
 
     GNTTAB(Put,
            Granter->GnttabInterface,
            (ULONG)Reference);
+
+    return;
+
+fail1:
+    Error("fail1 (%08x)\n", status);
 }
 
 ULONG
index d32303f23686ae457205ec403757aac32566df25..3e39c9347a9dc62660d90cb9c0b656bb47d5fb58 100644 (file)
@@ -55,18 +55,12 @@ GranterEnable(
     IN  PXENVIF_GRANTER     Granter
     );
 
-NTSTATUS
-GranterGet(
-    IN  PXENVIF_GRANTER         Granter,
-    OUT PXENVIF_GRANTER_HANDLE  Handle
-    );
-
 NTSTATUS
 GranterPermitAccess(
     IN  PXENVIF_GRANTER         Granter,
-    IN  XENVIF_GRANTER_HANDLE   Handle,
     IN  PFN_NUMBER              Pfn,
-    IN  BOOLEAN                 ReadOnly
+    IN  BOOLEAN                 ReadOnly,
+    OUT PXENVIF_GRANTER_HANDLE  Handle
     );
 
 VOID
@@ -75,12 +69,6 @@ GranterRevokeAccess(
     IN  XENVIF_GRANTER_HANDLE   Handle
     );
 
-VOID
-GranterPut(
-    IN  PXENVIF_GRANTER         Granter,
-    IN  XENVIF_GRANTER_HANDLE   Handle
-    );
-
 ULONG
 GranterGetReference(
     IN  XENVIF_GRANTER_HANDLE   Handle
index 6cd35a50fde5cccbd7f802012bc83aeaec798db3..44fceb9abac56f24fe348f198f76ce1314a82555 100644 (file)
@@ -37,7 +37,6 @@
 #include <xen.h>
 #include <debug_interface.h>
 #include <store_interface.h>
-#include <gnttab_interface.h>
 
 // This should be in public/io/netif.h
 #define _NETRXF_gso_prefix     (4)
@@ -51,6 +50,7 @@
 #include "pool.h"
 #include "checksum.h"
 #include "parse.h"
+#include "granter.h"
 #include "mac.h"
 #include "vif.h"
 #include "receiver.h"
 #define RECEIVER_POOL    'ECER'
 
 typedef struct _RECEIVER_TAG {
-    LIST_ENTRY  ListEntry;
-    ULONG       Next;
-    PVOID       Context;
-    ULONG       Reference;
+    LIST_ENTRY              ListEntry;
+    ULONG                   Next;
+    PVOID                   Context;
+    XENVIF_GRANTER_HANDLE   Handle;
 } RECEIVER_TAG, *PRECEIVER_TAG;
 
 typedef struct _RECEIVER_OFFLOAD_STATISTICS {
@@ -112,7 +112,7 @@ typedef struct _RECEIVER_RING {
     PMDL                                Mdl;
     netif_rx_front_ring_t               Front;
     netif_rx_sring_t                    *Shared;
-    ULONG                               Reference;
+    XENVIF_GRANTER_HANDLE               Handle;
     ULONG                               HeadFreeTag;
     RECEIVER_TAG                        Tag[MAXIMUM_TAG_COUNT];
     netif_rx_request_t                  Pending[MAXIMUM_TAG_COUNT];
@@ -147,7 +147,6 @@ struct _XENVIF_RECEIVER {
 
     PXENBUS_DEBUG_INTERFACE     DebugInterface;
     PXENBUS_STORE_INTERFACE     StoreInterface;
-    PXENBUS_GNTTAB_INTERFACE    GnttabInterface;
     PXENVIF_VIF_INTERFACE       VifInterface;
 
     PXENBUS_DEBUG_CALLBACK      DebugCallback;
@@ -1456,13 +1455,10 @@ __RingPreparePacket(
 
     Tag->Context = Mdl;
 
-    status = GNTTAB(PermitForeignAccess,
-                    Receiver->GnttabInterface,
-                    Tag->Reference,
-                    FrontendGetBackendDomain(Frontend),
-                    GNTTAB_ENTRY_FULL_PAGE,
-                    MmGetMdlPfnArray(Mdl)[0],
-                    FALSE);
+    status = GranterPermitAccess(FrontendGetGranter(Frontend),
+                                 MmGetMdlPfnArray(Mdl)[0],
+                                 FALSE,
+                                 &Tag->Handle);
     ASSERT(NT_SUCCESS(status));
 
     return Tag;
@@ -1475,14 +1471,14 @@ RingReleaseTag(
     )
 {
     PXENVIF_RECEIVER    Receiver;
-    NTSTATUS            status;
+    PXENVIF_FRONTEND    Frontend;
 
     Receiver = Ring->Receiver;
+    Frontend = Receiver->Frontend;
 
-    status = GNTTAB(RevokeForeignAccess,
-                    Receiver->GnttabInterface,
-                    Tag->Reference);
-    ASSERT(NT_SUCCESS(status));
+    GranterRevokeAccess(FrontendGetGranter(Frontend),
+                        Tag->Handle);
+    Tag->Handle = NULL;
 
     __RingPutTag(Ring, Tag);
 }
@@ -1557,7 +1553,7 @@ RingFill(
         ASSERT3U(id, <, MAXIMUM_TAG_COUNT);
 
         req->id = id | REQ_ID_INTEGRITY_CHECK;
-        req->gref = Tag->Reference;
+        req->gref = GranterGetReference(Tag->Handle);
 
         // Store a copy of the request in case we need to fake a response ourselves
         ASSERT(IsZeroMemory(&Ring->Pending[id], sizeof (netif_rx_request_t)));
@@ -2414,70 +2410,36 @@ __RingConnect(
     FRONT_RING_INIT(&Ring->Front, Ring->Shared, PAGE_SIZE);
     ASSERT3P(Ring->Front.sring, ==, Ring->Shared);
 
-    Receiver->GnttabInterface = FrontendGetGnttabInterface(Frontend);
-
-    GNTTAB(Acquire, Receiver->GnttabInterface);
-
-    status = GNTTAB(Get,
-                    Receiver->GnttabInterface,
-                    &Ring->Reference);
-    if (!NT_SUCCESS(status))
-        goto fail2;
-
     Ring->HeadFreeTag = TAG_INDEX_INVALID;
     for (Index = 0; Index < MAXIMUM_TAG_COUNT; Index++) {
         PRECEIVER_TAG   Tag = &Ring->Tag[Index];
 
-        status = GNTTAB(Get,
-                        Receiver->GnttabInterface,
-                        &Tag->Reference);
-        if (!NT_SUCCESS(status))
-            goto fail3;
-
         Tag->Next = Ring->HeadFreeTag;
         Ring->HeadFreeTag = Index;
     }
 
     Pfn = MmGetMdlPfnArray(Ring->Mdl)[0];
     
-    status = GNTTAB(PermitForeignAccess,
-                    Receiver->GnttabInterface,
-                    Ring->Reference,
-                    FrontendGetBackendDomain(Frontend),
-                    GNTTAB_ENTRY_FULL_PAGE,
-                    Pfn,
-                    FALSE);
-    ASSERT(NT_SUCCESS(status));
+    status = GranterPermitAccess(FrontendGetGranter(Frontend),
+                                 Pfn,
+                                 FALSE,
+                                 &Ring->Handle);
+    if (!NT_SUCCESS(status))
+        goto fail2;
 
     return STATUS_SUCCESS;
 
-fail3:
-    Error("fail3\n");
+fail2:
+    Error("fail2\n");
 
     while (Ring->HeadFreeTag != TAG_INDEX_INVALID) {
         PRECEIVER_TAG   Tag = &Ring->Tag[Ring->HeadFreeTag];
 
         Ring->HeadFreeTag = Tag->Next;
         Tag->Next = 0;
-
-        GNTTAB(Put,
-               Receiver->GnttabInterface,
-               Tag->Reference);
-        Tag->Reference = 0;
     }
     Ring->HeadFreeTag = 0;
 
-    GNTTAB(Put,
-           Receiver->GnttabInterface,
-           Ring->Reference);
-    Ring->Reference = 0;
-
-fail2:
-    Error("fail2\n");
-
-    GNTTAB(Release, Receiver->GnttabInterface);
-    Receiver->GnttabInterface = NULL;
-
     RtlZeroMemory(&Ring->Front, sizeof (netif_rx_front_ring_t));
     RtlZeroMemory(Ring->Shared, PAGE_SIZE);
 
@@ -2511,7 +2473,7 @@ __RingStoreWrite(
                    FrontendGetPath(Frontend),
                    "rx-ring-ref",
                    "%u",
-                   Ring->Reference);
+                   GranterGetReference(Ring->Handle));
 
     if (!NT_SUCCESS(status))
         goto fail1;
@@ -2583,7 +2545,6 @@ __RingDisconnect(
     PXENVIF_RECEIVER    Receiver;
     PXENVIF_FRONTEND    Frontend;
     ULONG               Count;
-    NTSTATUS            status;
 
     Receiver = Ring->Receiver;
     Frontend = Receiver->Frontend;
@@ -2597,10 +2558,9 @@ __RingDisconnect(
     Ring->RequestsPushed = 0;
     Ring->RequestsPosted = 0;
 
-    status = GNTTAB(RevokeForeignAccess,
-                    Receiver->GnttabInterface,
-                    Ring->Reference);
-    ASSERT(NT_SUCCESS(status));
+    GranterRevokeAccess(FrontendGetGranter(Frontend),
+                        Ring->Handle);
+    Ring->Handle = NULL;
 
     Count = 0;
     while (Ring->HeadFreeTag != TAG_INDEX_INVALID) {
@@ -2610,25 +2570,12 @@ __RingDisconnect(
         Ring->HeadFreeTag = Tag->Next;
         Tag->Next = 0;
 
-        GNTTAB(Put,
-               Receiver->GnttabInterface,
-               Tag->Reference);
-        Tag->Reference = 0;
-
         Count++;
     }
     ASSERT3U(Count, ==, MAXIMUM_TAG_COUNT);
 
     Ring->HeadFreeTag = 0;
 
-    GNTTAB(Put,
-           Receiver->GnttabInterface,
-           Ring->Reference);
-    Ring->Reference = 0;
-
-    GNTTAB(Release, Receiver->GnttabInterface);
-    Receiver->GnttabInterface = NULL;
-
     RtlZeroMemory(&Ring->Front, sizeof (netif_rx_front_ring_t));
     RtlZeroMemory(Ring->Shared, PAGE_SIZE);
 
index 1900732543ebfa35f23968248071bf5900fef5fa..e59448cfd12f6f1ff3e1e809f050d0412314660b 100644 (file)
@@ -770,9 +770,9 @@ __RingCopyPayload(
         Pfn = MmGetMdlPfnArray(Mdl)[0];
 
         status = GranterPermitAccess(FrontendGetGranter(Frontend),
-                                     Tag->Handle,
                                      Pfn,
-                                     TRUE);
+                                     TRUE,
+                                     &Tag->Handle);
         ASSERT(NT_SUCCESS(status));
 
         Tag->Offset = 0;
@@ -809,6 +809,7 @@ fail1:
 
         GranterRevokeAccess(FrontendGetGranter(Frontend),
                             Tag->Handle);
+        Tag->Handle = NULL;
 
         ASSERT3U(Tag->Type, ==, TAG_BUFFER);
         Buffer = Tag->Context;
@@ -886,9 +887,9 @@ __RingGrantPayload(
             PageLength = __min(MdlLength, PAGE_SIZE - PageOffset);
 
             status = GranterPermitAccess(FrontendGetGranter(Frontend),
-                                         Tag->Handle,
                                          Pfn,
-                                         TRUE);
+                                         TRUE,
+                                         &Tag->Handle);
             ASSERT(NT_SUCCESS(status));
 
             Tag->Offset = PageOffset;
@@ -942,6 +943,7 @@ fail1:
 
         GranterRevokeAccess(FrontendGetGranter(Frontend),
                             Tag->Handle);
+        Tag->Handle = NULL;
 
         Tag->Context = NULL;
         Tag->Type = TAG_TYPE_INVALID;
@@ -1016,9 +1018,9 @@ __RingPrepareHeader(
     Pfn = MmGetMdlPfnArray(Mdl)[0];
 
     status = GranterPermitAccess(FrontendGetGranter(Frontend),
-                                 Tag->Handle,
                                  Pfn,
-                                 TRUE);
+                                 TRUE,
+                                 &Tag->Handle);
     ASSERT(NT_SUCCESS(status));
 
     Tag->Offset = 0;
@@ -1216,6 +1218,7 @@ fail3:
 
     GranterRevokeAccess(FrontendGetGranter(Frontend),
                         Tag->Handle);
+    Tag->Handle = NULL;
 
     Tag->Context = NULL;
     Tag->Type = TAG_TYPE_INVALID;
@@ -1278,6 +1281,7 @@ __RingUnprepareTags(
 
         GranterRevokeAccess(FrontendGetGranter(Frontend),
                             Tag->Handle);
+        Tag->Handle = NULL;
 
         switch (Tag->Type) {
         case TAG_BUFFER: {
@@ -1601,9 +1605,9 @@ __RingPrepareGratuitousArp(
     Pfn = MmGetMdlPfnArray(Mdl)[0];
 
     status = GranterPermitAccess(FrontendGetGranter(Frontend),
-                                 Tag->Handle,
                                  Pfn,
-                                 TRUE);
+                                 TRUE,
+                                 &Tag->Handle);
     ASSERT(NT_SUCCESS(status));
 
     Tag->Offset = 0;
@@ -1747,9 +1751,9 @@ __RingPrepareNeighbourAdvertisement(
     Pfn = MmGetMdlPfnArray(Mdl)[0];
 
     status = GranterPermitAccess(FrontendGetGranter(Frontend),
-                                 Tag->Handle,
                                  Pfn,
-                                 TRUE);
+                                 TRUE,
+                                 &Tag->Handle);
     ASSERT(NT_SUCCESS(status));
 
     Tag->Offset = 0;
@@ -2019,6 +2023,7 @@ __RingReleaseTag(
 
     GranterRevokeAccess(FrontendGetGranter(Frontend),
                         Tag->Handle);
+    Tag->Handle = NULL;
 
     __TransmitterPutTag(Ring, Tag);
 }
@@ -2965,20 +2970,10 @@ __RingConnect(
     FRONT_RING_INIT(&Ring->Front, Ring->Shared, PAGE_SIZE);
     ASSERT3P(Ring->Front.sring, ==, Ring->Shared);
 
-    status = GranterGet(FrontendGetGranter(Frontend),
-                        &Ring->Handle);
-    if (!NT_SUCCESS(status))
-        goto fail2;
-
     Ring->HeadFreeTag = TAG_INDEX_INVALID;
     for (Index = 0; Index < MAXIMUM_TAG_COUNT; Index++) {
         PTRANSMITTER_TAG Tag = &Ring->Tag[Index];
 
-        status = GranterGet(FrontendGetGranter(Frontend),
-                            &Tag->Handle);
-        if (!NT_SUCCESS(status))
-            goto fail3;
-
         Tag->Next = Ring->HeadFreeTag;
         Ring->HeadFreeTag = Index;
     }
@@ -2986,37 +2981,27 @@ __RingConnect(
     Pfn = MmGetMdlPfnArray(Ring->Mdl)[0];
 
     status = GranterPermitAccess(FrontendGetGranter(Frontend),
-                                 Ring->Handle,
                                  Pfn,
-                                 FALSE);
-    ASSERT(NT_SUCCESS(status));
+                                 FALSE,
+                                 &Ring->Handle);
+    if (!NT_SUCCESS(status))
+        goto fail2;
 
     Ring->Connected = TRUE;
 
     return STATUS_SUCCESS;
 
-fail3:
-    Error("fail3\n");
+fail2:
+    Error("fail2\n");
 
     while (Ring->HeadFreeTag != TAG_INDEX_INVALID) {
         PTRANSMITTER_TAG    Tag = &Ring->Tag[Ring->HeadFreeTag];
 
         Ring->HeadFreeTag = Tag->Next;
         Tag->Next = 0;
-
-        GranterPut(FrontendGetGranter(Frontend),
-                   Tag->Handle);
-        Tag->Handle = NULL;
     }
     Ring->HeadFreeTag = 0;
 
-    GranterPut(FrontendGetGranter(Frontend),
-               Ring->Handle);
-    Ring->Handle = NULL;
-
-fail2:
-    Error("fail2\n");
-
     RtlZeroMemory(&Ring->Front, sizeof (netif_tx_front_ring_t));
     RtlZeroMemory(Ring->Shared, PAGE_SIZE);
 
@@ -3172,6 +3157,7 @@ __RingDisconnect(
 
     GranterRevokeAccess(FrontendGetGranter(Frontend),
                         Ring->Handle);
+    Ring->Handle = NULL;
 
     Count = 0;
     while (Ring->HeadFreeTag != TAG_INDEX_INVALID) {
@@ -3181,20 +3167,12 @@ __RingDisconnect(
         Ring->HeadFreeTag = Tag->Next;
         Tag->Next = 0;
 
-        GranterPut(FrontendGetGranter(Frontend),
-                   Tag->Handle);
-        Tag->Handle = NULL;
-
         Count++;
     }
     ASSERT3U(Count, ==, MAXIMUM_TAG_COUNT);
 
     Ring->HeadFreeTag = 0;
 
-    GranterPut(FrontendGetGranter(Frontend),
-               Ring->Handle);
-    Ring->Handle = NULL;
-
     RtlZeroMemory(&Ring->Front, sizeof (netif_tx_front_ring_t));
     RtlZeroMemory(Ring->Shared, PAGE_SIZE);