Message ID | 20220721132256.2171-14-frankja@linux.ibm.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | dump: Add arch section and s390x PV dump | expand |
Hi Janosch, looks good to me. Have a look on my comments. On 7/21/22 15:22, Janosch Frank wrote: > Let's add a few bits of code which hide the new KVM PV dump API from > us via new functions. > > Signed-off-by: Janosch Frank <frankja@linux.ibm.com> > --- > hw/s390x/pv.c | 51 +++++++++++++++++++++++++++++++++++++++++++ > include/hw/s390x/pv.h | 8 +++++++ > 2 files changed, 59 insertions(+) > > diff --git a/hw/s390x/pv.c b/hw/s390x/pv.c > index a5af4ddf46..48591c387d 100644 > --- a/hw/s390x/pv.c > +++ b/hw/s390x/pv.c > @@ -175,6 +175,57 @@ bool kvm_s390_pv_info_basic_valid(void) > return info_valid; > } > > +static int s390_pv_dump_cmd(uint64_t subcmd, uint64_t uaddr, uint64_t gaddr, > + uint64_t len) > +{ > + struct kvm_s390_pv_dmp dmp = { > + .subcmd = subcmd, > + .buff_addr = uaddr, > + .buff_len = len, > + .gaddr = gaddr, > + }; > + int ret; > + > + ret = s390_pv_cmd(KVM_PV_DUMP, (void *)&dmp); > + if (ret) { > + error_report("KVM DUMP command %ld failed", subcmd); > + } > + return ret; > +} > + > +int kvm_s390_dump_cpu(S390CPU *cpu, void *buff) > +{ > + struct kvm_s390_pv_dmp dmp = { > + .subcmd = KVM_PV_DUMP_CPU, > + .buff_addr = (uint64_t)buff, > + .gaddr = 0, > + .buff_len = info_dump.dump_cpu_buffer_len, > + }; > + struct kvm_pv_cmd pv = { > + .cmd = KVM_PV_DUMP, > + .data = (uint64_t)&dmp, > + }; > + > + return kvm_vcpu_ioctl(CPU(cpu), KVM_S390_PV_CPU_COMMAND, &pv); > +} > + > +int kvm_s390_dump_init(void) > +{ > + return s390_pv_dump_cmd(KVM_PV_DUMP_INIT, 0, 0, 0); > +} > + > +int kvm_s390_dump_mem(uint64_t gaddr, size_t len, void *dest) > +{ > + return s390_pv_dump_cmd(KVM_PV_DUMP_CONFIG_STATE, (uint64_t)dest, > + gaddr, len); > +} Wouldn't be kvm_s390_dump_mem_state() a more precise name? Or kvm_s390_dump_mem_meta, as the corresponding section in the dump has that name (pv_mem_meta) The current name may lead to the conclusion that this function dumps the guests memory, which it does not. > + > +int kvm_s390_dump_finish(void *buff) > +{ > + return s390_pv_dump_cmd(KVM_PV_DUMP_COMPLETE, (uint64_t)buff, 0, > + info_dump.dump_config_finalize_len); > +} IIRC this is the only place were you call "complete-dump" "finish". In the next patch you call that function in "get_data_complete()". This is the only reference to that function. Why not simply call it kvm_s390_dump_complete() to reduce confusion? > + > #define TYPE_S390_PV_GUEST "s390-pv-guest" > OBJECT_DECLARE_SIMPLE_TYPE(S390PVGuest, S390_PV_GUEST) > > diff --git a/include/hw/s390x/pv.h b/include/hw/s390x/pv.h > index 6fa55bf70e..f37021e189 100644 > --- a/include/hw/s390x/pv.h > +++ b/include/hw/s390x/pv.h > @@ -51,6 +51,10 @@ uint64_t kvm_s390_pv_dmp_get_size_cpu(void); > uint64_t kvm_s390_pv_dmp_get_size_mem(void); > uint64_t kvm_s390_pv_dmp_get_size_complete(void); > bool kvm_s390_pv_info_basic_valid(void); > +int kvm_s390_dump_init(void); > +int kvm_s390_dump_cpu(S390CPU *cpu, void *buff); > +int kvm_s390_dump_mem(uint64_t addr, size_t len, void *dest); > +int kvm_s390_dump_finish(void *buff); > #else /* CONFIG_KVM */ > static inline bool s390_is_pv(void) { return false; } > static inline int s390_pv_query_info(void) { return 0; } > @@ -66,6 +70,10 @@ static inline uint64_t kvm_s390_pv_dmp_get_size_cpu(void) { return 0; } > static inline uint64_t kvm_s390_pv_dmp_get_size_mem(void) { return 0; } > static inline uint64_t kvm_s390_pv_dmp_get_size_complete(void) { return 0; } > static inline bool kvm_s390_pv_info_basic_valid(void) { return false; } > +static inline int kvm_s390_dump_init(void) { return 0; } > +static inline int kvm_s390_dump_cpu(S390CPU *cpu, void *buff, size_t len) { return 0; } > +static inline int kvm_s390_dump_mem(uint64_t addr, size_t len, void *dest) { return 0; } > +static inline int kvm_s390_dump_finish(void *buff) { return 0; } > #endif /* CONFIG_KVM */ > > int s390_pv_kvm_init(ConfidentialGuestSupport *cgs, Error **errp);
diff --git a/hw/s390x/pv.c b/hw/s390x/pv.c index a5af4ddf46..48591c387d 100644 --- a/hw/s390x/pv.c +++ b/hw/s390x/pv.c @@ -175,6 +175,57 @@ bool kvm_s390_pv_info_basic_valid(void) return info_valid; } +static int s390_pv_dump_cmd(uint64_t subcmd, uint64_t uaddr, uint64_t gaddr, + uint64_t len) +{ + struct kvm_s390_pv_dmp dmp = { + .subcmd = subcmd, + .buff_addr = uaddr, + .buff_len = len, + .gaddr = gaddr, + }; + int ret; + + ret = s390_pv_cmd(KVM_PV_DUMP, (void *)&dmp); + if (ret) { + error_report("KVM DUMP command %ld failed", subcmd); + } + return ret; +} + +int kvm_s390_dump_cpu(S390CPU *cpu, void *buff) +{ + struct kvm_s390_pv_dmp dmp = { + .subcmd = KVM_PV_DUMP_CPU, + .buff_addr = (uint64_t)buff, + .gaddr = 0, + .buff_len = info_dump.dump_cpu_buffer_len, + }; + struct kvm_pv_cmd pv = { + .cmd = KVM_PV_DUMP, + .data = (uint64_t)&dmp, + }; + + return kvm_vcpu_ioctl(CPU(cpu), KVM_S390_PV_CPU_COMMAND, &pv); +} + +int kvm_s390_dump_init(void) +{ + return s390_pv_dump_cmd(KVM_PV_DUMP_INIT, 0, 0, 0); +} + +int kvm_s390_dump_mem(uint64_t gaddr, size_t len, void *dest) +{ + return s390_pv_dump_cmd(KVM_PV_DUMP_CONFIG_STATE, (uint64_t)dest, + gaddr, len); +} + +int kvm_s390_dump_finish(void *buff) +{ + return s390_pv_dump_cmd(KVM_PV_DUMP_COMPLETE, (uint64_t)buff, 0, + info_dump.dump_config_finalize_len); +} + #define TYPE_S390_PV_GUEST "s390-pv-guest" OBJECT_DECLARE_SIMPLE_TYPE(S390PVGuest, S390_PV_GUEST) diff --git a/include/hw/s390x/pv.h b/include/hw/s390x/pv.h index 6fa55bf70e..f37021e189 100644 --- a/include/hw/s390x/pv.h +++ b/include/hw/s390x/pv.h @@ -51,6 +51,10 @@ uint64_t kvm_s390_pv_dmp_get_size_cpu(void); uint64_t kvm_s390_pv_dmp_get_size_mem(void); uint64_t kvm_s390_pv_dmp_get_size_complete(void); bool kvm_s390_pv_info_basic_valid(void); +int kvm_s390_dump_init(void); +int kvm_s390_dump_cpu(S390CPU *cpu, void *buff); +int kvm_s390_dump_mem(uint64_t addr, size_t len, void *dest); +int kvm_s390_dump_finish(void *buff); #else /* CONFIG_KVM */ static inline bool s390_is_pv(void) { return false; } static inline int s390_pv_query_info(void) { return 0; } @@ -66,6 +70,10 @@ static inline uint64_t kvm_s390_pv_dmp_get_size_cpu(void) { return 0; } static inline uint64_t kvm_s390_pv_dmp_get_size_mem(void) { return 0; } static inline uint64_t kvm_s390_pv_dmp_get_size_complete(void) { return 0; } static inline bool kvm_s390_pv_info_basic_valid(void) { return false; } +static inline int kvm_s390_dump_init(void) { return 0; } +static inline int kvm_s390_dump_cpu(S390CPU *cpu, void *buff, size_t len) { return 0; } +static inline int kvm_s390_dump_mem(uint64_t addr, size_t len, void *dest) { return 0; } +static inline int kvm_s390_dump_finish(void *buff) { return 0; } #endif /* CONFIG_KVM */ int s390_pv_kvm_init(ConfidentialGuestSupport *cgs, Error **errp);
Let's add a few bits of code which hide the new KVM PV dump API from us via new functions. Signed-off-by: Janosch Frank <frankja@linux.ibm.com> --- hw/s390x/pv.c | 51 +++++++++++++++++++++++++++++++++++++++++++ include/hw/s390x/pv.h | 8 +++++++ 2 files changed, 59 insertions(+)