[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [XENIFACE PATCH v2] xenagent: Add TimeSyncMode option
On Wed, Jul 9, 2025 at 9:24 AM Tu Dinh <ngoc-tu.dinh@xxxxxxxxxx> wrote:
xenagent's time sync mechanism interferes with w32time's own time sync,
especially in a domain environment where domain members are expected to
follow the PDCe.
Add a REG_DWORD value TimeSyncMode in xenagent. Setting this value to 0
will disable the XenTime sync.
Note that this setting is not honored during time sync attempts after
resume.
Signed-off-by: Tu Dinh <ngoc-tu.dinh@xxxxxxxxxx>
---
src/xenagent/service.cpp | 4 ++--
src/xenagent/xenifacedevice.cpp | 31 +++++++++++++++++++++++++++----
src/xenagent/xenifacedevice.h | 4 ++--
3 files changed, 31 insertions(+), 8 deletions(-)
diff --git a/src/xenagent/service.cpp b/src/xenagent/service.cpp
index 535d761..6ef7b1a 100644
--- a/src/xenagent/service.cpp
+++ b/src/xenagent/service.cpp
@@ -216,7 +216,7 @@ bool CXenAgent::ServiceMainLoop()
case WAIT_OBJECT_0+2:
ResetEvent(m_xeniface.m_evt_suspend);
- m_xeniface.CheckXenTime();
+ m_xeniface.CheckXenTime(true);
m_xeniface.CheckSuspend();
return true; // continue loop
@@ -230,7 +230,7 @@ bool CXenAgent::ServiceMainLoop()
return true; // continue loop
}
case WAIT_TIMEOUT:
- m_xeniface.CheckXenTime();
+ m_xeniface.CheckXenTime(false);
__fallthrough;
case WAIT_IO_COMPLETION:
m_xeniface.CheckSuspend();
diff --git a/src/xenagent/xenifacedevice.cpp b/src/xenagent/xenifacedevice.cpp
index 69a584b..7b45c8c 100644
--- a/src/xenagent/xenifacedevice.cpp
+++ b/src/xenagent/xenifacedevice.cpp
@@ -40,6 +40,13 @@
#include "xeniface_ioctls.h"
#include "messages.h"
+#define SERVICES_KEY "SYSTEM\\CurrentControlSet\\Services"
+
+#define SERVICE_KEY(_Service) \
+ SERVICES_KEY ## "\\" ## _Service
+
+#define TIME_SYNC_MODE_DISABLED 0
+
CXenIfaceDevice::CXenIfaceDevice(const wchar_t* path) : CDevice(path)
{}
@@ -213,7 +220,7 @@ CXenIfaceDeviceList::CXenIfaceDeviceList(CXenAgent* agent) : CDeviceList(GUID_IN
if (m_agent->ConvDevicePresent())
StartSlateModeWatch(device);
- SetXenTime(device);
+ SetXenTime(device, false);
}
/*virtual*/ void CXenIfaceDeviceList::OnDeviceRemoved(CDevice* dev)
@@ -339,7 +346,7 @@ bool CXenIfaceDeviceList::CheckShutdown()
return false;
}
-void CXenIfaceDeviceList::CheckXenTime()
+void CXenIfaceDeviceList::CheckXenTime(bool forced)
{
CCritSec crit(&m_crit);
CXenIfaceDevice* device = (CXenIfaceDevice*)GetFirstDevice();
@@ -347,7 +354,7 @@ void CXenIfaceDeviceList::CheckXenTime()
if (device == NULL)
return;
- SetXenTime(device);
+ SetXenTime(device, forced);
}
void CXenIfaceDeviceList::CheckSuspend()
@@ -485,10 +492,26 @@ void CXenIfaceDeviceList::AcquireShutdownPrivilege()
CloseHandle(token);
}
-void CXenIfaceDeviceList::SetXenTime(CXenIfaceDevice* device)
+void CXenIfaceDeviceList::SetXenTime(CXenIfaceDevice* device, bool forced)
{
bool local;
+ if (!forced) {
+ DWORD mode = 0;
+ DWORD size = sizeof(mode);
+ LSTATUS lstatus;
+
+ lstatus = RegGetValue(HKEY_LOCAL_MACHINE,
+ TEXT(SERVICE_KEY(__MODULE__)),
+ TEXT("TimeSyncMode"),
+ RRF_RT_DWORD,
+ NULL,
+ &mode,
+ &size);
+ if (lstatus == ERROR_SUCCESS && mode == TIME_SYNC_MODE_DISABLED)
+ return;
+ }
+
FILETIME now = { 0 };
if (!device->SharedInfoGetTime(&now, &local))
return;
diff --git a/src/xenagent/xenifacedevice.h b/src/xenagent/xenifacedevice.h
index d85e469..8a89036 100644
--- a/src/xenagent/xenifacedevice.h
+++ b/src/xenagent/xenifacedevice.h
@@ -84,7 +84,7 @@ public:
void Log(const char* message);
bool CheckShutdown();
- void CheckXenTime();
+ void CheckXenTime(bool forced);
void CheckSuspend();
bool CheckSlateMode(std::string& mode);
void LogIfRebootPending();
@@ -95,7 +95,7 @@ private:
void StartSlateModeWatch(CXenIfaceDevice* device);
void StopSlateModeWatch(CXenIfaceDevice* device);
void AcquireShutdownPrivilege();
- void SetXenTime(CXenIfaceDevice* device);
+ void SetXenTime(CXenIfaceDevice* device, bool forced);
private:
CXenAgent* m_agent;
--
2.50.1.windows.1
Ngoc Tu Dinh | Vates XCP-ng Developer
XCP-ng & Xen Orchestra - Vates solutions
web: https://vates.tech
|