Mengapa beberapa model Intel keluarga 6 CPU (Core 2, Pentium M) tidak didukung oleh intel_idle?

25

Saya telah menyetel kernel Linux saya untuk prosesor Intel Core 2 Quad (Yorkfield), dan saya perhatikan pesan-pesan berikut dari dmesg:

[    0.019526] cpuidle: using governor menu
[    0.531691] clocksource: acpi_pm: mask: 0xffffff max_cycles: 0xffffff, max_idle_ns: 2085701024 ns
[    0.550918] intel_idle: does not run on family 6 model 23
[    0.554415] tsc: Marking TSC unstable due to TSC halts in idle

PowerTop hanya menunjukkan status C1, C2 dan C3 yang digunakan untuk paket dan masing-masing inti:

          Package   |            CPU 0
POLL        0.0%    | POLL        0.0%    0.1 ms
C1          0.0%    | C1          0.0%    0.0 ms
C2          8.2%    | C2          9.9%    0.4 ms
C3         84.9%    | C3         82.5%    0.9 ms

                    |            CPU 1
                    | POLL        0.1%    1.6 ms
                    | C1          0.0%    1.5 ms
                    | C2          9.6%    0.4 ms
                    | C3         82.7%    1.0 ms

                    |            CPU 2
                    | POLL        0.0%    0.1 ms
                    | C1          0.0%    0.0 ms
                    | C2          7.2%    0.3 ms
                    | C3         86.5%    1.0 ms

                    |            CPU 3
                    | POLL        0.0%    0.1 ms
                    | C1          0.0%    0.0 ms
                    | C2          5.9%    0.3 ms
                    | C3         87.7%    1.0 ms

Karena penasaran, saya bertanya sysfsdan menemukan bahwa acpi_idledriver lawas sedang digunakan (saya berharap melihat intel_idlepengemudi):

cat /sys/devices/system/cpu/cpuidle/current_driver

acpi_idle

Melihat kode sumber kernel, driver intel_idle saat ini berisi pesan debug khusus yang mencatat bahwa beberapa model keluarga Intel 6 tidak didukung oleh driver:

if (boot_cpu_data.x86_vendor == X86_VENDOR_INTEL && boot_cpu_data.x86 == 6)
    pr_debug("does not run on family %d model %d\n", boot_cpu_data.x86, boot_cpu_data.x86_model);

Garpu sebelumnya (22 November 2010) dari intel_idle.c menunjukkan dukungan yang diantisipasi untuk prosesor Core 2 (model 23 sebenarnya mencakup Core 2 Duo dan Quad):

#ifdef FUTURE_USE
    case 0x17:  /* 23 - Core 2 Duo */
        lapic_timer_reliable_states = (1 << 2) | (1 << 1); /* C2, C1 */
#endif

Kode di atas telah dihapus di Desember 2010 commit .

Sayangnya, hampir tidak ada dokumentasi dalam kode sumber, sehingga tidak ada penjelasan mengenai kurangnya dukungan untuk fungsi idle di CPU ini.

Konfigurasi kernel saya saat ini adalah sebagai berikut:

CONFIG_SMP=y
CONFIG_MCORE2=y
CONFIG_GENERIC_SMP_IDLE_THREAD=y
CONFIG_ACPI_PROCESSOR_IDLE=y
CONFIG_CPU_IDLE=y
# CONFIG_CPU_IDLE_GOV_LADDER is not set
CONFIG_CPU_IDLE_GOV_MENU=y
# CONFIG_ARCH_NEEDS_CPU_IDLE_COUPLED is not set
CONFIG_INTEL_IDLE=y

Pertanyaan saya adalah sebagai berikut:

  • Apakah ada alasan perangkat keras tertentu yang tidak didukung oleh prosesor Core 2 intel_idle?
  • Apakah ada cara yang lebih tepat untuk mengkonfigurasi kernel untuk dukungan idle CPU optimal untuk rangkaian prosesor ini (selain menonaktifkan dukungan untuk intel_idle)?
vallismortis
sumber

Jawaban:

28

Saat meneliti status daya CPU Core 2 (" C-state "), saya sebenarnya berhasil menerapkan dukungan untuk sebagian besar prosesor Intel Core / Core 2 yang lama. Implementasi lengkap (Linux patch) dengan semua informasi latar belakang didokumentasikan di sini.

Ketika saya mengumpulkan lebih banyak informasi tentang prosesor ini, mulai menjadi jelas bahwa negara-C yang didukung dalam model Core 2 (s) jauh lebih kompleks daripada yang ada di kedua prosesor sebelumnya dan kemudian. Ini dikenal sebagai Enhanced C-state (atau " CxE "), yang melibatkan paket, masing-masing core dan komponen lain pada chipset (misalnya, memori). Pada saat intel_idlepengemudi dilepaskan, kode tidak terlalu matang dan beberapa prosesor Core 2 telah dirilis yang memiliki dukungan C-state yang bertentangan.

Beberapa informasi menarik tentang dukungan C-state Core 2 Solo / Duo ditemukan dalam artikel ini dari tahun 2006 . Ini terkait dengan dukungan pada Windows, namun ini menunjukkan dukungan C-state perangkat keras yang kuat pada prosesor ini. Informasi mengenai konflik Kentsfield dengan nomor model aktual, jadi saya percaya mereka sebenarnya merujuk ke Yorkfield di bawah ini:

... prosesor quad-core Intel Core 2 Extreme (Kentsfield) mendukung semua lima teknologi kinerja dan hemat daya - Enhanced Intel SpeedStep (EIST), Thermal Monitor 1 (TM1) dan Thermal Monitor 2 (TM2), On-Demand Clock tua, Clock On-Demand Modulation (ODCM), serta Enhanced C States (CxE). Dibandingkan dengan prosesor Intel Pentium 4 dan Pentium D 600, 800, dan 900, yang hanya ditandai oleh Enhanced Halt (C1) State, fungsi ini telah diperluas dalam prosesor Intel Core 2 (serta prosesor Intel Core Solo / Duo) untuk semua kemungkinan status siaga dari sebuah prosesor, termasuk Stop Grant (C2), Deep Sleep (C3), dan Deeper Sleep (C4).

Artikel dari 2008 ini menguraikan dukungan untuk status C-core per-core pada prosesor Intel multi-core, termasuk Core 2 Duo dan Core 2 Quad (bacaan latar belakang bermanfaat tambahan ditemukan dalam buku putih ini dari Dell ):

C-state inti adalah C-state perangkat keras. Ada beberapa status siaga inti, misalnya CC1 dan CC3. Seperti yang kita ketahui, prosesor modern memiliki beberapa inti, seperti prosesor mobile Core Duo T5000 / T7000 yang baru-baru ini dirilis, yang dikenal sebagai Penryn di beberapa kalangan. Apa yang kami anggap sebagai CPU / prosesor, sebenarnya memiliki beberapa tujuan umum CPU di sampingnya. Intel Core Duo memiliki 2 core dalam chip prosesor. Intel Core-2 Quad memiliki 4 core per chip prosesor. Masing-masing core ini memiliki status siaga masing-masing. Ini masuk akal karena satu inti mungkin menganggur sementara yang lain bekerja keras pada utas. Jadi negara C-core adalah keadaan idle dari salah satu core tersebut.

Saya menemukan presentasi 2010 dari Intel yang memberikan beberapa latar belakang tambahan tentang intel_idledriver, tetapi sayangnya tidak menjelaskan kurangnya dukungan untuk Core 2:

Driver EKSPERIMENTAL ini menggantikan acpi_idle pada Prosesor Intel Atom, Prosesor Intel Core i3 / i5 / i7 dan prosesor Intel Xeon yang terkait. Itu tidak mendukung prosesor Intel Core2 atau yang lebih lama.

Presentasi di atas memang menunjukkan bahwa intel_idledriver adalah implementasi dari gubernur CPU "menu", yang berdampak pada konfigurasi kernel Linux (yaitu, CONFIG_CPU_IDLE_GOV_LADDERvs. CONFIG_CPU_IDLE_GOV_MENU). Perbedaan antara tangga dan gubernur menu dijelaskan secara ringkas dalam jawaban ini .

Dell memiliki artikel bermanfaat yang mencantumkan kompatibilitas C-state C0 hingga C6:

Mode C1 ke C3 bekerja dengan memotong sinyal clock yang digunakan di dalam CPU, sedangkan mode C4 ke C6 bekerja dengan mengurangi tegangan CPU. Mode "Enhanced" dapat melakukan keduanya sekaligus.

Mode   Name                   CPUs
C0     Operating State        All CPUs
C1     Halt                   486DX4 and above
C1E    Enhanced Halt          All socket LGA775 CPUs
C1E    —                      Turion 64, 65-nm Athlon X2 and Phenom CPUs
C2     Stop Grant             486DX4 and above
C2     Stop Clock             Only 486DX4, Pentium, Pentium MMX, K5, K6, K6-2, K6-III
C2E    Extended Stop Grant    Core 2 Duo and above (Intel only)
C3     Sleep                  Pentium II, Athlon and above, but not on Core 2 Duo E4000 and E6000
C3     Deep Sleep             Pentium II and above, but not on Core 2 Duo E4000 and E6000; Turion 64
C3     AltVID                 AMD Turion 64
C4     Deeper Sleep           Pentium M and above, but not on Core 2 Duo E4000 and E6000 series; AMD Turion 64
C4E/C5 Enhanced Deeper Sleep  Core Solo, Core Duo and 45-nm mobile Core 2 Duo only
C6     Deep Power Down        45-nm mobile Core 2 Duo only

Dari tabel ini (yang kemudian saya temukan salah dalam beberapa kasus), tampak bahwa ada berbagai perbedaan dalam dukungan C-state dengan prosesor Core 2 (Perhatikan bahwa hampir semua prosesor Core 2 adalah Socket LGA775, kecuali untuk Core 2 Solo SU3500, yang merupakan prosesor Socket BGA956 dan Merom / Penryn. "Intel Core" Solo / Duo adalah salah satu dari Socket PBGA479 atau PPGA478).

Pengecualian tambahan untuk tabel ditemukan dalam artikel ini :

Intel Core 2 Duo E8500 mendukung C-state C2 dan C4, sementara Core 2 Extreme QX9650 tidak.

Menariknya, QX9650 adalah prosesor Yorkfield (keluarga Intel 6, model 23, melangkah 6). Sebagai referensi, Q9550S ​​saya adalah Intel family 6, model 23 (0x17), melangkah 10, yang seharusnya mendukung C-state C4 (dikonfirmasi melalui eksperimen). Selain itu, Core 2 Solo U3500 memiliki CPUID (keluarga, model, loncatan) yang identik dengan Q9550S ​​tetapi tersedia dalam soket non-LGA775, yang mengacaukan interpretasi dari tabel di atas.

Jelas, CPUID harus digunakan setidaknya sampai ke loncatan untuk mengidentifikasi dukungan C-state untuk model prosesor ini, dan dalam beberapa kasus yang mungkin tidak mencukupi (belum ditentukan saat ini).

Tanda tangan metode untuk menetapkan informasi siaga CPU adalah:

#define ICPU(model, cpu) \
{ X86_VENDOR_INTEL, 6, model, X86_FEATURE_ANY, (unsigned long)&cpu }

Di mana modeldisebutkan dalam asm / intel-family.h . Meneliti file header ini, saya melihat bahwa Intel CPU ditugaskan pengidentifikasi 8-bit yang tampaknya cocok dengan nomor model keluarga 6 Intel:

#define INTEL_FAM6_CORE2_PENRYN 0x17

Dari penjelasan di atas, kami memiliki Intel Family 6, Model 23 (0x17) yang didefinisikan sebagai INTEL_FAM6_CORE2_PENRYN. Ini harus memadai untuk mendefinisikan status siaga untuk sebagian besar prosesor Model 23, tetapi berpotensi menyebabkan masalah dengan QX9650 seperti yang disebutkan di atas.

Jadi, minimal, setiap kelompok prosesor yang memiliki set keadaan-C yang berbeda perlu ditentukan dalam daftar ini.

Zagacki dan Ponnala, Intel Technology Journal 12 (3): 219-227, 2008 menunjukkan bahwa prosesor Yorkfield memang mendukung C2 dan C4. Mereka juga tampaknya menunjukkan bahwa spesifikasi ACPI 3.0a mendukung transisi hanya antara C-state C0, C1, C2 dan C3, yang saya duga juga dapat membatasi acpi_idledriver Linux untuk transisi antara set C-state yang terbatas. Namun, artikel ini menunjukkan bahwa tidak selalu demikian:

Ingatlah bahwa ini adalah kondisi ACPI C, bukan prosesor, jadi ACPI C3 mungkin HW C6, dll.

Juga dari catatan:

Di luar prosesor itu sendiri, karena C4 merupakan upaya yang disinkronkan antara komponen silikon utama dalam platform, Intel Q45 Express Chipset mencapai peningkatan daya 28 persen.

Chipset yang saya gunakan adalah Chipset Intel Q45 Express.

The dokumentasi Intel di negara MWAIT adalah singkat tapi menegaskan perilaku ACPI BIOS-spesifik:

Status-C khusus-prosesor yang didefinisikan dalam ekstensi MWAIT dapat dipetakan ke tipe-C yang didefinisikan ACPI (C0, C1, C2, C3). Hubungan pemetaan tergantung pada definisi keadaan-C oleh implementasi prosesor dan diekspos ke OSPM oleh BIOS menggunakan tabel _CST ACPI yang ditentukan.

Interpretasi saya atas tabel di atas (dikombinasikan dengan tabel dari Wikipedia , asm / intel-family.h dan artikel di atas) adalah:

Model 9 0x09 ( Pentium M dan Celeron M ):

  • Banias: C0, C1, C2, C3, C4

Model 13 0x0D ( Pentium M dan Celeron M ):

  • Dothan, Stealey: C0, C1, C2, C3, C4

Model 14 0x0E INTEL_FAM6_CORE_YONAH ( Enhanced Pentium M , Enhanced Celeron M atau Intel Core ):

  • Yonah ( Core Solo , Core Duo ): C0, C1, C2, C3, C4, C4E / C5

Model 15 0x0F INTEL_FAM6_CORE2_MEROM (beberapa Core 2 dan Pentium Dual-Core ):

  • Kentsfield, Merom, Conroe, Allendale ( E2xxx / E4xxx dan Core 2 Duo E6xxx, T7xxxx / T8xxxx , Core 2 Extreme QX6xxx , Core 2 Quad Q6xxx ): C0, C1, C1E, C2E, C2E

Model 23 0x17 INTEL_FAM6_CORE2_PENRYN ( Core 2 ):

  • Merom-L / Penryn-L:?
  • Penryn ( Core 2 Duo 45-nm ponsel ): C0, C1, C1E, C2, C2E, C3, C4, C4E / C5, C6
  • Yorkfield ( Core 2 Extreme QX9650 ): C0, C1, C1E, C2E?, C3
  • Wolfdale / Yorkfield ( Core 2 Quad , C2Q Xeon , Core 2 Duo E5xxx / E7xxx / E8xxx , Pentium Dual-Core E6xxx , Celeron Dual-Core ): C0, C1, C1E, C2, C2E, C3, C4, C4

Dari jumlah keragaman dalam dukungan C-state hanya dalam prosesor Core 2, tampak bahwa kurangnya dukungan yang konsisten untuk C-state mungkin menjadi alasan untuk tidak berusaha untuk sepenuhnya mendukung mereka melalui intel_idledriver. Saya ingin sepenuhnya melengkapi daftar di atas untuk seluruh baris Core 2.

Ini bukan jawaban yang benar-benar memuaskan, karena itu membuat saya bertanya-tanya berapa banyak daya yang tidak perlu digunakan dan kelebihan panas telah (dan masih) dihasilkan oleh tidak sepenuhnya menggunakan negara-C MWAIT hemat daya yang kuat pada prosesor ini.

Chattopadhyay et al. 2018, Prosesor Kinerja Tinggi Hemat Energi: Pendekatan Terbaru untuk Merancang Komputasi Kinerja Tinggi Hijau patut dicatat untuk perilaku spesifik yang saya cari di Chipset Q45 Express:

Paket C-state (PC0-PC10) - Saat domain komputasi, Core dan Graphics (GPU) idle, prosesor memiliki peluang untuk penghematan daya tambahan pada tingkat uncore dan platform, misalnya, menyiram LLC dan melakukan power-gating pada pengontrol memori dan DRAM IO, dan pada beberapa kondisi, seluruh prosesor dapat dimatikan saat statusnya dipertahankan pada domain daya yang selalu aktif.

Sebagai tes, saya memasukkan yang berikut ini di linux / drivers / idle / intel_idle.c baris 127:

static struct cpuidle_state conroe_cstates[] = {
    {
        .name = "C1",
        .desc = "MWAIT 0x00",
        .flags = MWAIT2flg(0x00),
        .exit_latency = 3,
        .target_residency = 6,
        .enter = &intel_idle,
        .enter_s2idle = intel_idle_s2idle, },
    {
        .name = "C1E",
        .desc = "MWAIT 0x01",
        .flags = MWAIT2flg(0x01),
        .exit_latency = 10,
        .target_residency = 20,
        .enter = &intel_idle,
        .enter_s2idle = intel_idle_s2idle, },
//  {
//      .name = "C2",
//      .desc = "MWAIT 0x10",
//      .flags = MWAIT2flg(0x10),
//      .exit_latency = 20,
//      .target_residency = 40,
//      .enter = &intel_idle,
//      .enter_s2idle = intel_idle_s2idle, },
    {
        .name = "C2E",
        .desc = "MWAIT 0x11",
        .flags = MWAIT2flg(0x11),
        .exit_latency = 40,
        .target_residency = 100,
        .enter = &intel_idle,
        .enter_s2idle = intel_idle_s2idle, },
    {
        .enter = NULL }
};

static struct cpuidle_state core2_cstates[] = {
    {
        .name = "C1",
        .desc = "MWAIT 0x00",
        .flags = MWAIT2flg(0x00),
        .exit_latency = 3,
        .target_residency = 6,
        .enter = &intel_idle,
        .enter_s2idle = intel_idle_s2idle, },
    {
        .name = "C1E",
        .desc = "MWAIT 0x01",
        .flags = MWAIT2flg(0x01),
        .exit_latency = 10,
        .target_residency = 20,
        .enter = &intel_idle,
        .enter_s2idle = intel_idle_s2idle, },
    {
        .name = "C2",
        .desc = "MWAIT 0x10",
        .flags = MWAIT2flg(0x10),
        .exit_latency = 20,
        .target_residency = 40,
        .enter = &intel_idle,
        .enter_s2idle = intel_idle_s2idle, },
    {
        .name = "C2E",
        .desc = "MWAIT 0x11",
        .flags = MWAIT2flg(0x11),
        .exit_latency = 40,
        .target_residency = 100,
        .enter = &intel_idle,
        .enter_s2idle = intel_idle_s2idle, },
    {
        .name = "C3",
        .desc = "MWAIT 0x20",
        .flags = MWAIT2flg(0x20) | CPUIDLE_FLAG_TLB_FLUSHED,
        .exit_latency = 85,
        .target_residency = 200,
        .enter = &intel_idle,
        .enter_s2idle = intel_idle_s2idle, },
    {
        .name = "C4",
        .desc = "MWAIT 0x30",
        .flags = MWAIT2flg(0x30) | CPUIDLE_FLAG_TLB_FLUSHED,
        .exit_latency = 100,
        .target_residency = 400,
        .enter = &intel_idle,
        .enter_s2idle = intel_idle_s2idle, },
    {
        .name = "C4E",
        .desc = "MWAIT 0x31",
        .flags = MWAIT2flg(0x31) | CPUIDLE_FLAG_TLB_FLUSHED,
        .exit_latency = 100,
        .target_residency = 400,
        .enter = &intel_idle,
        .enter_s2idle = intel_idle_s2idle, },
    {
        .name = "C6",
        .desc = "MWAIT 0x40",
        .flags = MWAIT2flg(0x40) | CPUIDLE_FLAG_TLB_FLUSHED,
        .exit_latency = 200,
        .target_residency = 800,
        .enter = &intel_idle,
        .enter_s2idle = intel_idle_s2idle, },
    {
        .enter = NULL }
};

pada intel_idle.cbaris 983:

static const struct idle_cpu idle_cpu_conroe = {
    .state_table = conroe_cstates,
    .disable_promotion_to_c1e = false,
};

static const struct idle_cpu idle_cpu_core2 = {
    .state_table = core2_cstates,
    .disable_promotion_to_c1e = false,
};

pada intel_idle.cbaris 1073:

ICPU(INTEL_FAM6_CORE2_MEROM,  idle_cpu_conroe),
ICPU(INTEL_FAM6_CORE2_PENRYN, idle_cpu_core2),

Setelah kompilasi cepat dan reboot node PXE saya, dmesgsekarang menunjukkan:

[    0.019845] cpuidle: using governor menu
[    0.515785] clocksource: acpi_pm: mask: 0xffffff max_cycles: 0xffffff, max_idle_ns: 2085701024 ns
[    0.543404] intel_idle: MWAIT substates: 0x22220
[    0.543405] intel_idle: v0.4.1 model 0x17
[    0.543413] tsc: Marking TSC unstable due to TSC halts in idle states deeper than C2
[    0.543680] intel_idle: lapic_timer_reliable_states 0x2

Dan sekarang PowerTOP ditampilkan:

          Package   |            CPU 0
POLL        2.5%    | POLL        0.0%    0.0 ms
C1E         2.9%    | C1E         5.0%   22.4 ms
C2          0.4%    | C2          0.2%    0.2 ms
C3          2.1%    | C3          1.9%    0.5 ms
C4E        89.9%    | C4E        92.6%   66.5 ms

                    |            CPU 1
                    | POLL       10.0%  400.8 ms
                    | C1E         5.1%    6.4 ms
                    | C2          0.3%    0.1 ms
                    | C3          1.4%    0.6 ms
                    | C4E        76.8%   73.6 ms

                    |            CPU 2
                    | POLL        0.0%    0.2 ms
                    | C1E         1.1%    3.7 ms
                    | C2          0.2%    0.2 ms
                    | C3          3.9%    1.3 ms
                    | C4E        93.1%   26.4 ms

                    |            CPU 3
                    | POLL        0.0%    0.7 ms
                    | C1E         0.3%    0.3 ms
                    | C2          1.1%    0.4 ms
                    | C3          1.1%    0.5 ms
                    | C4E        97.0%   45.2 ms

Saya akhirnya mengakses Enhanced Core 2 C-state, dan sepertinya ada penurunan konsumsi daya yang terukur - meter saya pada 8 node tampaknya rata-rata setidaknya 5% lebih rendah (dengan satu node masih menjalankan kernel lama) , tapi saya akan mencoba menukar kernel lagi sebagai ujian.

Catatan menarik tentang dukungan C4E - Prosesor Yorktown Q9550S ​​saya tampaknya mendukungnya (atau beberapa negara bagian C4 lainnya), sebagaimana dibuktikan di atas! Ini membingungkan saya, karena lembar data Intel pada prosesor Core 2 Q9000 (bagian 6.2) hanya menyebutkan status-C Normal (C0), HALT (C1 = 0x00), Extended HALT (C1E = 0x01), Stop Grant (C2 = 0x10) , Extended Stop Grant (C2E = 0x11), Tidur / Tidur Nyenyak (C3 = 0x20) dan Tidur Lebih Dalam (C4 = 0x30). Apakah kondisi 0x31 tambahan ini? Jika saya mengaktifkan status C2, maka C4E digunakan sebagai pengganti C4. Jika saya menonaktifkan state C2 (force state C2E) maka C4 digunakan sebagai pengganti C4E. Saya menduga ini mungkin ada hubungannya dengan bendera MWAIT, tetapi saya belum menemukan dokumentasi untuk perilaku ini.

Saya tidak yakin apa yang membuat ini: Keadaan C1E tampaknya digunakan sebagai pengganti C1, C2 digunakan sebagai pengganti C2E dan C4E digunakan sebagai pengganti C4. Saya tidak yakin apakah C1 / C1E, C2 / C2E dan C4 / C4E dapat digunakan bersama dengan intel_idleatau jika mereka berlebihan. Saya menemukan catatan dalam presentasi 2010 ini oleh Intel Labs Pittsburgh yang menunjukkan transisi adalah C0 - C1 - C0 - C1E - C0, dan menyatakan lebih lanjut:

C1E hanya digunakan ketika semua core berada di C1E

Saya percaya itu harus ditafsirkan sebagai keadaan C1E dimasukkan pada komponen lain (misalnya memori) hanya ketika semua core berada dalam keadaan C1E. Saya juga mengambil ini untuk diterapkan secara setara untuk negara C2 / C2E dan C4 / C4E (Meskipun C4E disebut sebagai "C4E / C5" jadi saya tidak yakin apakah C4E adalah sub-state dari C4 atau jika C5 adalah sub-negara. keadaan C4E. Pengujian tampaknya mengindikasikan C4 / C4E benar). Saya dapat memaksa C2E untuk digunakan dengan mengomentari keadaan C2 - namun, ini menyebabkan negara C4 digunakan alih-alih C4E (lebih banyak pekerjaan mungkin diperlukan di sini). Mudah-mudahan tidak ada model 15 atau prosesor model 23 yang tidak memiliki status C2E, karena prosesor tersebut akan terbatas pada C1 / C1E dengan kode di atas.

Juga, nilai-nilai bendera, latensi, dan residensi mungkin bisa diperbaiki, tetapi hanya mengambil tebakan yang dididik berdasarkan nilai-nilai diam Nehalem tampaknya bekerja dengan baik. Dibutuhkan lebih banyak bacaan untuk melakukan perbaikan.

Saya menguji ini pada Core 2 Duo E2220 ( Allendale ), Dual Core Pentium E5300 ( Wolfdale ), Core 2 Duo E7400 , Core 2 Duo E8400 ( Wolfdale ), Core 2 Quad Q9550S ( Yorkfield ) dan Core 2 Extreme QX9650 , dan saya tidak menemukan masalah di luar preferensi yang disebutkan sebelumnya untuk negara C2 / C2E dan C4 / C4E.

Tidak dicakup oleh modifikasi driver ini:

  • Asli Core Solo / Core Duo ( Yonah , non Core 2) adalah keluarga 6, Model 14. Ini bagus karena mereka mendukung C4E / C5 (Enhanced Jauh Sleep) C-negara namun tidak C1E / negara C2E dan akan membutuhkan mereka definisi idle sendiri.

Satu-satunya masalah yang dapat saya pikirkan adalah:

  • Core 2 Solo SU3300 / SU3500 (Penryn-L) adalah keluarga 6, model 23 dan akan terdeteksi oleh driver ini. Namun, mereka bukan Socket LGA775 sehingga mereka tidak dapat mendukung C1E Enhanced Halt C-state. Demikian juga untuk Core 2 Solo ULV U2100 / U2200 ( Merom-L ). Namun, intel_idlepengandar tampaknya memilih C1 / C1E yang tepat berdasarkan pada dukungan perangkat keras dari sub-negara bagian.
  • Core 2 Extreme QX9650 (Yorkfield) dilaporkan tidak mendukung C-state C2 atau C4. Saya telah mengkonfirmasi ini dengan membeli prosesor Optiplex 780 dan QX9650 Extreme bekas di eBay. Prosesor ini mendukung C-state C1 dan C1E. Dengan modifikasi driver ini, CPU idle dalam keadaan C1E bukannya C1, jadi mungkin ada beberapa penghematan daya. Saya berharap melihat C-state C3, tetapi tidak ada saat menggunakan driver ini jadi saya mungkin perlu melihat lebih jauh.

Saya berhasil menemukan slide dari presentasi Intel 2009 tentang transisi antara C-state (yaitu, Deep Power Down):

Masuk / Keluar Teknologi Deep Power Down

Kesimpulannya, ternyata tidak ada alasan nyata untuk kurangnya dukungan Core 2 pada intel_idlepengemudi. Jelas sekarang bahwa kode rintisan asli untuk "Core 2 Duo" hanya menangani C-state C1 dan C2, yang akan jauh lebih efisien daripada acpi_idlefungsi yang juga menangani C-state C3. Begitu saya tahu ke mana harus mencari, mengimplementasikan dukungan itu mudah. Komentar yang membantu dan jawaban lainnya sangat dihargai, dan jika Amazon mendengarkan, Anda tahu ke mana harus mengirimkan cek.

Pembaruan ini telah berkomitmen untuk github . Saya akan segera mengirimkan tambalan ke LKML.

Pembaruan : Saya juga berhasil menggali Socket T / LGA775 Allendale ( Conroe ) Core 2 Duo E2220, yang merupakan keluarga 6, model 15, jadi saya menambahkan dukungan untuk itu juga. Model ini tidak memiliki dukungan untuk C-state C4, tetapi mendukung C1 / C1E dan C2 / C2E. Ini juga harus bekerja untuk chip berbasis Conroe lainnya ( E4xxx / E6xxx ) dan mungkin semua prosesor Kentsfield dan Merom (non Merom-L).

Pembaruan : Saya akhirnya menemukan beberapa sumber daya penyetelan MWAIT. Ini Tenaga Kinerja vs Langgan dan ini Deeper negara C dan peningkatan latency posting blog keduanya mengandung beberapa informasi yang berguna pada identifikasi latency CPU idle. Sayangnya, ini hanya melaporkan latensi keluar yang dikodekan ke dalam kernel (tetapi, yang menarik, hanya status perangkat keras yang didukung oleh prosesor):

# cd /sys/devices/system/cpu/cpu0/cpuidle
# for state in `ls -d state*` ; do echo c-$state `cat $state/name` `cat $state/latency` ; done

c-state0/ POLL 0
c-state1/ C1 3
c-state2/ C1E 10
c-state3/ C2 20
c-state4/ C2E 40
c-state5/ C3 20
c-state6/ C4 60
c-state7/ C4E 100
vallismortis
sumber
4
Itu pekerjaan detektif yang bagus! Saya lupa betapa rumitnya C-state C2D / C2Q. Kembali penghematan daya yang belum dimanfaatkan, jika firmware Anda cukup baik maka Anda masih harus mendapatkan manfaat dari setidaknya beberapa negara-C melalui acpi_idle dan berbagai gubernur kinerja. Status apa yang powertopditampilkan di sistem Anda?
Stephen Kitt
1
Informasi yang sangat bagus, sudahkah Anda mempertimbangkan untuk mengajukan tambalan Anda ke kernel Linux hulu?
Lekensteyn
1
"Negara C1E tampaknya digunakan sebagai pengganti C1 ..." Negara mana yang digunakan - seperti yang ditunjukkan oleh powertop - ditentukan sepenuhnya oleh kernel, oleh karena itu saya percaya itu tidak akan "ada hubungannya dengan bendera MWAIT", itu akan dipilih semata-mata berdasarkan urutan negara bagian dan exit_latency dan target_residency. Yang mengatakan, saya akan sedikit khawatir tentang meninggalkan status dalam tabel jika mereka tampaknya tidak digunakan ketika diuji ... jika negara-negara itu tidak benar-benar berfungsi seperti yang diharapkan, dan ada beberapa pola beban kerja lain yang menyebabkan mereka sedang digunakan & perilaku tak terduga terjadi.
sourcejedi
1
"Transisinya adalah C0 - C1 - C0 - C1E - C0" - Saya tidak berpikir itu deskripsi yang baik dari slide itu. Dari powertopsudut pandang kernel / , semua transisi baik dari C0 atau ke C0. Jika Anda tidak berada di C0, Anda tidak menjalankan instruksi apa pun, karena itu kernel tidak dapat mengamati atau meminta transisi antar negara pada cpu itu :-). Dan seperti yang Anda katakan, gubernur kernel "menu" mungkin mis langsung melompat ke C1E, tanpa menghabiskan waktu di C1 pertama.
sourcejedi
1
"hanya mengambil tebakan yang dididik berdasarkan nilai-nilai menganggur Nehalem tampaknya berfungsi dengan baik" - perhatikan ini bukan cara yang baik untuk mendapatkan tambalan Anda diterima di hulu :-P, dalam hal latensi keluar tidak boleh dianggap remeh, kalau tidak saya pikir Anda akan melanggar PM_QOS_CPU_DMA_LATENCY, yang dapat diatur oleh driver (atau userspace?)
sourcejedi
6

Saya curiga ini bisa jadi hanya peluang dan biaya. Ketika intel_idleditambahkan, tampaknya dukungan Core 2 Duo telah direncanakan, tetapi tidak pernah sepenuhnya diimplementasikan - mungkin pada saat para insinyur Intel mengatasinya, itu tidak layak lagi. Persamaannya relatif kompleks: intel_idleperlu memberikan manfaat yang cukup acpi_idleagar layak didukung di sini, pada CPU yang akan melihat kernel "ditingkatkan" dalam jumlah yang cukup ...

Sebagai sourcejedi ‘s jawaban mengatakan, pengemudi tidak mengecualikan semua keluarga 6. intel_idleinisialisasi memeriksa CPU di daftar model CPU , yang mencakup pada dasarnya semua mikro-arsitektur Nehalem dari ke Kaby Lake. Yorkfield lebih tua dari itu (dan sangat berbeda - Nehalem sangat berbeda dari arsitektur yang datang sebelumnya). Tes keluarga 6 hanya memengaruhi apakah pesan kesalahan dicetak; efeknya hanya bahwa pesan kesalahan hanya akan ditampilkan pada Intel CPU, bukan AMD AMD (keluarga Intel 6 mencakup semua CPU Intel non-NetBurst sejak Pentium Pro).

Untuk menjawab pertanyaan konfigurasi Anda, Anda dapat sepenuhnya menonaktifkan intel_idle, tetapi membiarkannya juga baik-baik saja (selama Anda tidak keberatan dengan peringatan itu).

Stephen Kitt
sumber
pesan pr_debug () hanya akan muncul jika Anda melakukan sesuatu yang sangat spesifik untuk mengaktifkan pesan debug itu, sehingga Anda bahkan tidak perlu mengabaikan peringatan
sourcejedi
2
@sourcejedi saya sebutkan itu karena OP melihatnya.
Stephen Kitt
mengerti Saya menyajikan komentar setengah serius: karena kita ditanya tentang konfigurasi kernel yang masuk akal, jika digunakan sehari-hari, mungkin tidak menggunakan opsi yang memungkinkan semua pesan debug? Dengan opsi yang tepat, mereka dapat diaktifkan secara dinamis dan selektif bila perlu. kernel.org/doc/html/v4.17/admin-guide/dynamic-debug-howto.html Jika Anda mengaktifkan semua pesan debug, Anda mungkin masih memiliki banyak pesan yang Anda abaikan :).
sourcejedi
@sourcejedi Saya gagal melihat relevansi komentar Anda mengenai penonaktifan pesan kernel. Saya tidak melihat ini sebagai konstruktif untuk pertanyaan, yang secara khusus membahas dukungan Core 2 untuk intel_idlepengemudi.
vallismortis
@vallismortis sangat tangensial. Ini berarti bahwa ada konfigurasi yang valid yang dapat Anda gunakan untuk Core 2 dan di atasnya , yang tidak mencetak ini sebagai pesan peringatan yang menjengkelkan yang harus diabaikan, dan akan menggunakan intel_idle jika didukung ... tapi kemudian saya kira Anda akan menggunakan yang dimuat secara dinamis modul, jadi mungkin tidak layak disebutkan.
sourcejedi
6

Apakah ada cara yang lebih tepat untuk mengkonfigurasi kernel untuk dukungan idle CPU optimal untuk rangkaian prosesor ini (selain menonaktifkan dukungan untuk intel_idle)

Anda telah mengaktifkan ACPI, dan Anda telah memeriksa bahwa acpi_idle sedang digunakan. Saya sungguh ragu Anda telah melewatkan opsi konfigurasi kernel yang bermanfaat. Anda selalu dapat memeriksa powertopkemungkinan saran, tetapi mungkin Anda sudah tahu itu.


Ini bukan jawaban, tapi saya ingin memformatnya :-(.

Melihat kode sumber kernel, driver intel_idle saat ini berisi tes untuk secara khusus mengecualikan keluarga Intel 6 dari driver.

Tidak, itu tidak :-).

id = x86_match_cpu(intel_idle_ids);
if (!id) {
    if (boot_cpu_data.x86_vendor == X86_VENDOR_INTEL &&
        boot_cpu_data.x86 == 6)
        pr_debug(PREFIX "does not run on family %d model %d\n",
            boot_cpu_data.x86, boot_cpu_data.x86_model);
    return -ENODEV;
}

The ifpernyataan tidak mengecualikan Family 6. Sebaliknya, ifpernyataan menyediakan pesan ketika debugging diaktifkan, yang spesifik modern ini Intel CPU tidak didukung oleh intel_idle. Bahkan, CPU i5-5300U saya saat ini adalah Family 6 dan menggunakan intel_idle.

Apa yang mengecualikan CPU Anda adalah tidak ada kecocokan dalam intel_idle_idstabel.

Saya perhatikan komit ini yang mengimplementasikan tabel. Kode yang dihapus memiliki switchpernyataan. Ini membuatnya mudah untuk melihat bahwa model paling awal intel_idle telah diterapkan / berhasil diuji / apa pun yang 0x1A = 26. https://github.com/torvalds/linux/commit/b66b8b9a4a79087dde1b358a016e5c8739ccf186

sourcejedi
sumber