[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [XENIFACE PATCH] xenagent: Add DisableTimeSync option
Hi Owen, On 09/07/2025 09:49, Owen Smith wrote: > Reviewed-by: Owen Smith <owen.smith@xxxxxxxxx <mailto:owen.smith@xxxxxxxxx>> > > XenServer has had patches that does something similar for a while, and > contains other related options - I've been meaning to clean it up and > upstream for a while, but its embedded in a pretty hefty refactoring of > the xenagent code. > I was not aware of TimeSyncMode. Let's converge on the existing TimeSyncMode setting. I can make it respect TimeSyncMode=0. > > On Tue, Jul 8, 2025 at 3:48 PM 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 DisableTimeSync in xenagent\Parameters to allow > disabling the XenTime sync. > Note that this setting is not honored during time sync attempts after > resume. > > Also add an empty xenagent\Parameters key in xeniface.inf to ease > creating the setting. > > Signed-off-by: Tu Dinh <ngoc-tu.dinh@xxxxxxxxxx> > --- > src/xenagent/service.cpp | 4 ++-- > src/xenagent/xenifacedevice.cpp | 32 ++++++++++++++++++++++++++++---- > src/xenagent/xenifacedevice.h | 4 ++-- > src/xeniface.inf | 4 ++++ > 4 files changed, 36 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..c476ccd 100644 > --- a/src/xenagent/xenifacedevice.cpp > +++ b/src/xenagent/xenifacedevice.cpp > @@ -40,6 +40,14 @@ > #include "xeniface_ioctls.h" > #include "messages.h" > > +#define SERVICES_KEY "SYSTEM\\CurrentControlSet\\Services" > + > +#define SERVICE_KEY(_Service) \ > + SERVICES_KEY ## "\\" ## _Service > + > +#define PARAMETERS_KEY(_Service) \ > + SERVICE_KEY(_Service) ## "\\Parameters" > + > CXenIfaceDevice::CXenIfaceDevice(const wchar_t* path) : CDevice(path) > {} > > @@ -213,7 +221,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 +347,7 @@ bool CXenIfaceDeviceList::CheckShutdown() > return false; > } > > -void CXenIfaceDeviceList::CheckXenTime() > +void CXenIfaceDeviceList::CheckXenTime(bool forced) > { > CCritSec crit(&m_crit); > CXenIfaceDevice* device = (CXenIfaceDevice*)GetFirstDevice(); > @@ -347,7 +355,7 @@ void CXenIfaceDeviceList::CheckXenTime() > if (device == NULL) > return; > > - SetXenTime(device); > + SetXenTime(device, forced); > } > > void CXenIfaceDeviceList::CheckSuspend() > @@ -485,10 +493,26 @@ void > CXenIfaceDeviceList::AcquireShutdownPrivilege() > CloseHandle(token); > } > > -void CXenIfaceDeviceList::SetXenTime(CXenIfaceDevice* device) > +void CXenIfaceDeviceList::SetXenTime(CXenIfaceDevice* device, bool > forced) > { > bool local; > > + if (!forced) { > + DWORD disable = 0; > + DWORD size = sizeof(disable); > + LSTATUS lstatus; > + > + lstatus = RegGetValue(HKEY_LOCAL_MACHINE, > + TEXT(PARAMETERS_KEY(__MODULE__)), > + TEXT("DisableTimeSync"), > + RRF_RT_DWORD, > + NULL, > + &disable, > + &size); > + if (lstatus == ERROR_SUCCESS && disable) > + 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; > diff --git a/src/xeniface.inf b/src/xeniface.inf > index 07e2a91..3b54f2a 100644 > --- a/src/xeniface.inf > +++ b/src/xeniface.inf > @@ -110,6 +110,10 @@ ServiceType=%SERVICE_WIN32_OWN_PROCESS% > StartType=%SERVICE_AUTO_START% > ErrorControl=%SERVICE_ERROR_NORMAL% > ServiceBinary=%11% > > \xenagent_@MAJOR_VERSION@_@MINOR_VERSION@_@MICRO_VERSION@_@BUILD_NUMBER@.exe > +AddReg=XenAgent_Parameters > + > +[XenAgent_Parameters] > +HKR,"Parameters",,0x00000010 > > [XenAgent_EventLog] > AddReg=XenAgent_AddReg > -- > 2.50.0.windows.2 > > > > Ngoc Tu Dinh | Vates XCP-ng Developer > > XCP-ng & Xen Orchestra - Vates solutions > > web: https://vates.tech <https://vates.tech> > Ngoc Tu Dinh | Vates XCP-ng Developer XCP-ng & Xen Orchestra - Vates solutions web: https://vates.tech
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |