rcu_preempt가 USB 장치 트리로 인해 임베디드 Linux 부팅 지연을 감지합니까?

rcu_preempt가 USB 장치 트리로 인해 임베디드 Linux 부팅 지연을 감지합니까?

아래 로그 메시지에 표시된 대로 누구든지 부팅 시 발생하는 이 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";
};

관련 정보