Membangun kernel CentOS 6 dengan dukungan KVM gagal karena MMU

0

Ketika membangun kernel Linux terbaru untuk CentOS itu muncul kesalahan berikut

CC [M] arch / x86 / kernel / iosf_mbi.o CC arch / x86 / kvm /../../../ virt / kvm / kvm_main.o CC arch / x86 / kvm /../../. ./virt/kvm/coalesced_mmio.o CC arch / x86 / kvm /../../../ virt / kvm / eventfd.o CC arch / x86 / kvm /../../../ virt / kvm / irqchip.o CC arch / x86 / kvm /../../../ virt / kvm / vfio.o CC arch / x86 / kvm /../../../ virt / kvm / async_pf. o CC arch / x86 / kvm / x86.o arch / x86 / kvm / x86.c: Dalam fungsi 'kvm_write_tsc': arch / x86 / kvm / x86.c: 1290: peringatan: 'sudah_matched' dapat digunakan tanpa diinisialisasi> dalam fungsi ini CC arch / x86 / kvm / mmu.o arch / x86 / kvm / mmu.c: Dalam fungsi 'kvm_mmu_pte_write': arch / x86 / kvm / mmu.c: 4219: kesalahan: bidang tidak diketahui 'cr0_wp' ditentukan dalam> initializer arch / x86 / kvm / mmu.c: 4220: error: bidang tidak dikenal 'cr4_pae' ditentukan dalam arch initializer / x86 / kvm / mmu.c: 4220: peringatan:elemen berlebih di lengkung initializer gabungan / x86 / kvm / mmu.c: 4220: peringatan: (hampir inisialisasi untuk '(anonim)') lengkungan / x86 / kvm / mmu.c: 4221: kesalahan: bidang tidak dikenal 'nxe' ditentukan dalam initializer arch / x86 / kvm / mmu.c: 4221: peringatan: kelebihan elemen di arch initializer arch / x86 / kvm / mmu.c: 4221: peringatan: (dekat inisialisasi untuk '(anonim)') arch / x86 / kvm / mmu.c: 4222: error: bidang tidak diketahui 'smep_andnot_wp' ditentukan dalam lengkung penginisialisasi / x86 / kvm / mmu.c: 4222: peringatan: elemen berlebih di lengkungan penginisialisasi persatuan / x86 / kvm / mmu.c: 4222: warning: ( inisialisasi dekat untuk '(anonim)') lengkungan / x86 / kvm / mmu.c: 4223: kesalahan: bidang tidak dikenal 'smap_andnot_wp' ditentukan dalam lengkungan penginisialisasi / x86 / kvm / mmu.c: 4223: peringatan: elemen-elemen berlebih di inisialisasi penyatuan union arch / x86 / kvm / mmu.c: 4223: peringatan: (dekat inisialisasi untuk '(anonim)') make [2]:4220: peringatan: (dekat inisialisasi untuk '(anonim)') lengkungan / x86 / kvm / mmu.c: 4221: kesalahan: bidang tidak dikenal 'nxe' ditentukan dalam lengkungan penginisialisasi / x86 / kvm / mmu.c: 4221: peringatan: elemen berlebih di lengkung initializer gabungan / x86 / kvm / mmu.c: 4221: peringatan: (hampir inisialisasi untuk '(anonim)') lengkungan / x86 / kvm / mmu.c: 4222: kesalahan: bidang tidak diketahui 'smep_andnot_wp' ditentukan dalam initializer arch / x86 / kvm / mmu.c: 4222: peringatan: kelebihan elemen di arch initializer arch / x86 / kvm / mmu.c: 4222: peringatan: (dekat inisialisasi untuk '(anonim)') arch / x86 / kvm / mmu.c: 4223: error: bidang tidak diketahui 'smap_andnot_wp' ditentukan dalam lengkung penginisialisasi / x86 / kvm / mmu.c: 4223: peringatan: elemen berlebih di lengkungan penginisialisasi persatuan / x86 / kvm / mmu.c: 4223: warning: ( inisialisasi dekat untuk '(anonim)') make [2]:4220: peringatan: (dekat inisialisasi untuk '(anonim)') lengkungan / x86 / kvm / mmu.c: 4221: kesalahan: bidang tidak dikenal 'nxe' ditentukan dalam lengkungan penginisialisasi / x86 / kvm / mmu.c: 4221: peringatan: elemen berlebih di lengkung initializer gabungan / x86 / kvm / mmu.c: 4221: peringatan: (hampir inisialisasi untuk '(anonim)') lengkungan / x86 / kvm / mmu.c: 4222: kesalahan: bidang tidak diketahui 'smep_andnot_wp' ditentukan dalam initializer arch / x86 / kvm / mmu.c: 4222: peringatan: kelebihan elemen di arch initializer arch / x86 / kvm / mmu.c: 4222: peringatan: (dekat inisialisasi untuk '(anonim)') arch / x86 / kvm / mmu.c: 4223: error: bidang tidak diketahui 'smap_andnot_wp' ditentukan dalam lengkung penginisialisasi / x86 / kvm / mmu.c: 4223: peringatan: elemen berlebih di lengkungan penginisialisasi persatuan / x86 / kvm / mmu.c: 4223: warning: ( inisialisasi dekat untuk '(anonim)') make [2]:bidang tidak dikenal 'nxe' yang ditentukan dalam lengkungan penginisialisasi / x86 / kvm / mmu.c: 4221: peringatan: elemen berlebih di lengkung penginisialisasi gabungan / x86 / kvm / mmu.c: 4221: peringatan: (dekat inisialisasi untuk '(anonim)' ) arch / x86 / kvm / mmu.c: 4222: error: bidang tidak diketahui 'smep_andnot_wp' ditentukan dalam arch initializer / x86 / kvm / mmu.c: 4222: peringatan: elemen yang berlebih di union initializer arch / x86 / kvm / mmu. c: 4222: peringatan: (dekat inisialisasi untuk '(anonim)') lengkungan / x86 / kvm / mmu.c: 4223: kesalahan: bidang tidak dikenal 'smap_andnot_wp' ditentukan dalam lengkungan initializer / x86 / kvm / mmu.c: 4223: peringatan: elemen berlebih di lengkung initializer union / x86 / kvm / mmu.c: 4223: peringatan: (dekat inisialisasi untuk '(anonim)') make [2]:bidang tidak dikenal 'nxe' yang ditentukan dalam lengkungan penginisialisasi / x86 / kvm / mmu.c: 4221: peringatan: elemen berlebih di lengkung penginisialisasi gabungan / x86 / kvm / mmu.c: 4221: peringatan: (dekat inisialisasi untuk '(anonim)' ) arch / x86 / kvm / mmu.c: 4222: error: bidang tidak diketahui 'smep_andnot_wp' ditentukan dalam arch initializer / x86 / kvm / mmu.c: 4222: peringatan: elemen yang berlebih di union initializer arch / x86 / kvm / mmu. c: 4222: peringatan: (dekat inisialisasi untuk '(anonim)') lengkungan / x86 / kvm / mmu.c: 4223: kesalahan: bidang tidak dikenal 'smap_andnot_wp' ditentukan dalam lengkungan initializer / x86 / kvm / mmu.c: 4223: peringatan: elemen berlebih di lengkung initializer union / x86 / kvm / mmu.c: 4223: peringatan: (dekat inisialisasi untuk '(anonim)') make [2]:(dekat inisialisasi untuk '(anonim)') lengkungan / x86 / kvm / mmu.c: 4222: kesalahan: bidang tidak dikenal 'smep_andnot_wp' ditentukan dalam lengkungan penginisialisasi / x86 / kvm / mmu.c: 4222: peringatan: elemen berlebih dalam serikat initializer arch / x86 / kvm / mmu.c: 4222: peringatan: (dekat inisialisasi untuk '(anonim)') arch / x86 / kvm / mmu.c: 4223: kesalahan: bidang tidak diketahui 'smap_andnot_wp' ditentukan dalam initializer arch / x86 /kvm/mmu.c:4223: peringatan: elemen berlebih di lengkung initializer union / x86 / kvm / mmu.c: 4223: peringatan: (dekat inisialisasi untuk '(anonim)') make [2]:(dekat inisialisasi untuk '(anonim)') lengkungan / x86 / kvm / mmu.c: 4222: kesalahan: bidang tidak dikenal 'smep_andnot_wp' ditentukan dalam lengkungan penginisialisasi / x86 / kvm / mmu.c: 4222: peringatan: elemen berlebih dalam serikat initializer arch / x86 / kvm / mmu.c: 4222: peringatan: (inisialisasi dekat untuk '(anonim)') arch / x86 / kvm / mmu.c: 4223: kesalahan: bidang tidak diketahui 'smap_andnot_wp' ditentukan dalam lengkungan initializer / x86 /kvm/mmu.c:4223: peringatan: elemen berlebih di lengkung initializer union / x86 / kvm / mmu.c: 4223: peringatan: (dekat inisialisasi untuk '(anonim)') make [2]:bidang tidak dikenal 'smap_andnot_wp' ditentukan dalam lengkungan penginisialisasi / x86 / kvm / mmu.c: 4223: peringatan: elemen berlebih dalam lengkung penginisialisasi gabungan / x86 / kvm / mmu.c: 4223: peringatan: (dekat inisialisasi untuk '(anonim)' ) make [2]:bidang tidak dikenal 'smap_andnot_wp' ditentukan dalam lengkungan penginisialisasi / x86 / kvm / mmu.c: 4223: peringatan: elemen berlebih dalam lengkung penginisialisasi gabungan / x86 / kvm / mmu.c: 4223: peringatan: (dekat inisialisasi untuk '(anonim)' ) make [2]:* [arch / x86 / kvm / mmu.o] Kesalahan 1 make [1]: * [arch / x86 / kvm] Error 2 make: *** [arch / x86] Error 2

