}
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);
)
{
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
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
IN XENVIF_GRANTER_HANDLE Handle
);
-VOID
-GranterPut(
- IN PXENVIF_GRANTER Granter,
- IN XENVIF_GRANTER_HANDLE Handle
- );
-
ULONG
GranterGetReference(
IN XENVIF_GRANTER_HANDLE Handle
#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)
#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 {
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];
PXENBUS_DEBUG_INTERFACE DebugInterface;
PXENBUS_STORE_INTERFACE StoreInterface;
- PXENBUS_GNTTAB_INTERFACE GnttabInterface;
PXENVIF_VIF_INTERFACE VifInterface;
PXENBUS_DEBUG_CALLBACK DebugCallback;
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;
)
{
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);
}
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)));
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);
FrontendGetPath(Frontend),
"rx-ring-ref",
"%u",
- Ring->Reference);
+ GranterGetReference(Ring->Handle));
if (!NT_SUCCESS(status))
goto fail1;
PXENVIF_RECEIVER Receiver;
PXENVIF_FRONTEND Frontend;
ULONG Count;
- NTSTATUS status;
Receiver = Ring->Receiver;
Frontend = Receiver->Frontend;
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) {
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);
Pfn = MmGetMdlPfnArray(Mdl)[0];
status = GranterPermitAccess(FrontendGetGranter(Frontend),
- Tag->Handle,
Pfn,
- TRUE);
+ TRUE,
+ &Tag->Handle);
ASSERT(NT_SUCCESS(status));
Tag->Offset = 0;
GranterRevokeAccess(FrontendGetGranter(Frontend),
Tag->Handle);
+ Tag->Handle = NULL;
ASSERT3U(Tag->Type, ==, TAG_BUFFER);
Buffer = Tag->Context;
PageLength = __min(MdlLength, PAGE_SIZE - PageOffset);
status = GranterPermitAccess(FrontendGetGranter(Frontend),
- Tag->Handle,
Pfn,
- TRUE);
+ TRUE,
+ &Tag->Handle);
ASSERT(NT_SUCCESS(status));
Tag->Offset = PageOffset;
GranterRevokeAccess(FrontendGetGranter(Frontend),
Tag->Handle);
+ Tag->Handle = NULL;
Tag->Context = NULL;
Tag->Type = TAG_TYPE_INVALID;
Pfn = MmGetMdlPfnArray(Mdl)[0];
status = GranterPermitAccess(FrontendGetGranter(Frontend),
- Tag->Handle,
Pfn,
- TRUE);
+ TRUE,
+ &Tag->Handle);
ASSERT(NT_SUCCESS(status));
Tag->Offset = 0;
GranterRevokeAccess(FrontendGetGranter(Frontend),
Tag->Handle);
+ Tag->Handle = NULL;
Tag->Context = NULL;
Tag->Type = TAG_TYPE_INVALID;
GranterRevokeAccess(FrontendGetGranter(Frontend),
Tag->Handle);
+ Tag->Handle = NULL;
switch (Tag->Type) {
case TAG_BUFFER: {
Pfn = MmGetMdlPfnArray(Mdl)[0];
status = GranterPermitAccess(FrontendGetGranter(Frontend),
- Tag->Handle,
Pfn,
- TRUE);
+ TRUE,
+ &Tag->Handle);
ASSERT(NT_SUCCESS(status));
Tag->Offset = 0;
Pfn = MmGetMdlPfnArray(Mdl)[0];
status = GranterPermitAccess(FrontendGetGranter(Frontend),
- Tag->Handle,
Pfn,
- TRUE);
+ TRUE,
+ &Tag->Handle);
ASSERT(NT_SUCCESS(status));
Tag->Offset = 0;
GranterRevokeAccess(FrontendGetGranter(Frontend),
Tag->Handle);
+ Tag->Handle = NULL;
__TransmitterPutTag(Ring, Tag);
}
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;
}
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);
GranterRevokeAccess(FrontendGetGranter(Frontend),
Ring->Handle);
+ Ring->Handle = NULL;
Count = 0;
while (Ring->HeadFreeTag != TAG_INDEX_INVALID) {
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);