[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [win-pv-devel] [PATCH 5/8] Only open the PDO software key once
There are currently two functions where the PDO software key is opened and closed: __PdoSetCurrentAddress() and __PdoSetLuid(). Both of these functions are called from PdoStartDevice() so it's more efficient to open the software key there and pass it as an argument to the aforementioned functions. Signed-off-by: Paul Durrant <paul.durrant@xxxxxxxxxx> --- src/xenvif/pdo.c | 101 +++++++++++++++++++++++++------------------------------ 1 file changed, 46 insertions(+), 55 deletions(-) diff --git a/src/xenvif/pdo.c b/src/xenvif/pdo.c index f2e6a8f..0cf83b9 100644 --- a/src/xenvif/pdo.c +++ b/src/xenvif/pdo.c @@ -682,43 +682,32 @@ PdoGetVifContext( static FORCEINLINE NTSTATUS __PdoSetLuid( - IN PXENVIF_PDO Pdo + IN PXENVIF_PDO Pdo, + IN HANDLE Key ) { - HANDLE Key; ULONG IfType; ULONG NetLuidIndex; NTSTATUS status; - status = RegistryOpenSoftwareKey(__PdoGetDeviceObject(Pdo), - KEY_READ, - &Key); - if (!NT_SUCCESS(status)) - goto fail1; - status = RegistryQueryDwordValue(Key, "*IfType", &IfType); if (!NT_SUCCESS(status)) - goto fail2; + goto fail1; status = RegistryQueryDwordValue(Key, "NetLuidIndex", &NetLuidIndex); if (!NT_SUCCESS(status)) - goto fail3; + goto fail2; Pdo->Luid.Info.IfType = IfType; Pdo->Luid.Info.NetLuidIndex = NetLuidIndex; - RegistryCloseKey(Key); + Info("%s: %016llX\n", __PdoGetName(Pdo), Pdo->Luid.Value); return STATUS_SUCCESS; -fail3: - Error("fail3\n"); - fail2: Error("fail2\n"); - RegistryCloseKey(Key); - fail1: Error("fail1 (%08x)\n", status); @@ -834,22 +823,16 @@ PdoGetPermanentAddress( static FORCEINLINE NTSTATUS __PdoSetCurrentAddress( - IN PXENVIF_PDO Pdo + IN PXENVIF_PDO Pdo, + IN HANDLE Key ) { - HANDLE SoftwareKey; PANSI_STRING Ansi; NTSTATUS status; - status = RegistryOpenSoftwareKey(__PdoGetDeviceObject(Pdo), - KEY_READ, - &SoftwareKey); - if (!NT_SUCCESS(status)) - goto fail1; - RtlFillMemory(Pdo->CurrentAddress.Byte, ETHERNET_ADDRESS_LENGTH, 0xFF); - status = RegistryQuerySzValue(SoftwareKey, + status = RegistryQuerySzValue(Key, "NetworkAddress", &Ansi); if (!NT_SUCCESS(status)) @@ -857,27 +840,20 @@ __PdoSetCurrentAddress( status = __PdoParseAddress(Ansi[0].Buffer, &Pdo->CurrentAddress); if (!NT_SUCCESS(status)) - goto fail2; + goto fail1; Info("%s: %Z\n", __PdoGetName(Pdo), &Ansi[0]); RegistryFreeSzValue(Ansi); done: - RegistryCloseKey(SoftwareKey); - return STATUS_SUCCESS; -fail2: - Error("fail2\n"); - - RegistryFreeSzValue(Ansi); - - RegistryCloseKey(SoftwareKey); - fail1: Error("fail1 (%08x)\n", status); + RegistryFreeSzValue(Ansi); + return status; } @@ -1168,23 +1144,38 @@ PdoStartDevice( PMIB_IF_TABLE2 Table; ULONG Index; PIO_STACK_LOCATION StackLocation; + HANDLE Key; NTSTATUS status; + status = RegistryOpenSoftwareKey(__PdoGetDeviceObject(Pdo), + KEY_ALL_ACCESS, + &Key); + if (!NT_SUCCESS(status)) + goto fail1; + + status = __PdoSetCurrentAddress(Pdo, Key); + if (!NT_SUCCESS(status)) + goto fail2; + + status = __PdoSetLuid(Pdo, Key); + if (!NT_SUCCESS(status)) + goto fail3; + status = LinkGetRoutineAddress("netio.sys", "GetIfTable2", (PVOID *)&__GetIfTable2); if (!NT_SUCCESS(status)) - goto fail1; + goto fail4; status = LinkGetRoutineAddress("netio.sys", "FreeMibTable", (PVOID *)&__FreeMibTable); if (!NT_SUCCESS(status)) - goto fail2; + goto fail5; status = __GetIfTable2(&Table); if (!NT_SUCCESS(status)) - goto fail3; + goto fail6; for (Index = 0; Index < Table->NumEntries; Index++) { PMIB_IF_ROW2 Row = &Table->Table[Index]; @@ -1203,22 +1194,14 @@ PdoStartDevice( if (memcmp(Row->PhysicalAddress, &Pdo->PermanentAddress, sizeof (ETHERNET_ADDRESS)) == 0) - goto fail4; + goto fail7; } - status = __PdoSetCurrentAddress(Pdo); - if (!NT_SUCCESS(status)) - goto fail5; - - status = __PdoSetLuid(Pdo); - if (!NT_SUCCESS(status)) - goto fail6; - StackLocation = IoGetCurrentIrpStackLocation(Irp); status = PdoD3ToD0(Pdo); if (!NT_SUCCESS(status)) - goto fail7; + goto fail8; __PdoSetDevicePnpState(Pdo, Started); @@ -1227,35 +1210,43 @@ PdoStartDevice( __FreeMibTable(Table); + RegistryCloseKey(Key); + return STATUS_SUCCESS; +fail8: + Error("fail8\n"); + + __FreeMibTable(Table); + goto fail6; + fail7: Error("fail7\n"); - RtlZeroMemory(&Pdo->Luid, sizeof (NET_LUID)); + PdoRequestReboot(Pdo); + __FreeMibTable(Table); fail6: Error("fail6\n"); - RtlZeroMemory(&Pdo->CurrentAddress, sizeof (ETHERNET_ADDRESS)); - fail5: Error("fail5\n"); - goto fail3; - fail4: Error("fail4\n"); - PdoRequestReboot(Pdo); - __FreeMibTable(Table); + RtlZeroMemory(&Pdo->Luid, sizeof (NET_LUID)); fail3: Error("fail3\n"); + RtlZeroMemory(&Pdo->CurrentAddress, sizeof (ETHERNET_ADDRESS)); + fail2: Error("fail2\n"); + RegistryCloseKey(Key); + fail1: Error("fail1 (%08x)\n", status); -- 2.1.1 _______________________________________________ win-pv-devel mailing list win-pv-devel@xxxxxxxxxxxxxxxxxxxx http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |