Excerpts from Haren Myneni's message of February 20, 2022 6:05 am:
> 
> The coprocessor capabilities struct is used to get default and
> QoS capabilities from the hypervisor during init, DLPAR event and
> migration. So instead of allocating this struct for each event,
> define global struct and reuse it which allows the migration code
> to avoid adding an error path.
> 
> Also disable copy/paste feature flag if any capabilities HCALL
> is failed.
> 

Reviewed-by: Nicholas Piggin <npig...@gmail.com>

> Signed-off-by: Haren Myneni <ha...@linux.ibm.com>
> Acked-by: Nathan Lynch <nath...@linux.ibm.com>
> ---
>  arch/powerpc/platforms/pseries/vas.c | 47 ++++++++++++----------------
>  1 file changed, 20 insertions(+), 27 deletions(-)
> 
> diff --git a/arch/powerpc/platforms/pseries/vas.c 
> b/arch/powerpc/platforms/pseries/vas.c
> index 591c7597db5a..3bb219f54806 100644
> --- a/arch/powerpc/platforms/pseries/vas.c
> +++ b/arch/powerpc/platforms/pseries/vas.c
> @@ -26,6 +26,7 @@
>  
>  static struct vas_all_caps caps_all;
>  static bool copypaste_feat;
> +static struct hv_vas_cop_feat_caps hv_cop_caps;
>  
>  static struct vas_caps vascaps[VAS_MAX_FEAT_TYPE];
>  static DEFINE_MUTEX(vas_pseries_mutex);
> @@ -724,7 +725,6 @@ static int reconfig_close_windows(struct vas_caps *vcap, 
> int excess_creds)
>   */
>  int vas_reconfig_capabilties(u8 type)
>  {
> -     struct hv_vas_cop_feat_caps *hv_caps;
>       struct vas_cop_feat_caps *caps;
>       int old_nr_creds, new_nr_creds;
>       struct vas_caps *vcaps;
> @@ -738,17 +738,13 @@ int vas_reconfig_capabilties(u8 type)
>       vcaps = &vascaps[type];
>       caps = &vcaps->caps;
>  
> -     hv_caps = kmalloc(sizeof(*hv_caps), GFP_KERNEL);
> -     if (!hv_caps)
> -             return -ENOMEM;
> -
>       mutex_lock(&vas_pseries_mutex);
>       rc = h_query_vas_capabilities(H_QUERY_VAS_CAPABILITIES, vcaps->feat,
> -                                   (u64)virt_to_phys(hv_caps));
> +                                   (u64)virt_to_phys(&hv_cop_caps));
>       if (rc)
>               goto out;
>  
> -     new_nr_creds = be16_to_cpu(hv_caps->target_lpar_creds);
> +     new_nr_creds = be16_to_cpu(hv_cop_caps.target_lpar_creds);
>  
>       old_nr_creds = atomic_read(&caps->nr_total_credits);
>  
> @@ -780,7 +776,6 @@ int vas_reconfig_capabilties(u8 type)
>  
>  out:
>       mutex_unlock(&vas_pseries_mutex);
> -     kfree(hv_caps);
>       return rc;
>  }
>  /*
> @@ -822,9 +817,8 @@ static struct notifier_block pseries_vas_nb = {
>  
>  static int __init pseries_vas_init(void)
>  {
> -     struct hv_vas_cop_feat_caps *hv_cop_caps;
>       struct hv_vas_all_caps *hv_caps;
> -     int rc;
> +     int rc = 0;
>  
>       /*
>        * Linux supports user space COPY/PASTE only with Radix
> @@ -850,38 +844,37 @@ static int __init pseries_vas_init(void)
>  
>       sysfs_pseries_vas_init(&caps_all);
>  
> -     hv_cop_caps = kmalloc(sizeof(*hv_cop_caps), GFP_KERNEL);
> -     if (!hv_cop_caps) {
> -             rc = -ENOMEM;
> -             goto out;
> -     }
>       /*
>        * QOS capabilities available
>        */
>       if (caps_all.feat_type & VAS_GZIP_QOS_FEAT_BIT) {
>               rc = get_vas_capabilities(VAS_GZIP_QOS_FEAT,
> -                                       VAS_GZIP_QOS_FEAT_TYPE, hv_cop_caps);
> +                                       VAS_GZIP_QOS_FEAT_TYPE, &hv_cop_caps);
>  
>               if (rc)
> -                     goto out_cop;
> +                     goto out;
>       }
>       /*
>        * Default capabilities available
>        */
> -     if (caps_all.feat_type & VAS_GZIP_DEF_FEAT_BIT) {
> +     if (caps_all.feat_type & VAS_GZIP_DEF_FEAT_BIT)
>               rc = get_vas_capabilities(VAS_GZIP_DEF_FEAT,
> -                                       VAS_GZIP_DEF_FEAT_TYPE, hv_cop_caps);
> -             if (rc)
> -                     goto out_cop;
> -     }
> +                                       VAS_GZIP_DEF_FEAT_TYPE, &hv_cop_caps);
>  
> -     if (copypaste_feat && firmware_has_feature(FW_FEATURE_LPAR))
> -             of_reconfig_notifier_register(&pseries_vas_nb);
> +     if (!rc && copypaste_feat) {
> +             if (firmware_has_feature(FW_FEATURE_LPAR))
> +                     of_reconfig_notifier_register(&pseries_vas_nb);
>  
> -     pr_info("GZIP feature is available\n");
> +             pr_info("GZIP feature is available\n");
> +     } else {
> +             /*
> +              * Should not happen, but only when get default
> +              * capabilities HCALL failed. So disable copy paste
> +              * feature.
> +              */
> +             copypaste_feat = false;
> +     }
>  
> -out_cop:
> -     kfree(hv_cop_caps);
>  out:
>       kfree(hv_caps);
>       return rc;
> -- 
> 2.27.0
> 
> 
> 

Reply via email to