[PATCH v3 1/4] powerpc/pseries/vas: Define global hv_cop_caps struct

Nicholas Piggin npiggin at gmail.com
Wed Feb 23 20:39:08 AEDT 2022


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 <npiggin at gmail.com>

> Signed-off-by: Haren Myneni <haren at linux.ibm.com>
> Acked-by: Nathan Lynch <nathanl at 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
> 
> 
> 


More information about the Linuxppc-dev mailing list