2010-01-07 23 views
15

Tôi có bộ xử lý AT91SAM9G20 chạy hạt nhân 2.6. Cơ quan giám sát được kích hoạt ở cấp khởi động và được cấu hình trong 16 giây. Watchdog chế độ đăng ký có thể được cấu hình chỉ một lần. Khi mã bị treo trong bootstrap, bootloader hoặc kernel, bo mạch sẽ khởi động lại. Nhưng một khi hạt nhân xuất hiện mặc dù cơ quan giám sát không được làm mới trong bất kỳ ứng dụng nào, bảng sẽ không được đặt lại sau 16 giây, nhưng 15 phút.Ai đang làm mới phần cứng watchdog trong Linux?

Ai đang làm mới cơ quan giám sát?

Trong trường hợp của chúng tôi, cơ quan giám sát phải chịu ảnh hưởng của các ứng dụng, để bảng có thể đặt lại nếu ứng dụng của chúng tôi bị treo.

Đây là những tiến trình đang chạy:

1 root  init 
2 root  [kthreadd] 
3 root  [ksoftirqd/0] 
4 root  [watchdog/0] 
5 root  [events/0] 
6 root  [khelper] 
63 root  [kblockd/0] 
72 root  [ksuspend_usbd] 
78 root  [khubd] 
85 root  [kmmcd] 
107 root  [pdflush] 
108 root  [pdflush] 
109 root  [kswapd0] 
110 root  [aio/0] 
740 root  [mtdblockd] 
828 root  [rpciod/0] 
982 root  [jffs2_gcd_mtd10] 
1003 root  /sbin/udevd -d 
1145 daemon portmap 
1158 dbus  dbus-daemon --system 
1178 root  /usr/sbin/ifplugd -i eth0 -fwI -u0 -d5 -l -q 
1190 root  /usr/sbin/ifplugd -i eth1 -fwI -u0 -d5 -l -q 
1221 default avahi-daemon: running [SP14.local] 
1226 root  /usr/sbin/dropbear 
1246 root  /root/bin/host_app 
1254 root  /root/bin/mini_httpd -c *.cgi -d /root/bin -u root -E /root/bin/ 
1256 root  -sh 
1257 root  /sbin/syslogd -n -m 0 
1258 root  /sbin/klogd -n 
1259 root  /usr/bin/tail -f /var/log/messages 
1265 root  ps -e 

Chúng tôi đang sử dụng cơ quan giám sát cho lockups mềm có sẵn trong kernel-2.6.25-ts.at91sam9g20/kernel/softlockup.c

Trả lời

0

Sẽ không phải là hạt nhân được làm mới bộ đếm thời gian watchdog? Cơ quan giám sát được thiết kế để đặt lại bảng nếu toàn bộ hệ thống treo, không chỉ là một ứng dụng duy nhất.

+1

Tôi đã tìm kiếm toàn bộ mã nhân. Tôi đã không tìm thấy bất kỳ những thứ như vậy trong hạt nhân. Nếu đó là lý do tại sao nó được thiết lập lại sau 15 phút? – Shashikiran

6

này có thể cung cấp cho bạn một gợi ý: http://www.mjmwired.net/kernel/Documentation/watchdog/watchdog-api.txt

Nó làm cho cảm giác hoàn hảo để có một daemon không gian người dùng xử lý các cơ quan giám sát. Nó có thể mặc định là thời gian chờ 15 phút.

+1

Trong không gian người dùng, không có trình theo dõi daemon nào đang chạy. – Shashikiran

+1

Vì vậy, không có thông báo trong nhật ký khi hệ thống khởi động lại sau 15 phút? Thật kỳ lạ. –

+1

9G20 là bộ xử lý được nhúng và có thể có ổ đĩa gốc ramdisk. Nó có thể không có một bản ghi liên tục. –

14

Nếu bạn bật trình điều khiển cơ quan giám sát trong hạt nhân, trình điều khiển cơ quan giám sát sẽ thiết lập bộ hẹn giờ hạt nhân, chịu trách nhiệm đặt lại cơ quan giám sát. Mã tương ứng là here. Vì vậy, nó hoạt động như thế này:

Nếu không có ứng dụng nào mở tệp/dev/watchdog, thì hạt nhân sẽ chăm sóc đặt lại cơ quan giám sát. Vì nó là một bộ đếm thời gian, nó sẽ không xuất hiện như một chuỗi hạt nhân chuyên dụng, mà được xử lý bởi chuỗi IRQ mềm. Bây giờ, nếu một ứng dụng mở tệp này, nó sẽ trở thành chịu trách nhiệm của cơ quan giám sát và có thể đặt lại nó bằng cách ghi vào tệp, như được tài liệu bằng tài liệu được liên kết trong bài đăng của Richard.

Trình điều khiển cơ quan giám sát có được định cấu hình trong hạt nhân của bạn không? Nếu không, bạn nên định cấu hình và xem liệu việc đặt lại có vẫn diễn ra hay không. Nếu nó vẫn xảy ra, có khả năng là thiết lập lại của bạn đến từ một nơi khác.

Nếu hạt nhân của bạn quá cũ để có trình điều khiển cơ quan giám sát thích hợp (không có trong 2.6.25), bạn nên backport từ 2.6.28. Hoặc bạn có thể thử vô hiệu hóa cơ quan giám sát trong bộ nạp khởi động của bạn và xem liệu việc đặt lại vẫn xảy ra.

+0

Đăng ký cơ quan giám sát được cấu hình trong bootstrap. Chế độ đăng ký ghi một lần. Nơi hạt nhân là làm mới watchdog. Trong mã hạt nhân của chúng tôi tĩnh void at91_ping (unsigned dữ liệu dài) chức năng không có mặt. Có thể chặn hạt nhân ngừng làm mới không? – Shashikiran

2

chúng tôi gặp sự cố tương tự về WDT trên AT91SAM9263. Vấn đề là với bit 29 WDIDLEHLT của WDT_MR (Address: 0xFFFFFD44) đăng ký. Bit này được đặt thành 1 nhưng nó phải là 0 cho nhu cầu ứng dụng của chúng tôi.

Bit lời giải thích từ tài liệu kỹ thuật:

• WDIDLEHLT: Watchdog Nhàn rỗi Halt

  1. 0: The Watchdog chạy khi hệ thống đang ở chế độ nhàn rỗi.
  2. 1: Cơ quan giám sát dừng khi hệ thống ở trạng thái không hoạt động.

Điều này có nghĩa là bộ đếm WDT không tăng khi hạt nhân ở trạng thái chờ, do đó độ trễ 15 hoặc nhiều hơn cho đến khi đặt lại xảy ra.Bạn có thể thử "dd if =/dev/zero of =/dev/null" để ngăn hạt nhân vào trạng thái chờ và bạn sẽ được đặt lại sau 16 giây (hoặc bất kỳ khoảng thời gian nào bạn đã đặt trong thanh ghi WDT_MR) .

Vì vậy, giải pháp là cập nhật mã khởi động u hoặc đoạn mã khác đặt đăng ký WDT_MR. Hãy nhớ rằng thanh ghi này được viết một lần ...

6

Vào tháng 7 năm 2016 a commit in the 4.7 kernel để watchdog_dev.c cho phép hành vi tương tự như câu trả lời của shodanex cho tất cả trình điều khiển bộ đếm thời gian watchdog. Điều này dường như không được ghi lại ở bất kỳ đâu ngoài chủ đề này và mã nguồn.

/* 
* A worker to generate heartbeat requests is needed if all of the 
* following conditions are true. 
* - Userspace activated the watchdog. 
* - The driver provided a value for the maximum hardware timeout, and 
* thus is aware that the framework supports generating heartbeat 
* requests. 
* - Userspace requests a longer timeout than the hardware can handle. 
* 
* Alternatively, if userspace has not opened the watchdog 
* device, we take care of feeding the watchdog if it is 
* running. 
*/ 

return (hm && watchdog_active(wdd) && t > hm) || 
     (t && !watchdog_active(wdd) && watchdog_hw_running(wdd));