> -----Original Message-----
> From: Nuno Das Neves <[email protected]>
> Sent: Friday, May 28, 2021 3:43 PM
> To: [email protected]; [email protected]
> Cc: [email protected]; Michael Kelley 
> <[email protected]>; [email protected]; Sunil
> Muthuswamy <[email protected]>; [email protected]; vkuznets 
> <[email protected]>; Lillian Grassin-Drake
> <[email protected]>; KY Srinivasan <[email protected]>
> Subject: [PATCH 02/19] asm-generic/hyperv: convert hyperv statuses to strings
> 
> Allow hyperv hypercall failures to be debugged more easily with dmesg.
> This will be used in the mshv module.
> 
> Signed-off-by: Nuno Das Neves <[email protected]>
> ---
>  arch/x86/hyperv/hv_init.c         |  2 +-
>  arch/x86/hyperv/hv_proc.c         | 10 +++---
>  include/asm-generic/hyperv-tlfs.h | 52 ++++++++++++++++++-------------
>  include/asm-generic/mshyperv.h    |  8 +++++
>  4 files changed, 44 insertions(+), 28 deletions(-)
> 
> diff --git a/arch/x86/hyperv/hv_init.c b/arch/x86/hyperv/hv_init.c
> index bb0ae4b5c00f..722bafdb2225 100644
> --- a/arch/x86/hyperv/hv_init.c
> +++ b/arch/x86/hyperv/hv_init.c
> @@ -349,7 +349,7 @@ static void __init hv_get_partition_id(void)
>       status = hv_do_hypercall(HVCALL_GET_PARTITION_ID, NULL, output_page);
>       if (!hv_result_success(status)) {
>               /* No point in proceeding if this failed */
> -             pr_err("Failed to get partition ID: %lld\n", status);
> +             pr_err("Failed to get partition ID: %s\n", 
> hv_status_to_string(status));
>               BUG();
>       }
>       hv_current_partition_id = output_page->partition_id;
> diff --git a/arch/x86/hyperv/hv_proc.c b/arch/x86/hyperv/hv_proc.c
> index 59cf9a9e0975..30951e778577 100644
> --- a/arch/x86/hyperv/hv_proc.c
> +++ b/arch/x86/hyperv/hv_proc.c
> @@ -117,7 +117,7 @@ int hv_call_deposit_pages(int node, u64 partition_id, u32 
> num_pages)
>                                    page_count, 0, input_page, NULL);
>       local_irq_restore(flags);
>       if (!hv_result_success(status)) {
> -             pr_err("Failed to deposit pages: %lld\n", status);
> +             pr_err("Failed to deposit pages: %s\n", 
> hv_status_to_string(status));
>               ret = hv_status_to_errno(status);
>               goto err_free_allocations;
>       }
> @@ -172,8 +172,8 @@ int hv_call_add_logical_proc(int node, u32 lp_index, u32 
> apic_id)
> 
>               if (hv_result(status) != HV_STATUS_INSUFFICIENT_MEMORY) {
>                       if (!hv_result_success(status)) {
> -                             pr_err("%s: cpu %u apic ID %u, %lld\n", 
> __func__,
> -                                    lp_index, apic_id, status);
> +                             pr_err("%s: cpu %u apic ID %u, %s\n", __func__,
> +                                    lp_index, apic_id, 
> hv_status_to_string(status));
>                               ret = hv_status_to_errno(status);
>                       }
>                       break;
> @@ -222,8 +222,8 @@ int hv_call_create_vp(int node, u64 partition_id, u32 
> vp_index, u32 flags)
> 
>               if (hv_result(status) != HV_STATUS_INSUFFICIENT_MEMORY) {
>                       if (!hv_result_success(status)) {
> -                             pr_err("%s: vcpu %u, lp %u, %lld\n", __func__,
> -                                    vp_index, flags, status);
> +                             pr_err("%s: vcpu %u, lp %u, %s\n", __func__,
> +                                    vp_index, flags, 
> hv_status_to_string(status));
>                               ret = hv_status_to_errno(status);
>                       }
>                       break;
> diff --git a/include/asm-generic/hyperv-tlfs.h 
> b/include/asm-generic/hyperv-tlfs.h
> index fe6d41d0b114..40ff7cdd4a2b 100644
> --- a/include/asm-generic/hyperv-tlfs.h
> +++ b/include/asm-generic/hyperv-tlfs.h
> @@ -189,28 +189,36 @@ enum HV_GENERIC_SET_FORMAT {
>  #define HV_HYPERCALL_REP_START_MASK  GENMASK_ULL(59, 48)
> 
>  /* hypercall status code */
> -#define HV_STATUS_SUCCESS                    0x0
> -#define HV_STATUS_INVALID_HYPERCALL_CODE     0x2
> -#define HV_STATUS_INVALID_HYPERCALL_INPUT    0x3
> -#define HV_STATUS_INVALID_ALIGNMENT          0x4
> -#define HV_STATUS_INVALID_PARAMETER          0x5
> -#define HV_STATUS_ACCESS_DENIED                      0x6
> -#define HV_STATUS_INVALID_PARTITION_STATE    0x7
> -#define HV_STATUS_OPERATION_DENIED           0x8
> -#define HV_STATUS_UNKNOWN_PROPERTY           0x9
> -#define HV_STATUS_PROPERTY_VALUE_OUT_OF_RANGE        0xA
> -#define HV_STATUS_INSUFFICIENT_MEMORY                0xB
> -#define HV_STATUS_INVALID_PARTITION_ID               0xD
> -#define HV_STATUS_INVALID_VP_INDEX           0xE
> -#define HV_STATUS_NOT_FOUND                  0x10
> -#define HV_STATUS_INVALID_PORT_ID            0x11
> -#define HV_STATUS_INVALID_CONNECTION_ID              0x12
> -#define HV_STATUS_INSUFFICIENT_BUFFERS               0x13
> -#define HV_STATUS_NOT_ACKNOWLEDGED           0x14
> -#define HV_STATUS_INVALID_VP_STATE           0x15
> -#define HV_STATUS_NO_RESOURCES                       0x1D
> -#define HV_STATUS_INVALID_LP_INDEX           0x41
> -#define HV_STATUS_INVALID_REGISTER_VALUE     0x50
> +#define __HV_STATUS_DEF(OP) \
> +     OP(HV_STATUS_SUCCESS,                           0x0) \
> +     OP(HV_STATUS_INVALID_HYPERCALL_CODE,            0x2) \
> +     OP(HV_STATUS_INVALID_HYPERCALL_INPUT,           0x3) \
> +     OP(HV_STATUS_INVALID_ALIGNMENT,                 0x4) \
> +     OP(HV_STATUS_INVALID_PARAMETER,                 0x5) \
> +     OP(HV_STATUS_ACCESS_DENIED,                     0x6) \
> +     OP(HV_STATUS_INVALID_PARTITION_STATE,           0x7) \
> +     OP(HV_STATUS_OPERATION_DENIED,                  0x8) \
> +     OP(HV_STATUS_UNKNOWN_PROPERTY,                  0x9) \
> +     OP(HV_STATUS_PROPERTY_VALUE_OUT_OF_RANGE,       0xA) \
> +     OP(HV_STATUS_INSUFFICIENT_MEMORY,               0xB) \
> +     OP(HV_STATUS_INVALID_PARTITION_ID,              0xD) \
> +     OP(HV_STATUS_INVALID_VP_INDEX,                  0xE) \
> +     OP(HV_STATUS_NOT_FOUND,                         0x10) \
> +     OP(HV_STATUS_INVALID_PORT_ID,                   0x11) \
> +     OP(HV_STATUS_INVALID_CONNECTION_ID,             0x12) \
> +     OP(HV_STATUS_INSUFFICIENT_BUFFERS,              0x13) \
> +     OP(HV_STATUS_NOT_ACKNOWLEDGED,                  0x14) \
> +     OP(HV_STATUS_INVALID_VP_STATE,                  0x15) \
> +     OP(HV_STATUS_NO_RESOURCES,                      0x1D) \
> +     OP(HV_STATUS_INVALID_LP_INDEX,                  0x41) \
> +     OP(HV_STATUS_INVALID_REGISTER_VALUE,            0x50)
> +
> +#define __HV_MAKE_HV_STATUS_ENUM(NAME, VAL) NAME = (VAL),
> +#define __HV_MAKE_HV_STATUS_CASE(NAME, VAL) case (NAME): return (#NAME);
> +
> +enum hv_status {
> +     __HV_STATUS_DEF(__HV_MAKE_HV_STATUS_ENUM)
> +};
> 
>  /*
>   * The Hyper-V TimeRefCount register and the TSC
> diff --git a/include/asm-generic/mshyperv.h b/include/asm-generic/mshyperv.h
> index 9a000ba2bb75..21fb71ca1ba9 100644
> --- a/include/asm-generic/mshyperv.h
> +++ b/include/asm-generic/mshyperv.h
> @@ -59,6 +59,14 @@ static inline unsigned int hv_repcomp(u64 status)
>                        HV_HYPERCALL_REP_COMP_OFFSET;
>  }
> 
> +static inline const char *hv_status_to_string(u64 hv_status)
> +{
> +     switch (hv_result(hv_status)) {
> +     __HV_STATUS_DEF(__HV_MAKE_HV_STATUS_CASE)
> +     default : return "Unknown";
> +     }
> +}
Wouldn't this be a big switch statement that will get duplicated all over the 
place
in the code because of the inline (and also the strings within)?

- Sunil
_______________________________________________
Virtualization mailing list
[email protected]
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

Reply via email to