Saya telah menonaktifkan MMU di bawah menu KVM tetapi masih muncul di kompilasi, saya sudah mencoba make clean juga

Inilah konfigurasi build: http://sprunge.us/YdcN

Apa pun yang saya lewatkan?

Arjit Chaudhary
sumber

Jawaban:

0

Ini adalah kesalahan pengkodean yang ditemukan dalam linux-4.0.5/arch/x86/kvm/mmu.cfile. Anda dapat mengomentari baris tersebut karena itu adalah variabel gabungan yang digunakan untuk mengalokasikan detail tabel halaman karena tidak terlalu penting.

atau:

Anda dapat mengganti kvm_mmu_pte_write()definisi fungsi dengan kode di bawah ini untuk memperbaiki kesalahan

void kvm_mmu_pte_write(struct kvm_vcpu *vcpu, gpa_t gpa,
                   const u8 *new, int bytes) {
    gfn_t gfn = gpa >> PAGE_SHIFT;
    struct kvm_mmu_page *sp;
    LIST_HEAD(invalid_list);
    u64 entry, gentry, *spte;
    int npte;
    bool remote_flush, local_flush, zap_page;

    struct kvm_mmu *context = &vcpu->arch.mmu;

    union kvm_mmu_page_role mask = (union kvm_mmu_page_role) {
        context->base_role.cr0_wp = 1,
        context->base_role.cr4_pae = 1,
        context->base_role.nxe = 1,
        context->base_role.smep_andnot_wp = 1,
        context->base_role.smap_andnot_wp = 1
    };

    /*
     * If we don't have indirect shadow pages, it means no page is
     * write-protected, so we can exit simply.
     */
    if (!ACCESS_ONCE(vcpu->kvm->arch.indirect_shadow_pages))
            return;

    zap_page = remote_flush = local_flush = false;

    pgprintk("%s: gpa %llx bytes %d\n", __func__, gpa, bytes);

    gentry = mmu_pte_write_fetch_gpte(vcpu, &gpa, new, &bytes);

    /*
     * No need to care whether allocation memory is successful
     * or not since pte prefetch is skiped if it does not have
     * enough objects in the cache.
     */
    mmu_topup_memory_caches(vcpu);

    spin_lock(&vcpu->kvm->mmu_lock);
    ++vcpu->kvm->stat.mmu_pte_write;
    kvm_mmu_audit(vcpu, AUDIT_PRE_PTE_WRITE);

    for_each_gfn_indirect_valid_sp(vcpu->kvm, sp, gfn) {
            if (detect_write_misaligned(sp, gpa, bytes) ||
                  detect_write_flooding(sp)) {
                    zap_page |= !!kvm_mmu_prepare_zap_page(vcpu->kvm, sp,
                                                 &invalid_list);
                    ++vcpu->kvm->stat.mmu_flooded;
                    continue;
            }

            spte = get_written_sptes(sp, gpa, &npte);
            if (!spte)
                    continue;

            local_flush = true;
            while (npte--) {
                    entry = *spte;
                    mmu_page_zap_pte(vcpu->kvm, sp, spte);
                    if (gentry &&
                          !((sp->role.word ^ vcpu->arch.mmu.base_role.word)
                          & mask.word) && rmap_can_add(vcpu))
                            mmu_pte_write_new_pte(vcpu, sp, spte, &gentry);
                    if (need_remote_flush(entry, *spte))
                            remote_flush = true;
                    ++spte;
            }
    }
    mmu_pte_write_flush_tlb(vcpu, zap_page, remote_flush, local_flush);
    kvm_mmu_commit_zap_page(vcpu->kvm, &invalid_list);
    kvm_mmu_audit(vcpu, AUDIT_POST_PTE_WRITE);
    spin_unlock(&vcpu->kvm->mmu_lock);
}

Buat perubahan dan kompilasi kode lagi. ini bekerja untuk saya.

Sriram M
sumber
1
Bagaimana Anda tahu bahwa ini adalah bug? Bagaimana Anda tahu bahwa kode ini memperbaiki masalah?
Michael Hampton
Apakah perbaikan ini ada di 4.1-rc7?
Arjit Chaudhary