Kernel Hacking

อั้นไว้หลายวัน วันนี้ sync แพ็กเกจเข้าเซิร์ฟเวอร์ไปสิบกว่าตัว รวมถึงแพ็กเกจบางตัวก็ย้ายเข้า testing ไปแล้ว เช่น beep music player, mplayer 1.0pre4, libdv 0.102, และ gflashplayer-installer ตัวท้ายนี่เป็น official stand-alone flashplayer ที่ Macromedia Inc. แจกให้ใช้ฟรีสำหรับลินุกซ์ แต่ห้าม redistribute เช่น เดียวกับ flash plugin ผมเลยทำเป็น installer แทน (ไอเดีย installer นี่ debian เขาใช้กันอยู่ พี่เทพแนะนำมาอีกที) installer ตัวนี้ช่วยติดตั้งและถอดโปรแกรม gflashplayer ออกจากระบบอัตโนมัติ แต่ไฟล์ที่ติดตั้งไปจะไม่อยู่ในสารบบของ rpm ทำให้ไม่สามารถตรวจสอบ conflict ได้ ผลก็คือ rpm อาจติดตั้งไฟล์ทับ gflashplayer หรือลบไฟล์ของ gflashplayer หรือแพ็กเกจที่ conflict ออกไปโดยไม่รู้ตัว .. โอกาสเกิดเหตุแบบนี้มีน้อยมากๆๆๆๆๆๆ ครับ ถ้ายังไม่ไว้ใจก็ยังไม่ต้องลงก็ได้ ผมจะหาทางแก้ปัญหาดูอีกที

ระหว่าง sync แพ็กเกจ เผลอลบไฟล์ในเซิร์ฟเวอร์ไป 1 GB เลยเสียเวลา sync ไฟล์ไปซะหลายชั่วโมง เฮ่อ ..

สายๆ นั่งแฮ็กเคอร์เนลแก้ IRQ routing ของ CardBus ในโน้ตบุคที่ใช้อยู่ (Acer TravelMate 361Evi, CardBus controller ของ O2Micro OZ6933) .. ปัญหามันก็คือ IRQ table ทั้งของ BIOS และ ACPI มันผิด มันกำหนดให้ CardBus ใช้ IRQ 11 ทั้งที่จริงๆ มันควรจะเป็น IRQ 9 หรือ 10 พอมัน route ไป IRQ 11 ซึ่งไม่ได้เชื่อมอยู่จริงๆ ก็ Oops ! กระจาย ไม่ก็ freeze ไปเลย .. ทางแก้ทำไปแล้วตั้งแต่ต้นๆ เดือน แดเนียล ริตซ์ เขาช่วยดูให้ วิธีการคือฮาร์ดโค้ดใน arch/i386/pci/irq.c (2.6 branch) เช็คว่าถ้าเป็น BIOS ของ TravelMate 360 series และมี pmask เป็น 0x63 (pmask ของ OZ6933) จะสั่ง route ไปที่ IRQ 10 เสมอ .. สำเร็จครับ CardBus ทำงานได้แจ๋วเลย .. แดเนียลเมลมาถามให้ทดสอบว่าทุกอย่างใช้งานได้ปกติแล้วหรือเปล่า ผมเช็คแล้วทุกอย่างดูดีก็เลยบอกเขาว่าแพตช์น่าจะใช้ได้ จึง reply all กลับไปให้ แดเนียล, แอนดรูว์ มอร์ตัน (co-maintainer 2.6 กับ ลินุส ทอร์วาลด์), มาร์เซลโล โทซัตติ (maintener 2.4), และ เลน บราวน์ (Linux ACPI) .. ไม่กี่ชั่วโมงต่อมาแอนดรูว์รีลีสแพตช์ 2.6.5-mm4 ผมอ่าน ChangeLog เห็นมีแพตช์ของแดเนียลรวมเข้าไปแล้ว .. เร็วโคตร .. ดูๆ ไปวิธีฮาร์ดโค้ดแบบนี้ออกจะดุไปสักหน่อย เลน บราวน์ เองก็ไม่ค่อยชอบ เขาอยากหาต้นเหตุของปัญหานี้มากกว่า อีกอย่างคือวิธีฮาร์ดโค้ดแบบนี้แม้จะตรงไปตรงมาแต่ไม่ใช่วิธีที่ดีนัก เพราะมันไม่สเกล .. ทำไงได้ เท่าที่ผมทดสอบและให้ข้อมูลไป ก็ไม่มีวิธีแก้ทางอื่นเลย ข้อมูล IRQ table มันผิดตั้งแต่แรก

เวลาล่วงเลยไปหลายสัปดาห์ จนผมเปลี่ยนมาใช้ 2.6.5-mm6 .. วันนี้เพิ่งได้เสียบ HandyDrive (USB Storage) ใช้งาน ปรากฏว่าทำงานตะกุกตะกักมาก แถมมี error message ขึ้นมาเป็นระยะๆ ผมก็เริ่มเอะใจว่าจะเป็นที่แพตช์ของแดเนียลหรือเปล่า เพราะเขาก็เคยบอกนัยๆ ว่ามันอาจจะมีปัญหากับ USB แต่ในเวลานั้นผมทดสอบกับวานิลลา 2.6.5 ละเอียดแล้ว ทดลองใช้งานดูก็ปกติดี .. อย่างไรก็ตามสาเหตุเรื่องนี้น่าจะเป็นเพราะหนึ่งใน USB controller ใช้ pmask เป็น 0x63 เหมือน CardBus ก็เลยโดน route ไปที่ IRQ 10 ด้วย (ปกติควรอยู่ที่ IRQ 11) .. งานนี้จะกวนแดเนียลอีกก็กระไร อีกอย่างผมอยากทดสอบเองก่อนจะให้ข้อมูลเขา ก็เลยแฮ็กเคอร์เนลเอง เพิ่มโค้ดให้เช็ค vendor id และ device id ไปเลย จะได้ชัวร์ๆ ว่า re-route IRQ ไม่ผิดตัว (โค้ดก็เลยฮาร์ดหนักเข้าไปใหญ่ทีนี้) .. หลังแฮ็กแล้วก็ดูเหมือนจะดีขึ้น ไม่มี error message แล้ว การทำงานของ HandyDrive ลื่นเป็นปกติดี น่าจะใช้ได้แล้วล่ะ ผมส่งโค้ดกลับไปให้แดเนียลดูแล้ว พรุ่งนี้อาจจะรู้ว่าเขาคิดยังไงกับโค้ดที่แก้ไป :)

บ่ายๆ ออกไปจ่ายเบี้ยประกัน (กรมธรรม์แบบสะสมตังค์) แรกๆ ก็รู้สึกว่าเงินหายไปเยอะ แต่คิดอีกทีก็เหมือนโอนเงินจากธนาคารนึงไปฝากอีกธนาคารนึง ได้ดอกเยอะกว่าด้วย อืมคิดแบบนี้ค่อยสบายใจ กินซิซซ์เลอร์ เป็นมื้อเย็น อิ่มโคตร น้องๆ ที่ไปด้วยกันบอกว่าผมกินไม่คุ้ม (- -‘)