[PATCH v2] powerpc/iommu: limit number of TCEs to 512 for H_STUFF_TCE hcall

Gaurav Batra gbatra at linux.vnet.ibm.com
Fri May 26 00:40:11 AEST 2023


Hello Michael,

Here are the changes in v2 of the patch

1. added some wording to change log to specify why we are seeing the 
issue now. Also added "CC: stable at vger.kernel.org"

2. changed "limit" to unsigned long. I have kept "rpages" as "long"

Thanks,

Gaurav

On 5/25/23 9:34 AM, Gaurav Batra wrote:
> As of now, in tce_freemulti_pSeriesLP(), there is no limit on how many TCEs
> are passed to H_STUFF_TCE hcall. This was not an issue until now. Newer
> firmware releases have started enforcing this requirement.
>
> The interface has been in it's current form since the beginning.
>
> Cc: stable at vger.kernel.org
>
> Signed-off-by: Gaurav Batra <gbatra at linux.vnet.ibm.com>
> Reviewed-by: Brian King <brking at linux.vnet.ibm.com>
> ---
>   arch/powerpc/platforms/pseries/iommu.c | 13 +++++++++++--
>   1 file changed, 11 insertions(+), 2 deletions(-)
>
> diff --git a/arch/powerpc/platforms/pseries/iommu.c b/arch/powerpc/platforms/pseries/iommu.c
> index c74b71d4733d..f159a195101d 100644
> --- a/arch/powerpc/platforms/pseries/iommu.c
> +++ b/arch/powerpc/platforms/pseries/iommu.c
> @@ -306,13 +306,22 @@ static void tce_free_pSeriesLP(unsigned long liobn, long tcenum, long tceshift,
>   static void tce_freemulti_pSeriesLP(struct iommu_table *tbl, long tcenum, long npages)
>   {
>   	u64 rc;
> +	long rpages = npages;
> +	unsigned long limit;
>
>   	if (!firmware_has_feature(FW_FEATURE_STUFF_TCE))
>   		return tce_free_pSeriesLP(tbl->it_index, tcenum,
>   					  tbl->it_page_shift, npages);
>
> -	rc = plpar_tce_stuff((u64)tbl->it_index,
> -			     (u64)tcenum << tbl->it_page_shift, 0, npages);
> +	do {
> +		limit = min_t(unsigned long, rpages, 512);
> +
> +		rc = plpar_tce_stuff((u64)tbl->it_index,
> +			     	(u64)tcenum << tbl->it_page_shift, 0, limit);
> +
> +		rpages -= limit;
> +		tcenum += limit;
> +	} while (rpages > 0 && !rc);
>
>   	if (rc && printk_ratelimit()) {
>   		printk("tce_freemulti_pSeriesLP: plpar_tce_stuff failed\n");


More information about the Linuxppc-dev mailing list