|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] RE: [EXTERNAL] [PATCH 2/2] Add AutoReboot capability
> -----Original Message-----
> From: win-pv-devel <win-pv-devel-bounces@xxxxxxxxxxxxxxxxxxxx> On Behalf Of
> Owen Smith
> Sent: 09 December 2020 13:29
> To: win-pv-devel@xxxxxxxxxxxxxxxxxxxx
> Cc: Owen Smith <owen.smith@xxxxxxxxxx>
> Subject: [EXTERNAL] [PATCH 2/2] Add AutoReboot capability
>
> Setting HKLM\System\CCS\Services\xenbus_monitor\AutoReboot to non-zero
> will allow xenbus_monitor to trigger a reboot when another driver
> requests a reboot. AutoReboot is set to the maximum number of reboots
> to perform. Auto reboots display a message with a 60 second timeout.
>
> This setting can be used to allow headless/unmonitored VMs to complete
> the neccessary number of reboots to return to PV disks/networks. Without
> this capability its possible to update the driver on a parent device,
> which may prompt for a reboot. After this reboot, its likely that
> emulated devices are used whilst drivers are rebound to the device
> nodes. This can leave headless/unmonitored VMs in a state where emulated
> devices are in use with a pending reboot. If network settings have been
> changed for PV devices (e.g. static IP addressing), then the VM may not
> be accessible over RDP or similar connections.
>
> Signed-off-by: Owen Smith <owen.smith@xxxxxxxxxx>
> ---
> src/monitor/monitor.c | 133 ++++++++++++++++++++++++++++++++++++++++--
> 1 file changed, 129 insertions(+), 4 deletions(-)
>
> diff --git a/src/monitor/monitor.c b/src/monitor/monitor.c
> index 07bf8c1..5d58be4 100644
> --- a/src/monitor/monitor.c
> +++ b/src/monitor/monitor.c
> @@ -301,7 +301,8 @@ WTSStateName(
>
> static VOID
> DoReboot(
> - VOID
> + IN PTCHAR Message,
> + IN DWORD Timeout
> )
> {
> Log("waiting for pending install events...");
> @@ -312,8 +313,8 @@ DoReboot(
>
> #pragma prefast(suppress:28159)
> (VOID) InitiateSystemShutdownEx(NULL,
> - NULL,
> - 0,
> + Message,
> + Timeout,
> TRUE,
> TRUE,
> SHTDN_REASON_MAJOR_OPERATINGSYSTEM |
> @@ -451,6 +452,125 @@ fail1:
> return NULL;
> }
>
> +static BOOL
> +TryAutoReboot(
> + IN PTCHAR DriverName
> + )
> +{
> + PMONITOR_CONTEXT Context = &MonitorContext;
> + HRESULT Result;
> + DWORD Type;
> + DWORD AutoReboot;
> + DWORD RebootCount;
> + DWORD Length;
> + PTCHAR DisplayName;
> + PTCHAR Description;
> + PTCHAR Text;
> + DWORD TextLength;
> + HRESULT Error;
> +
> + Length = sizeof (DWORD);
> +
> + Error = RegQueryValueEx(Context->ParametersKey,
> + "AutoReboot",
> + NULL,
> + &Type,
> + (LPBYTE)&AutoReboot,
> + &Length);
> + if (Error != ERROR_SUCCESS ||
> + Type != REG_DWORD)
> + AutoReboot = 0;
> +
> + if (AutoReboot == 0)
> + goto done;
> +
> + Length = sizeof (DWORD);
> +
> + Error = RegQueryValueEx(Context->ParametersKey,
> + "RebootCount",
> + NULL,
> + &Type,
> + (LPBYTE)&RebootCount,
> + &Length);
> + if (Error != ERROR_SUCCESS ||
> + Type != REG_DWORD)
> + RebootCount = 0;
> +
> + if (RebootCount >= AutoReboot)
> + goto done;
> +
> + Log("AutoRebooting (reboot %u of %u)\n",
> + RebootCount,
> + AutoReboot);
> +
> + ++RebootCount;
> +
> + (VOID) RegSetValueEx(Context->ParametersKey,
> + "RebootCount",
> + 0,
> + REG_DWORD,
> + (const BYTE*)&RebootCount,
> + (DWORD) sizeof(DWORD));
> +
I can't see anything that zeroes/deletes this once there are no more pending
reboots. Is there something else that does this, or am
I just missing something?
Paul
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |