我正在寫一些內核驅動程序,我需要檢查哪個線程在另一個核心上的某個點上運行。我的驅動程序在每個內核上運行一個內核線程,我需要不時同步一些線程來完成某些任務。我可以從調試日誌中觀察到有時一個線程太多地等待其他線程。我做了一些補丁,我將__preempt_count
存儲在其他內核上,以檢查是否有softirq/hardirq或搶佔失效延遲我的線程。 我還使用FTRACE檢查irqsoff和preemptirqsoff,以關閉IRQ的最大持續時間並禁用先佔權。在基於SMP的linux系統中訪問另一個cpu的「current_task」指針
到現在爲止,我能夠發現kerneloops線程,這是禁用中斷高達20毫秒,我發現太長。 做了一個systemctl disable kerneloops
並擺脫了這個問題。
現在我似乎處理一些搶先禁用窗口。對於未來的驅動程序分析,我需要一種方法來確定哪些線程正在其他內核的特定時間點執行。我試圖用FTRACE主要與IRQ進入/退出事件,我也用trace_printk
推一些調試日誌中ftrace緩衝區有一個日誌一切,等
然而,有一兩件事,我會喜歡做的是訪問其他內核的current_task
結構(current
ptr)並打印comm
字段,該字段給出任務的名稱(或pid值)。 但是我很難完成這件事。
對於__preempt_count
我沒有問題:
int *p = per_cpu_ptr(&__preempt_count,cpu);
pr_info("Preempt count of cpu%u is 0x%08x\n",cpu,*p);
到目前爲止,我曾與聲明或每CPU變量訪問沒有問題,但由於某些原因,current_task
指針試圖訪問它時,會觸發頁面錯誤。
char buf[10];
struct task_struct *task = per_cpu_ptr(current_task,cpu);
snprintf(buf,8,"%s",task->comm);
pr_info("Task name: %s",buf);
以上代碼總是觸發頁面錯誤,NULL PTR喇嘛喇嘛。 直到現在我找不到原因。我試圖打印task
的指針值,我得到了相同的頁面錯誤。
可能是因爲該地址無法被其他內核訪問?在內核空間中不應該是這種情況。到目前爲止,我還沒有發現每個核心變量的問題,我在這方面發揮了很大的作用。
底線:訪問其他內核的current_task
並打印comm/pid字段的正確方法是什麼?
非常感謝,
丹尼爾