แพตช์กำลังรอดำเนินการผ่าน x86/urgent เพื่อแก้ไขปัญหาเกี่ยวกับโปรเซสเซอร์ Intel Alder Lake และ Raptor Lake ที่ทำให้นักพัฒนาเคอร์เนลต้องปิดใช้งาน Process Context Identifiers (PCID) ด้วยโปรเซสเซอร์โมบายล์/เดสก์ท็อปของ Intel ในขณะนี้
แพตช์ได้รับการตั้งค่าให้เป็น mainlined สำหรับการพัฒนา Linux 6.4 และแบ็คพอร์ตไปยังเวอร์ชันเคอร์เนลที่เสถียรเพื่อหลีกเลี่ยงการล้างข้อมูล INVLPG โดยรวมที่ไม่สมบูรณ์ แพทช์จาก วิศวกร Intel Linux อธิบายว่า:
“คำสั่ง INVLPG ใช้เพื่อทำให้รายการ TLB สำหรับที่อยู่เสมือนที่ระบุไม่ถูกต้อง เมื่อเปิดใช้งาน PCID แล้ว INVLPG ควรจะทำให้รายการ TLB สำหรับที่อยู่ที่ระบุสำหรับทั้งคู่ใช้ไม่ได้ รายการ PCID *และ* Global ปัจจุบัน (หมายเหตุ: เฉพาะการแมปเคอร์เนลเท่านั้นที่ตั้งค่า Global=1)
น่าเสียดายที่การใช้งาน INVLPG บางอย่างอาจทำให้การแปลโดยรวมไม่ถูกล้างเมื่อเปิดใช้งาน PCID
วิธีแก้ปัญหาเบื้องต้น ห้ามเปิดใช้งาน PCID บนโปรเซสเซอร์ที่ได้รับผลกระทบ
ฉันคาดว่า ในที่สุดจะมีการลดระดับไมโครโค้ดเพื่อแทนที่วิธีแก้ปัญหาซอฟต์แวร์นี้ อย่างไรก็ตาม ปัจจุบันยังไม่ทราบหมายเลขเวอร์ชันที่แน่นอนที่จะเกิดขึ้น เมื่อตั้งค่าหมายเลขเวอร์ชันแล้ว รายชื่อโปรเซสเซอร์สามารถปรับแต่งให้ปิดใช้งาน PCID บนโปรเซสเซอร์ที่ได้รับผลกระทบเท่านั้น ไมโครโค้ดที่ได้รับผลกระทบ
หมายเหตุ: ถ้าใครต้องการการแก้ไขด่วนที่ไม่ต้องการแพตช์ ให้ติด’nopcid’บนบรรทัดคำสั่งเคอร์เนลของคุณ”
โปรเซสเซอร์ที่ได้รับผลกระทบจะสิ้นสุดลง ขึ้นเป็นโปรเซสเซอร์ Intel Alder Lake และ Raptor Lake ดังที่กล่าวไว้ในข้อความแพตช์ Intel กล่าวว่ากำลังทำงานเกี่ยวกับการบรรเทาไมโครโค้ดสำหรับปัญหานี้ L/Alder Lake N/Raptor Lake/Raptor Lake P/Raptor Lake S จนกว่าจะจัดการการลดไมโครโค้ดได้
INVLPG ใช้สำหรับทำให้รายการ TLB ที่ระบุไม่ถูกต้อง อย่างน้อย Alder Lake และ Raptor Lake ไม่จำเป็นต้องใช้ Kernel Page Table Isolation (KPTI) เพื่อลดปัญหา Meltdown เนื่องจากโปรเซสเซอร์รุ่นใหม่เหล่านี้ไม่ได้รับผลกระทบใด ๆ แต่สำหรับโปรเซสเซอร์ Intel รุ่นเก่า การสนับสนุน PCID ช่วยชดเชยค่าใช้จ่ายบางส่วนในการจัดการกับ Kernel Page Table Isolation/บรรเทา Meltdown ดังที่แสดงไว้หลายรายการ หลายปีก่อน เอกสารประกอบของเคอร์เนล PTI กล่าวถึงประโยชน์ของการรองรับ PCID อย่างกว้างขวางมากขึ้น:
“Process Context Identifiers (PCID) เป็นคุณลักษณะของ CPU ที่ช่วยให้เราสามารถข้ามการล้าง TLB ทั้งหมดเมื่อสลับตารางเพจโดยการตั้งค่าบิตพิเศษใน CR3 เมื่อตารางเพจมีการเปลี่ยนแปลง สิ่งนี้ทำให้การสลับตารางหน้า (ที่สวิตช์บริบท หรือการเข้า/ออกเคอร์เนล) ถูกลง แต่บนระบบที่รองรับ PCID โค้ดสวิตช์บริบทต้องล้างข้อมูลทั้งผู้ใช้และเคอร์เนลออกจาก TLB การฟลัช PCID TLB ของผู้ใช้จะถูกเลื่อนออกไปจนกว่าจะถึงทางออกจากพื้นที่ผู้ใช้ ซึ่งช่วยลดค่าใช้จ่าย ดู intel.com/sdm สำหรับรายละเอียด PCID/INVPCID ที่เต็มไปด้วยเลือด
…
บนระบบที่ไม่รองรับ PCID การเขียน CR3 แต่ละครั้งจะล้าง TLB ทั้งหมด ซึ่งหมายความว่า syscall การขัดจังหวะหรือข้อยกเว้นแต่ละครั้งจะล้าง TLB”
ไม่ว่าในกรณีใดก็ตาม ฉันจะใช้เกณฑ์มาตรฐานบางอย่างใน Raptor Lake เพื่อดูว่าการปิดใช้งานการสนับสนุน PCID นี้-อย่างน้อยก็ชั่วคราวหมายความว่า สำหรับด้านประสิทธิภาพตามปกติสำหรับผู้ใช้ปลายทาง