Message ID | 1510341591-22817-10-git-send-email-gengdongjiu@huawei.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On 10/11/2017 20:19, Dongjiu Geng wrote: > +typedef struct HWPoisonPage { > + ram_addr_t ram_addr; > + QLIST_ENTRY(HWPoisonPage) list; > +} HWPoisonPage; > + Is this actually needed outside accel/kvm/kvm-all.c? Thanks, Paolo
On 2017/11/10 19:32, Paolo Bonzini wrote: > On 10/11/2017 20:19, Dongjiu Geng wrote: >> +typedef struct HWPoisonPage { >> + ram_addr_t ram_addr; >> + QLIST_ENTRY(HWPoisonPage) list; >> +} HWPoisonPage; >> + > > Is this actually needed outside accel/kvm/kvm-all.c? Paolo, Thanks for the comments, this structure is added in the accel/kvm/kvm-all.c is also OK. My previous thought is that this is structure definition, so I move it to a header file. If you think this structure should be added in accel/kvm/kvm-all.c, I will move it. thanks! > > Thanks, > > Paolo > > . >
On 13/11/2017 02:45, gengdongjiu wrote: > On 2017/11/10 19:32, Paolo Bonzini wrote: >> On 10/11/2017 20:19, Dongjiu Geng wrote: >>> +typedef struct HWPoisonPage { >>> + ram_addr_t ram_addr; >>> + QLIST_ENTRY(HWPoisonPage) list; >>> +} HWPoisonPage; >>> + >> >> Is this actually needed outside accel/kvm/kvm-all.c? > Paolo, > Thanks for the comments, this structure is added in the accel/kvm/kvm-all.c is also OK. > My previous thought is that this is structure definition, so I move it to a header file. > If you think this structure should be added in accel/kvm/kvm-all.c, I will move it. It can be done later; but if you have to send a v13 series, I would be grateful if you included this change as well. Paolo > thanks! > >> >> Thanks, >> >> Paolo >> >> . >> >
On 2017/11/13 16:27, Paolo Bonzini wrote: >> If you think this structure should be added in accel/kvm/kvm-all.c, I will move it. > It can be done later; but if you have to send a v13 series, I would be > grateful if you included this change as well. Ok, got it, thanks Paolo. > > Paolo >
On 2017/11/13 16:27, Paolo Bonzini wrote: > On 13/11/2017 02:45, gengdongjiu wrote: >> On 2017/11/10 19:32, Paolo Bonzini wrote: >>> On 10/11/2017 20:19, Dongjiu Geng wrote: >>>> +typedef struct HWPoisonPage { >>>> + ram_addr_t ram_addr; >>>> + QLIST_ENTRY(HWPoisonPage) list; >>>> +} HWPoisonPage; >>>> + >>> >>> Is this actually needed outside accel/kvm/kvm-all.c? >> Paolo, >> Thanks for the comments, this structure is added in the accel/kvm/kvm-all.c is also OK. >> My previous thought is that this is structure definition, so I move it to a header file. >> If you think this structure should be added in accel/kvm/kvm-all.c, I will move it. > > It can be done later; but if you have to send a v13 series, I would be > grateful if you included this change as well. Hi Paolo, I have included this changed in the v13 series, could I can get your "Reviewed-by" after you reviewed it. thanks so much. > > Paolo > >> thanks! >> >>> >>> Thanks, >>> >>> Paolo >>> >>> . >>> >> > > > . >
diff --git a/accel/kvm/kvm-all.c b/accel/kvm/kvm-all.c index 46ce479..72ab615 100644 --- a/accel/kvm/kvm-all.c +++ b/accel/kvm/kvm-all.c @@ -564,6 +564,34 @@ int kvm_vm_check_extension(KVMState *s, unsigned int extension) return ret; } +static QLIST_HEAD(, HWPoisonPage) hwpoison_page_list = + QLIST_HEAD_INITIALIZER(hwpoison_page_list); + +void kvm_unpoison_all(void *param) +{ + HWPoisonPage *page, *next_page; + + QLIST_FOREACH_SAFE(page, &hwpoison_page_list, list, next_page) { + QLIST_REMOVE(page, list); + qemu_ram_remap(page->ram_addr, TARGET_PAGE_SIZE); + g_free(page); + } +} + +void kvm_hwpoison_page_add(ram_addr_t ram_addr) +{ + HWPoisonPage *page; + + QLIST_FOREACH(page, &hwpoison_page_list, list) { + if (page->ram_addr == ram_addr) { + return; + } + } + page = g_new(HWPoisonPage, 1); + page->ram_addr = ram_addr; + QLIST_INSERT_HEAD(&hwpoison_page_list, page, list); +} + static uint32_t adjust_ioeventfd_endianness(uint32_t val, uint32_t size) { #if defined(HOST_WORDS_BIGENDIAN) != defined(TARGET_WORDS_BIGENDIAN) @@ -2279,6 +2307,7 @@ bool kvm_arm_supports_user_irq(void) return kvm_check_extension(kvm_state, KVM_CAP_ARM_USER_IRQ); } + #ifdef KVM_CAP_SET_GUEST_DEBUG struct kvm_sw_breakpoint *kvm_find_sw_breakpoint(CPUState *cpu, target_ulong pc) diff --git a/include/exec/ram_addr.h b/include/exec/ram_addr.h index d017639..afe34b1 100644 --- a/include/exec/ram_addr.h +++ b/include/exec/ram_addr.h @@ -49,6 +49,11 @@ struct RAMBlock { unsigned long *unsentmap; }; +typedef struct HWPoisonPage { + ram_addr_t ram_addr; + QLIST_ENTRY(HWPoisonPage) list; +} HWPoisonPage; + static inline bool offset_in_ramblock(RAMBlock *b, ram_addr_t offset) { return (b && b->host && offset < b->used_length) ? true : false; @@ -80,6 +85,11 @@ void qemu_ram_free(RAMBlock *block); int qemu_ram_resize(RAMBlock *block, ram_addr_t newsize, Error **errp); +/* Free and remove all the poisoned pages in the list */ +void kvm_unpoison_all(void *param); +/* Add a poisoned page to the list */ +void kvm_hwpoison_page_add(ram_addr_t ram_addr); + #define DIRTY_CLIENTS_ALL ((1 << DIRTY_MEMORY_NUM) - 1) #define DIRTY_CLIENTS_NOCODE (DIRTY_CLIENTS_ALL & ~(1 << DIRTY_MEMORY_CODE)) diff --git a/target/i386/kvm.c b/target/i386/kvm.c index 6db7783..3e1afb6 100644 --- a/target/i386/kvm.c +++ b/target/i386/kvm.c @@ -390,39 +390,6 @@ uint32_t kvm_arch_get_supported_cpuid(KVMState *s, uint32_t function, return ret; } -typedef struct HWPoisonPage { - ram_addr_t ram_addr; - QLIST_ENTRY(HWPoisonPage) list; -} HWPoisonPage; - -static QLIST_HEAD(, HWPoisonPage) hwpoison_page_list = - QLIST_HEAD_INITIALIZER(hwpoison_page_list); - -static void kvm_unpoison_all(void *param) -{ - HWPoisonPage *page, *next_page; - - QLIST_FOREACH_SAFE(page, &hwpoison_page_list, list, next_page) { - QLIST_REMOVE(page, list); - qemu_ram_remap(page->ram_addr, TARGET_PAGE_SIZE); - g_free(page); - } -} - -static void kvm_hwpoison_page_add(ram_addr_t ram_addr) -{ - HWPoisonPage *page; - - QLIST_FOREACH(page, &hwpoison_page_list, list) { - if (page->ram_addr == ram_addr) { - return; - } - } - page = g_new(HWPoisonPage, 1); - page->ram_addr = ram_addr; - QLIST_INSERT_HEAD(&hwpoison_page_list, page, list); -} - static int kvm_get_mce_cap_supported(KVMState *s, uint64_t *mce_cap, int *max_banks) {
kvm_hwpoison_page_add() and kvm_unpoison_all() will be used by both X86 and ARM platforms, so move them to a common accel/kvm/ folder to avoid duplicate code. Signed-off-by: Dongjiu Geng <gengdongjiu@huawei.com> --- Moving related hwpoison page function to accel/kvm folder is suggested here: https://lists.gnu.org/archive/html/qemu-arm/2017-09/msg00077.html https://lists.gnu.org/archive/html/qemu-arm/2017-09/msg00152.html --- accel/kvm/kvm-all.c | 29 +++++++++++++++++++++++++++++ include/exec/ram_addr.h | 10 ++++++++++ target/i386/kvm.c | 33 --------------------------------- 3 files changed, 39 insertions(+), 33 deletions(-)