From 184eeb7f4954a025b908c3d93638a58b69a319f4 Mon Sep 17 00:00:00 2001 From: Pascal Vizeli Date: Mon, 1 Feb 2021 17:33:53 +0100 Subject: [PATCH] Udev - move away form depricated callback / increase buffer (#2502) * Use new callback from udev / only forward * minimize loop * Udev - move away form depricated callback / increase buffer * code cleanup --- supervisor/hardware/monitor.py | 42 +++++++++++++++++----------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/supervisor/hardware/monitor.py b/supervisor/hardware/monitor.py index 18cfe4222..56aede72e 100644 --- a/supervisor/hardware/monitor.py +++ b/supervisor/hardware/monitor.py @@ -1,5 +1,4 @@ """Supervisor Hardware monitor based on udev.""" -from contextlib import suppress import logging from pathlib import Path from pprint import pformat @@ -31,7 +30,14 @@ class HwMonitor(CoreSysAttributes): """Start hardware monitor.""" try: self.monitor = pyudev.Monitor.from_netlink(self.context, "kernel") - self.observer = pyudev.MonitorObserver(self.monitor, self._udev_events) + self.monitor.set_receive_buffer_size(32 * 1024 * 1024) + + self.observer = pyudev.MonitorObserver( + self.monitor, + callback=lambda x: self.sys_loop.call_soon_threadsafe( + self._async_udev_events, x + ), + ) except OSError: self.sys_resolution.unhealthy = UnhealthyReason.PRIVILEGED _LOGGER.critical("Not privileged to run udev monitor!") @@ -47,29 +53,20 @@ class HwMonitor(CoreSysAttributes): self.observer.stop() _LOGGER.info("Stopped Supervisor hardware monitor") - def _udev_events(self, action: str, kernel: pyudev.Device): - """Incomming events from udev. - - This is inside a observe thread and need pass into our eventloop. - """ - _LOGGER.debug("Hardware monitor: %s - %s", action, pformat(kernel)) - udev = None - with suppress(pyudev.DeviceNotFoundAtPathError): - udev = pyudev.Devices.from_sys_path(self.context, kernel.sys_path) - - self.sys_loop.call_soon_threadsafe( - self._async_udev_events, action, kernel, udev - ) - - def _async_udev_events( - self, action: str, kernel: pyudev.Device, udev: Optional[pyudev.Device] - ): + def _async_udev_events(self, kernel: pyudev.Device): """Incomming events from udev into loop.""" # Update device List if not kernel.device_node or self.sys_hardware.helper.hide_virtual_device( kernel ): return + _LOGGER.debug("Hardware monitor: %s - %s", kernel.action, pformat(kernel)) + + # Lookup udev device data + try: + udev = pyudev.Devices.from_sys_path(self.context, kernel.sys_path) + except pyudev.DeviceNotFoundAtPathError: + udev = None hw_action = None device = None @@ -77,7 +74,7 @@ class HwMonitor(CoreSysAttributes): ## # Remove if ( - action in (UdevKernelAction.REMOVE, UdevKernelAction.UNBIND) + kernel.action in (UdevKernelAction.REMOVE, UdevKernelAction.UNBIND) and udev is None ): try: @@ -90,7 +87,10 @@ class HwMonitor(CoreSysAttributes): ## # Add - if action in (UdevKernelAction.ADD, UdevKernelAction.BIND) and udev is not None: + if ( + kernel.action in (UdevKernelAction.ADD, UdevKernelAction.BIND) + and udev is not None + ): device = Device( udev.sys_name, Path(udev.device_node),