[Nokia-7215][armhf] Enable Watchdog service (#16612) (#17522)

This commit is contained in:
mssonicbld 2023-12-16 01:35:16 +08:00 committed by GitHub
parent c63a4c6a4a
commit c49d7c5417
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 115 additions and 30 deletions

View File

@ -0,0 +1,46 @@
#!/usr/bin/python
from sonic_platform.chassis import Chassis
from sonic_py_common import logger
import time
import os
import signal
import sys
TIMEOUT=170
KEEPALIVE=55
sonic_logger = logger.Logger('Watchdog')
sonic_logger.set_min_log_priority_info()
time.sleep(60)
chassis = Chassis()
watchdog = chassis.get_watchdog()
def stopWdtService(signal, frame):
watchdog._disablewatchdog()
sonic_logger.log_notice("CPUWDT Disabled: watchdog armed=%s" % watchdog.is_armed() )
sys.exit()
def main():
signal.signal(signal.SIGHUP, signal.SIG_IGN)
signal.signal(signal.SIGINT, stopWdtService)
signal.signal(signal.SIGTERM, stopWdtService)
watchdog.arm(TIMEOUT)
sonic_logger.log_notice("CPUWDT Enabled: watchdog armed=%s" % watchdog.is_armed() )
while True:
time.sleep(KEEPALIVE)
watchdog._keepalive()
sonic_logger.log_info("CPUWDT keepalive")
done
stopWdtService
return
if __name__ == '__main__':
main()

View File

@ -0,0 +1,8 @@
[Unit]
Description=CPU WDT
After=nokia-7215init.service
[Service]
ExecStart=/usr/local/bin/cpu_wdt.py
[Install]
WantedBy=multi-user.target

View File

@ -8,7 +8,7 @@ provides access to hardware watchdog
import os import os
import fcntl import fcntl
import array import array
import time
from sonic_platform_base.watchdog_base import WatchdogBase from sonic_platform_base.watchdog_base import WatchdogBase
""" ioctl constants """ """ ioctl constants """
@ -35,7 +35,7 @@ WDIOS_DISABLECARD = 0x0001
WDIOS_ENABLECARD = 0x0002 WDIOS_ENABLECARD = 0x0002
""" watchdog sysfs """ """ watchdog sysfs """
WD_SYSFS_PATH = "/sys/class/watchdog/" WD_SYSFS_PATH = "/sys/class/watchdog/watchdog0/"
WD_COMMON_ERROR = -1 WD_COMMON_ERROR = -1
@ -52,16 +52,32 @@ class WatchdogImplBase(WatchdogBase):
@param wd_device_path Path to watchdog device @param wd_device_path Path to watchdog device
""" """
super(WatchdogImplBase, self).__init__() super(WatchdogImplBase, self).__init__()
self.watchdog=""
self.watchdog_path = wd_device_path self.watchdog_path = wd_device_path
self.watchdog = os.open(self.watchdog_path, os.O_WRONLY) self.wd_state_reg = WD_SYSFS_PATH+"state"
self.wd_timeout_reg = WD_SYSFS_PATH+"timeout"
# Opening a watchdog descriptor starts self.wd_timeleft_reg = WD_SYSFS_PATH+"timeleft"
# watchdog timer; by default it should be stopped
self._disablewatchdog()
self.armed = False
self.timeout = self._gettimeout() self.timeout = self._gettimeout()
def _read_sysfs_file(self, sysfs_file):
# On successful read, returns the value read from given
# reg_name and on failure returns 'ERR'
rv = 'ERR'
if (not os.path.isfile(sysfs_file)):
return rv
try:
with open(sysfs_file, 'r') as fd:
rv = fd.read()
except Exception as e:
rv = 'ERR'
rv = rv.rstrip('\r\n')
rv = rv.lstrip(" ")
return rv
def _disablewatchdog(self): def _disablewatchdog(self):
""" """
Turn off the watchdog timer Turn off the watchdog timer
@ -102,11 +118,10 @@ class WatchdogImplBase(WatchdogBase):
Get watchdog timeout Get watchdog timeout
@return watchdog timeout @return watchdog timeout
""" """
timeout=0
timeout=self._read_sysfs_file(self.wd_timeout_reg)
req = array.array('I', [0]) return timeout
fcntl.ioctl(self.watchdog, WDIOC_GETTIMEOUT, req, True)
return int(req[0])
def _gettimeleft(self): def _gettimeleft(self):
""" """
@ -127,15 +142,20 @@ class WatchdogImplBase(WatchdogBase):
ret = WD_COMMON_ERROR ret = WD_COMMON_ERROR
if seconds < 0: if seconds < 0:
return ret return ret
# Stop the watchdog service to gain access of watchdog file pointer
if self.is_armed():
os.popen("systemctl stop cpu_wdt.service")
time.sleep(2)
if not self.watchdog:
self.watchdog = os.open(self.watchdog_path, os.O_WRONLY)
try: try:
if self.timeout != seconds: if self.timeout != seconds:
self.timeout = self._settimeout(seconds) self.timeout = self._settimeout(seconds)
if self.armed: if self.is_armed():
self._keepalive() self._keepalive()
else: else:
self._enablewatchdog() self._enablewatchdog()
self.armed = True
ret = self.timeout ret = self.timeout
except IOError: except IOError:
pass pass
@ -150,13 +170,17 @@ class WatchdogImplBase(WatchdogBase):
A boolean, True if watchdog is disarmed successfully, False A boolean, True if watchdog is disarmed successfully, False
if not if not
""" """
try: if self.is_armed():
self._disablewatchdog() os.popen("systemctl stop cpu_wdt.service")
self.armed = False time.sleep(2)
self.timeout = 0 if not self.watchdog:
except IOError: self.watchdog = os.open(self.watchdog_path, os.O_WRONLY)
return False try:
self._disablewatchdog()
self.timeout = 0
except IOError:
return False
return True return True
@ -164,8 +188,13 @@ class WatchdogImplBase(WatchdogBase):
""" """
Implements is_armed WatchdogBase API Implements is_armed WatchdogBase API
""" """
status = False
return self.armed state = self._read_sysfs_file(self.wd_state_reg)
if (state != 'inactive'):
status = True
return status
def get_remaining_time(self): def get_remaining_time(self):
""" """
@ -174,10 +203,7 @@ class WatchdogImplBase(WatchdogBase):
timeleft = WD_COMMON_ERROR timeleft = WD_COMMON_ERROR
if self.armed: if self.is_armed():
try: timeleft=self._read_sysfs_file(self.wd_timeleft_reg)
timeleft = self._gettimeleft()
except IOError:
pass
return timeleft return int(timeleft)

View File

@ -1,6 +1,8 @@
nokia-7215_plt_setup.sh usr/sbin nokia-7215_plt_setup.sh usr/sbin
7215/scripts/nokia-7215init.sh usr/local/bin 7215/scripts/nokia-7215init.sh usr/local/bin
7215/scripts/cpu_wdt.py usr/local/bin
7215/service/nokia-7215init.service etc/systemd/system 7215/service/nokia-7215init.service etc/systemd/system
7215/service/cpu_wdt.service etc/systemd/system
7215/service/fstrim.timer/timer-override.conf /lib/systemd/system/fstrim.timer.d 7215/service/fstrim.timer/timer-override.conf /lib/systemd/system/fstrim.timer.d
7215/sonic_platform-1.0-py3-none-any.whl usr/share/sonic/device/armhf-nokia_ixs7215_52x-r0 7215/sonic_platform-1.0-py3-none-any.whl usr/share/sonic/device/armhf-nokia_ixs7215_52x-r0
inband_mgmt.sh etc/ inband_mgmt.sh etc/

View File

@ -7,5 +7,8 @@ sh /usr/sbin/nokia-7215_plt_setup.sh
systemctl enable nokia-7215init.service systemctl enable nokia-7215init.service
systemctl start nokia-7215init.service systemctl start nokia-7215init.service
systemctl enable cpu_wdt.service
systemctl start cpu_wdt.service
exit 0 exit 0