tl; ดร:
- แป้นพิมพ์และเมาส์ใช้ไม่ได้กับเคอร์เนลบางตัว
- ไม่ขอวิธีแก้ปัญหาฉันมีอยู่แล้ว
- โดยใช้
คอมไพล์แบ่งครึ่ง
ฉันได้ระบุการกระทำที่แน่นอนในที่เก็บเคอร์เนล Ubuntu ซึ่งอุปกรณ์อินพุตของฉันหยุดทำงาน
- ฉันต้องทำอย่างไรต่อไป เนื่องจากไม่เกิดการแตกหักในเมล็ดอัพสตรีมล่าสุด
อุปกรณ์อินพุต USB ของฉัน:
- คีย์บอร์ดแบบมีสาย Logitech G19
- เมาส์แบบมีสาย Logitech G502
- แป้นพิมพ์ Sharkoon (ธรรมดามาก ไม่มีแสงแป้นพิมพ์ ไม่มีจอแสดงผล ไม่มีปุ่มพิเศษพิเศษ)
เวอร์ชันอูบุนตู: 21.10
ฟังก์ชันปกติ (คาดหวัง):
- ในด้วง:
- มีไฟคีย์บอร์ดและเมาส์ บน
- NumLock LED จะดับและสว่างขึ้นเมื่อฉันกดแป้น NumLock ซ้ำๆ
- แป้นพิมพ์ใช้งานได้ (ฉันสามารถใช้ปุ่มลูกศรในเมนู Grub)
- ในหน้าจอเข้าสู่ระบบ Gnome:
- มีไฟคีย์บอร์ดและเมาส์ บน
- NumLock LED จะดับและสว่างขึ้นเมื่อฉันกดแป้น NumLock ซ้ำๆ
- ตัวชี้เมาส์บนหน้าจอ ย้าย เมื่อฉันเลื่อนเมาส์
- การพิมพ์ใช้งานได้ (ฉันสามารถพิมพ์รหัสผ่านของฉันในหน้าจอเข้าสู่ระบบ)
เมื่อไม่ทำงาน:
- ในด้วง:
- มีไฟคีย์บอร์ดและเมาส์ บน
- NumLock LED จะดับและสว่างขึ้นเมื่อฉันกดแป้น NumLock ซ้ำๆ
- แป้นพิมพ์ใช้งานได้ (ฉันสามารถใช้ปุ่มลูกศรในเมนู Grub)
- ในหน้าจอเข้าสู่ระบบ Gnome:
- มีไฟคีย์บอร์ดและเมาส์ ปิด
- NumLock LED ดับและดับเมื่อฉันกดแป้น NumLock ซ้ำๆ
- ตัวชี้เมาส์บนหน้าจอ ไม่เคลื่อนไหว เมื่อฉันเลื่อนเมาส์
- การพิมพ์ไม่ทำงาน
จากข้อมูลข้างต้น ฉันมีสถานการณ์ที่ชัดเจนมากในการทดสอบว่าเคอร์เนลบางตัวใช้งานได้สำหรับฉันหรือไม่ ฉันได้ติดตั้งเคอร์เนลต่างๆ ด้วย 3 วิธี:
- โดยใช้
ฉลาด
-> เคอร์เนล Ubuntu ได้จาก repo ของ Ubuntu
- ใช้ ตัวติดตั้งเคอร์เนล Ubuntu Mainline -> เมล็ดที่รวบรวมไว้ล่วงหน้าจาก kernel.org
- การใช้เคอร์เนล Ubuntu ที่ฉันรวบรวมเอง git://kernel.ubuntu.com/ubuntu/ubuntu-impish.git. ฉันใช้
คอมไพล์แบ่งครึ่ง
เพื่อชำระเงินค่าคอมมิชชันที่แตกต่างกัน จากนั้นสร้างแต่ละรายการ เพื่อให้ฉันสามารถค้นหาคอมมิชชันที่แน่นอนซึ่งแป้นพิมพ์และเมาส์หยุดทำงาน
- เมล็ดทำงาน ทดสอบ:
- 5.13.0-051300-ทั่วไป (UKMI)
- 5.13.0-19-ทั่วไป (apt)
- 5.13.0-20-ทั่วไป (ฉลาด)
- 5.13.0-21-ทั่วไป (ฉลาด)
- 5.13.0-22-ทั่วไป (ฉลาด)
- Ubuntu-5.13.0-22.22-0-g3ab15e228151 (คอมไพล์)
- Ubuntu-5.13.0-22.22-317-g398351230dab (คอมไพล์)
- Ubuntu-5.13.0-22.22-356-g8ac4e2604dae (คอมไพล์)
- Ubuntu-5.13.0-22.22-376-gfab6fb5e61e1 (คอมไพล์)
- Ubuntu-5.13.0-22.22-386-gce5ff9b36bc3 (คอมไพล์)
- 5.16.11-051611-ทั่วไป (UMKI)
- เมล็ดล้มเหลว ทดสอบแล้ว:
- Ubuntu-5.13.0-22.22-387-g0fc979747dec (คอมไพล์)
- Ubuntu-5.13.0-22.22-388-gab2802ea6621 (คอมไพล์)
- Ubuntu-5.13.0-22.22-391-ge24e59fa409c (คอมไพล์)
- Ubuntu-5.13.0-22.22-396-gc3d35f3acc3a (คอมไพล์)
- Ubuntu-5.13.0-22.22-475-g79b62d0bba89 (คอมไพล์)
- Ubuntu-5.13.0-23.23-0-gb188ba567fc9 (คอมไพล์)
- 5.13.0-23-ทั่วไป (ฉลาด)
- 5.13.0-25-ทั่วไป (ฉลาด)
- 5.13.0-27-ทั่วไป (ฉลาด)
- 5.13.0-28-ทั่วไป (ฉลาด)
- 5.13.0-30-ทั่วไป (ฉลาด)
Kernel 5.13.0-22 เป็นเคอร์เนลล่าสุดของ Ubuntu ที่ให้บริการผ่าน ฉลาด
ที่เหมาะกับฉัน ดังนั้นฉันจึงปักหมุดเวอร์ชันนั้นเพื่อป้องกันไม่ให้อัปเกรดอัตโนมัติฉันทำอย่างนั้นได้อย่างไร อยู่นอกเหนือขอบเขตของคำถามของฉัน
5.13.0-23 เป็นเคอร์เนล Ubuntu ตัวแรกที่หยุดคีย์บอร์ดและเมาส์สำหรับฉัน ดังนั้นฉันจึงรู้ว่าการกระทำที่ทำลายมัน ต้องอยู่ระหว่าง 5.13.0-22 และ 5.13.0-23 ฉันใช้ คอมไพล์แบ่งครึ่ง
เพื่อระบุการกระทำที่แน่นอนและฉันพบมัน นี่หมายถึงการวิ่ง คอมไพล์แบ่งครึ่ง
คอมไพล์และติดตั้งเคอร์เนล รีบูต ทดสอบว่าอุปกรณ์อินพุตทำงานหรือไม่ จากนั้นทำ git bisect ดี
หรือ git bisect ไม่ดี
ตามผลการทดสอบ การรวบรวมแต่ละครั้งใช้เวลาประมาณ 22 นาที ดังนั้นคุณคงนึกออกว่าฉันใช้เวลาพอสมควร!
การกระทำที่แน่นอนที่อุปกรณ์อินพุตของฉันหยุดทำงานคือ Ubuntu-5.13.0-22.22-387-g0fc979747dec
. ประกอบด้วยการเปลี่ยนแปลงนี้:
xhci: แก้ไขความเสียหายของตัวชี้วงแหวนคำสั่งในขณะที่ยกเลิกคำสั่ง
BugLink: https://bugs.launchpad.net/bugs/1951880
ยอมรับ ff0e50d3564f33b7f4b35cadeabd951d66cfc570 ต้นน้ำ
ตัวชี้วงแหวนคำสั่งอยู่ที่ [6:63] บิตของคำสั่ง
รีจิสเตอร์ควบคุมวงแหวน (CRCR) บิตควบคุมทั้งหมด เช่น คำสั่งหยุด
ยกเลิกอยู่ที่บิต [0:3] ในขณะที่ยกเลิกคำสั่ง เราอ่าน
CRCR และตั้งค่าบิตยกเลิกและเขียนไปยัง CRCR การอ่านจะเสมอ
ให้ตัวชี้วงแหวนคำสั่งเป็นศูนย์ทั้งหมด ดังนั้นเราจึงเขียนเป็นหลักเท่านั้น
บิตควบคุม เนื่องจากเราแยกการเขียน 64 บิตออกเป็นการเขียน 32 บิตสองครั้ง
มีความเป็นไปได้ที่วงแหวนคำสั่ง xHC จะหยุดก่อนที่ด้านบน
dword (เลขศูนย์ทั้งหมด) ถูกเขียนขึ้น หากเป็นเช่นนั้น xHC จะอัปเดตส่วนบน
dword ของตัวชี้วงแหวนคำสั่งภายในที่มีศูนย์ทั้งหมด คราวหน้า,
เมื่อรีสตาร์ทวงแหวนคำสั่ง เราจะเห็นความล้มเหลวในการเข้าถึงหน่วยความจำ xHC
แก้ไขปัญหานี้โดยเขียนไปที่ dword ล่างของ CRCR เท่านั้น โดยที่ทั้งหมด
บิตควบคุมอยู่
สำเนาถึง: [email protected]
ลงนามโดย: Pavankumar Kondeti <[email protected]>
ลงนามโดย: Mathias Nyman <[email protected]>
ลิงค์: https://lore.kernel.org/r/[email protected]
ลงนามโดย: Greg Kroah-Hartman <[email protected]>
ลงนามโดย: Kamal Mostafa <[email protected]>
ลงนามโดย: Stefan Bader <[email protected]>
ความแตกต่าง --git a/drivers/usb/host/xhci-ring.c b/drivers/usb/host/xhci-ring.c
ดัชนี 5b54a36..5a96f3e 100644
--- a/drivers/usb/host/xhci-ring.c
+++ b/drivers/usb/host/xhci-ring.c
@@ -366,16 +366,22 @@ โมฆะคงที่ xhci_handle_stopped_cmd_ring(struct xhci_hcd *xhci,
/* ต้องเรียกด้วย xhci->lockhold, releases และ aquires lock back */
int xhci_abort_cmd_ring แบบคงที่ (struct xhci_hcd *xhci, แฟล็กแบบยาวที่ไม่ได้ลงนาม)
{
- u64 temp_64;
+u32 temp_32;
int ret;
xhci_dbg(xhci, "ยกเลิกวงแหวนคำสั่ง\n");
reinit_completion(&xhci->cmd_ring_stop_completion);
- temp_64 = xhci_read_64(xhci, &xhci->op_regs->cmd_ring);
- xhci_write_64(xhci, temp_64 | CMD_RING_ABORT,
- &xhci->op_regs->cmd_ring);
+ /*
+ * บิตควบคุมเช่น command stop, abort จะอยู่ด้านล่าง
+ * dword ของรีจิสเตอร์ควบคุมวงแหวนคำสั่ง จำกัด การเขียน
+ * ไปที่ dword ที่ต่ำกว่าเพื่อหลีกเลี่ยงความเสียหายของตัวชี้วงแหวนคำสั่ง
+ * ในกรณีที่คำสั่งหยุดทำงานตามเวลาบน dword
+ * เขียนว่า
+ */
+ temp_32 = readl(&xhci->op_regs->cmd_ring);
+ การเขียน (temp_32 | CMD_RING_ABORT, &xhci->op_regs->cmd_ring);
/* ส่วน 4.6.1.2 ของสเป็ค xHCI 1.0 ระบุว่าซอฟต์แวร์ควรจับเวลา
* เสร็จสิ้นการดำเนินการยกเลิกคำสั่ง ถ้า CRR ไม่ถูกลบล้างตามข้อ 5
ที่เชื่อมโยง บั๊ก Launchpad ไม่ก่อให้เกิดประโยชน์อะไร เพราะไม่เฉพาะเจาะจงเกี่ยวกับการเปลี่ยนแปลงนี้เท่านั้น
ที่เชื่อมโยง เธรดอีเมล ระหว่าง Mathias Nyman, Pavan Kondeti และ youling257 เกี่ยวกับการเปลี่ยนแปลงนี้ อย่างไรก็ตาม บทสนทนากลับอยู่ในหัวของฉัน
Mathias Nyman ได้ทำการอัปเดตแพตช์ของเขา การเปลี่ยนแปลงดั้งเดิมของเขา (พร้อมข้อบกพร่อง) มีอยู่แล้วในเคอร์เนลของ Ubuntu ซึ่งเป็นแพตช์ที่เขาแก้ไขนั้นไม่ใช่ แพทช์จาก Mathias Nyman อยู่ในเคอร์เนลฉีดเป็น v5.16-rc3-1-g09f736aa9547
ซึ่งหมายความว่ารวมอยู่ใน 5.16
เคอร์เนลเมนไลน์ ตาม https://kernel.ubuntu.com/เวอร์ชันถัดไปของ Ubuntu, Jammy Jellyfish / 22.04 LTS จะขึ้นอยู่กับอัปสตรีม 5.15
เคอร์เนล ซึ่งฉันคิดว่าหมายความว่า Ubuntu 22.04 LTS จะยังมีแป้นพิมพ์และเมาส์ที่ใช้งานไม่ได้สำหรับฉัน เว้นแต่จะเพิ่มแพตช์ของ Mathias Nyman ลงในเคอร์เนล Ubuntu
ฉันได้ถามบน #เคอร์เนลอูบุนตู ช่อง IRC แต่ฉันอาจถามในเวลาที่คนออนไลน์ไม่มากนักเพื่อดูคำถามของฉัน หรือบางทีช่องนั้นอาจใช้งานไม่ได้ ถ้าฉันดูที่ไฟล์บันทึก
ฉันได้รายงานจุดบกพร่องบน Launchpad: https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1963555
มีอะไรอีกไหมที่ฉันทำได้/ควรทำ