谁能指出正确的方向来解决(或至少调试)我在启动时遇到的这个 rcu_preempt 问题,如下面的日志信息所示?
我思考该问题与“USB1”(第二个 USB 端口)的设备树配置有关,但我不确定是什么,因为第一个 USB 端口“USB0”没有此问题,并且两个端口的设备树定义相同。
这是启动时的日志记录:
[ 0.932884] xhci-hcd xhci-hcd.1.auto: xHCI Host Controller
[ 0.938388] xhci-hcd xhci-hcd.1.auto: new USB bus registered, assigned bus number 1
[ 0.946166] xhci-hcd xhci-hcd.1.auto: hcc params 0x0238f625 hci version 0x100 quirks 0x0000000002010810
[ 0.955602] xhci-hcd xhci-hcd.1.auto: irq 36, io mem 0xfe200000
[ 0.961677] xhci-hcd xhci-hcd.1.auto: xHCI Host Controller
[ 0.967187] xhci-hcd xhci-hcd.1.auto: new USB bus registered, assigned bus number 2
[ 0.974856] xhci-hcd xhci-hcd.1.auto: Host supports USB 3.0 SuperSpeed
[ 0.981927] hub 1-0:1.0: USB hub found
[ 0.985712] hub 1-0:1.0: 1 port detected
[ 0.990289] hub 2-0:1.0: USB hub found
[ 0.994137] hub 2-0:1.0: 1 port detected
[ 4.020674] Freeing initrd memory: 72488K
[ 21.999957] rcu: INFO: rcu_preempt detected stalls on CPUs/tasks:
[ 22.006039] rcu: 2-...0: (0 ticks this GP) idle=873/1/0x4000000000000000 softirq=89/89 fqs=2626
[ 22.014902] (detected by 3, t=5255 jiffies, g=-1059, q=16380 ncpus=4)
[ 22.021421] Task dump for CPU 2:
[ 22.024633] task:kworker/u8:2 state:R running task stack: 0 pid: 51 ppid: 2 flags:0x0000000a
[ 22.034548] Workqueue: events_unbound deferred_probe_work_func
[ 22.040380] Call trace:
[ 22.042810] __switch_to+0x100/0x1b0
[ 22.046378] of_get_next_child+0x40/0x78
[ 22.050293] of_platform_populate+0x70/0x130
[ 22.054555] dwc3_xlnx_probe+0x12c/0x1a0
[ 22.058470] platform_probe+0x64/0xd0
[ 22.062125] really_probe+0x150/0x3a0
[ 22.065779] __driver_probe_device+0x10c/0x180
[ 22.070215] driver_probe_device+0x38/0xe0
[ 22.074304] __device_attach_driver+0x94/0x120
[ 22.078740] bus_for_each_drv+0x74/0xc0
[ 22.082568] __device_attach+0xf0/0x1a8
[ 22.086396] device_initial_probe+0x10/0x18
[ 22.090572] bus_probe_device+0x90/0x98
[ 22.094400] deferred_probe_work_func+0x9c/0xe8
[ 22.098923] process_one_work+0x1a0/0x2f0
[ 22.102925] worker_thread+0x210/0x3f8
[ 22.106666] kthread+0x10c/0x118
[ 22.109887] ret_from_fork+0x10/0x20
这是我的 USB 相关项目的设备树:
aliases {
ethernet0 = &gem3;
i2c0 = &i2c0;
i2c1 = &i2c1;
mmc0 = &sdhci1;
nvmem0 = &eeprom;
rtc0 = &rtc;
serial0 = &uart0;
serial1 = &uart1;
serial2 = &dcc;
spi0 = &qspi;
usb0 = &usb0;
usb1 = &usb1;
};
....
pinctrl_usb0_default: usb0-default {
mux {
groups = "usb0_0_grp";
function = "usb0";
};
conf {
groups = "usb0_0_grp";
slew-rate = <SLEW_RATE_SLOW>;
power-source = <IO_STANDARD_LVCMOS18>;
};
conf-rx {
pins = "MIO52", "MIO53", "MIO55";
bias-high-impedance;
};
conf-tx {
pins = "MIO54", "MIO56", "MIO57", "MIO58", "MIO59",
"MIO60", "MIO61", "MIO62", "MIO63";
bias-disable;
};
};
pinctrl_usb1_default: usb1-default {
mux {
groups = "usb1_0_grp";
function = "usb1";
};
conf {
groups = "usb1_0_grp";
slew-rate = <SLEW_RATE_SLOW>;
power-source = <IO_STANDARD_LVCMOS18>;
};
conf-rx {
pins = "MIO64", "MIO65", "MIO67";
bias-high-impedance;
};
conf-tx {
pins = "MIO66", "MIO68", "MIO69", "MIO70", "MIO71",
"MIO72", "MIO73", "MIO74", "MIO75";
bias-disable;
};
};
....
&usb0 {
status = "okay";
clocks = <0x3 0x20>;
clock-names = "bus_clk";
};
&dwc3_0 {
/delete-property/ phy-names ;
/delete-property/ phys ;
snps,refclk_fladj;
snps,enable_guctl1_resume_quirk;
snps,enable_guctl1_ipd_quirk;
snps,xhci-stream-quirk;
maximum-speed = "high-speed";
snps,dis_u2_susphy_quirk;
snps,dis_u3_susphy_quirk;
snps,usb3_lpm_capable;
status = "okay";
dr_mode = "host";
};
&usb1 {
status = "okay";
clocks = <0x3 0x20>;
clock-names = "bus_clk";
};
&dwc3_1 {
/delete-property/ phy-names ;
/delete-property/ phys ;
snps,refclk_fladj;
snps,enable_guctl1_resume_quirk;
snps,enable_guctl1_ipd_quirk;
snps,xhci-stream-quirk;
maximum-speed = "high-speed";
snps,dis_u2_susphy_quirk;
snps,dis_u3_susphy_quirk;
snps,usb3_lpm_capable;
status = "okay";
dr_mode = "host";
};