diff mbox series

xen/arm: smmuv1: Fixed stream matching register allocation

Message ID 612e7f61c19e60019bb7829888342fda95fd36be.1624546532.git.rahul.singh@arm.com (mailing list archive)
State New, archived
Headers show
Series xen/arm: smmuv1: Fixed stream matching register allocation | expand

Commit Message

Rahul Singh June 25, 2021, 4:37 p.m. UTC
SMR allocation should be based on the number of supported stream
matching register for each SMMU device.

Issue introduced by commit 5e08586afbb90b2e2d56c175c07db77a4afa873c
when backported the patches from Linux to XEN to fix the stream match
conflict issue when two devices have the same stream-id.

Acked-by: Stefano Stabellini <sstabellini@kernel.org>
Tested-by: Stefano Stabellini <sstabellini@kernel.org>
Signed-off-by: Rahul Singh <rahul.singh@arm.com>
---
 xen/drivers/passthrough/arm/smmu.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

Comments

Julien Grall June 30, 2021, 9:09 a.m. UTC | #1
Hi Rahul,

On 25/06/2021 17:37, Rahul Singh wrote:
> SMR allocation should be based on the number of supported stream
> matching register for each SMMU device.
> 
> Issue introduced by commit 5e08586afbb90b2e2d56c175c07db77a4afa873c
> when backported the patches from Linux to XEN to fix the stream match
> conflict issue when two devices have the same stream-id.
> 
> Acked-by: Stefano Stabellini <sstabellini@kernel.org>
> Tested-by: Stefano Stabellini <sstabellini@kernel.org>
> Signed-off-by: Rahul Singh <rahul.singh@arm.com>
> ---
>   xen/drivers/passthrough/arm/smmu.c | 3 ++-
>   1 file changed, 2 insertions(+), 1 deletion(-)
> 
> diff --git a/xen/drivers/passthrough/arm/smmu.c b/xen/drivers/passthrough/arm/smmu.c
> index d9a3a0cbf6..da2cd457d7 100644
> --- a/xen/drivers/passthrough/arm/smmu.c
> +++ b/xen/drivers/passthrough/arm/smmu.c
> @@ -149,6 +149,7 @@ typedef enum irqreturn irqreturn_t;
>   #define kzalloc(size, flags)		_xzalloc(size, sizeof(void *))
>   #define devm_kzalloc(dev, size, flags)	_xzalloc(size, sizeof(void *))
>   #define kmalloc_array(size, n, flags)	_xmalloc_array(size, sizeof(void *), n)
> +#define kzalloc_array(size, n, flags)	_xzalloc_array(size, sizeof(void *), n)
>   
>   static void __iomem *devm_ioremap_resource(struct device *dev,
>   					   struct resource *res)
> @@ -2221,7 +2222,7 @@ static int arm_smmu_device_cfg_probe(struct arm_smmu_device *smmu)
>   		smmu->smr_mask_mask = smr >> SMR_MASK_SHIFT;
>   
>   		/* Zero-initialised to mark as invalid */
> -		smmu->smrs = devm_kzalloc(smmu->dev, sizeof(*smmu->smrs), GFP_KERNEL);
> +		smmu->smrs = kzalloc_array(sizeof(*smmu->smrs), size, GFP_KERNEL);

I noticed this is already in... However, I am a bit puzzled into why 
this was switched devm_kzalloc() to kzalloc_array(). This doesn't matter 
for Xen as they are just wrappers to x*alloc() but a mention in the 
commit message would have been useful.

Also, when sending series, please remember to create a cover letter and 
number each patch.

Cheers,
Rahul Singh June 30, 2021, 5:49 p.m. UTC | #2
Hi Julien,

> On 30 Jun 2021, at 10:09 am, Julien Grall <julien@xen.org> wrote:
> 
> Hi Rahul,
> 
> On 25/06/2021 17:37, Rahul Singh wrote:
>> SMR allocation should be based on the number of supported stream
>> matching register for each SMMU device.
>> Issue introduced by commit 5e08586afbb90b2e2d56c175c07db77a4afa873c
>> when backported the patches from Linux to XEN to fix the stream match
>> conflict issue when two devices have the same stream-id.
>> Acked-by: Stefano Stabellini <sstabellini@kernel.org>
>> Tested-by: Stefano Stabellini <sstabellini@kernel.org>
>> Signed-off-by: Rahul Singh <rahul.singh@arm.com>
>> ---
>>  xen/drivers/passthrough/arm/smmu.c | 3 ++-
>>  1 file changed, 2 insertions(+), 1 deletion(-)
>> diff --git a/xen/drivers/passthrough/arm/smmu.c b/xen/drivers/passthrough/arm/smmu.c
>> index d9a3a0cbf6..da2cd457d7 100644
>> --- a/xen/drivers/passthrough/arm/smmu.c
>> +++ b/xen/drivers/passthrough/arm/smmu.c
>> @@ -149,6 +149,7 @@ typedef enum irqreturn irqreturn_t;
>>  #define kzalloc(size, flags)		_xzalloc(size, sizeof(void *))
>>  #define devm_kzalloc(dev, size, flags)	_xzalloc(size, sizeof(void *))
>>  #define kmalloc_array(size, n, flags)	_xmalloc_array(size, sizeof(void *), n)
>> +#define kzalloc_array(size, n, flags)	_xzalloc_array(size, sizeof(void *), n)
>>    static void __iomem *devm_ioremap_resource(struct device *dev,
>>  					   struct resource *res)
>> @@ -2221,7 +2222,7 @@ static int arm_smmu_device_cfg_probe(struct arm_smmu_device *smmu)
>>  		smmu->smr_mask_mask = smr >> SMR_MASK_SHIFT;
>>    		/* Zero-initialised to mark as invalid */
>> -		smmu->smrs = devm_kzalloc(smmu->dev, sizeof(*smmu->smrs), GFP_KERNEL);
>> +		smmu->smrs = kzalloc_array(sizeof(*smmu->smrs), size, GFP_KERNEL);
> 
> I noticed this is already in... However, I am a bit puzzled into why this was switched devm_kzalloc() to kzalloc_array(). This doesn't matter for Xen as they are just wrappers to x*alloc() but a mention in the commit message would have been useful.

Yes we can use the devm_kzalloc(..) but then we have to pass (sizeof(*smmu->smrs) * size ) as size argument to devm_kzalloc(..)
I thought for better code readability I will use kzalloc_array() as the function name suggests we are allocating memory for an array.

> 
> Also, when sending series, please remember to create a cover letter and number each patch.
> 

Ok.

Regards,
Rahul
> Cheers,
> 
> -- 
> Julien Grall
Julien Grall June 30, 2021, 6 p.m. UTC | #3
On 30/06/2021 18:49, Rahul Singh wrote:
> Hi Julien,

Hi,

>> On 30 Jun 2021, at 10:09 am, Julien Grall <julien@xen.org> wrote:
>>
>> Hi Rahul,
>>
>> On 25/06/2021 17:37, Rahul Singh wrote:
>>> SMR allocation should be based on the number of supported stream
>>> matching register for each SMMU device.
>>> Issue introduced by commit 5e08586afbb90b2e2d56c175c07db77a4afa873c
>>> when backported the patches from Linux to XEN to fix the stream match
>>> conflict issue when two devices have the same stream-id.
>>> Acked-by: Stefano Stabellini <sstabellini@kernel.org>
>>> Tested-by: Stefano Stabellini <sstabellini@kernel.org>
>>> Signed-off-by: Rahul Singh <rahul.singh@arm.com>
>>> ---
>>>   xen/drivers/passthrough/arm/smmu.c | 3 ++-
>>>   1 file changed, 2 insertions(+), 1 deletion(-)
>>> diff --git a/xen/drivers/passthrough/arm/smmu.c b/xen/drivers/passthrough/arm/smmu.c
>>> index d9a3a0cbf6..da2cd457d7 100644
>>> --- a/xen/drivers/passthrough/arm/smmu.c
>>> +++ b/xen/drivers/passthrough/arm/smmu.c
>>> @@ -149,6 +149,7 @@ typedef enum irqreturn irqreturn_t;
>>>   #define kzalloc(size, flags)		_xzalloc(size, sizeof(void *))
>>>   #define devm_kzalloc(dev, size, flags)	_xzalloc(size, sizeof(void *))
>>>   #define kmalloc_array(size, n, flags)	_xmalloc_array(size, sizeof(void *), n)
>>> +#define kzalloc_array(size, n, flags)	_xzalloc_array(size, sizeof(void *), n)
>>>     static void __iomem *devm_ioremap_resource(struct device *dev,
>>>   					   struct resource *res)
>>> @@ -2221,7 +2222,7 @@ static int arm_smmu_device_cfg_probe(struct arm_smmu_device *smmu)
>>>   		smmu->smr_mask_mask = smr >> SMR_MASK_SHIFT;
>>>     		/* Zero-initialised to mark as invalid */
>>> -		smmu->smrs = devm_kzalloc(smmu->dev, sizeof(*smmu->smrs), GFP_KERNEL);
>>> +		smmu->smrs = kzalloc_array(sizeof(*smmu->smrs), size, GFP_KERNEL);
>>
>> I noticed this is already in... However, I am a bit puzzled into why this was switched devm_kzalloc() to kzalloc_array(). This doesn't matter for Xen as they are just wrappers to x*alloc() but a mention in the commit message would have been useful.
> 
> Yes we can use the devm_kzalloc(..) but then we have to pass (sizeof(*smmu->smrs) * size ) as size argument to devm_kzalloc(..)
> I thought for better code readability I will use kzalloc_array() as the function name suggests we are allocating memory for an array.

My point is devm_k*alloc() and k*alloc() are quite different on the 
paper. One will allocate memory for a given device while the other is 
unknown memory.

It would have been better to call the function devm_kzalloc_array() to 
keep to keep the code coherent. Can you please send a patch to make the 
switch?

Cheers,
Rahul Singh July 2, 2021, 9:54 a.m. UTC | #4
Hi Julien,

> On 30 Jun 2021, at 7:00 pm, Julien Grall <julien@xen.org> wrote:
> 
> 
> 
> On 30/06/2021 18:49, Rahul Singh wrote:
>> Hi Julien,
> 
> Hi,
> 
>>> On 30 Jun 2021, at 10:09 am, Julien Grall <julien@xen.org> wrote:
>>> 
>>> Hi Rahul,
>>> 
>>> On 25/06/2021 17:37, Rahul Singh wrote:
>>>> SMR allocation should be based on the number of supported stream
>>>> matching register for each SMMU device.
>>>> Issue introduced by commit 5e08586afbb90b2e2d56c175c07db77a4afa873c
>>>> when backported the patches from Linux to XEN to fix the stream match
>>>> conflict issue when two devices have the same stream-id.
>>>> Acked-by: Stefano Stabellini <sstabellini@kernel.org>
>>>> Tested-by: Stefano Stabellini <sstabellini@kernel.org>
>>>> Signed-off-by: Rahul Singh <rahul.singh@arm.com>
>>>> ---
>>>>  xen/drivers/passthrough/arm/smmu.c | 3 ++-
>>>>  1 file changed, 2 insertions(+), 1 deletion(-)
>>>> diff --git a/xen/drivers/passthrough/arm/smmu.c b/xen/drivers/passthrough/arm/smmu.c
>>>> index d9a3a0cbf6..da2cd457d7 100644
>>>> --- a/xen/drivers/passthrough/arm/smmu.c
>>>> +++ b/xen/drivers/passthrough/arm/smmu.c
>>>> @@ -149,6 +149,7 @@ typedef enum irqreturn irqreturn_t;
>>>>  #define kzalloc(size, flags)		_xzalloc(size, sizeof(void *))
>>>>  #define devm_kzalloc(dev, size, flags)	_xzalloc(size, sizeof(void *))
>>>>  #define kmalloc_array(size, n, flags)	_xmalloc_array(size, sizeof(void *), n)
>>>> +#define kzalloc_array(size, n, flags)	_xzalloc_array(size, sizeof(void *), n)
>>>>    static void __iomem *devm_ioremap_resource(struct device *dev,
>>>>  					   struct resource *res)
>>>> @@ -2221,7 +2222,7 @@ static int arm_smmu_device_cfg_probe(struct arm_smmu_device *smmu)
>>>>  		smmu->smr_mask_mask = smr >> SMR_MASK_SHIFT;
>>>>    		/* Zero-initialised to mark as invalid */
>>>> -		smmu->smrs = devm_kzalloc(smmu->dev, sizeof(*smmu->smrs), GFP_KERNEL);
>>>> +		smmu->smrs = kzalloc_array(sizeof(*smmu->smrs), size, GFP_KERNEL);
>>> 
>>> I noticed this is already in... However, I am a bit puzzled into why this was switched devm_kzalloc() to kzalloc_array(). This doesn't matter for Xen as they are just wrappers to x*alloc() but a mention in the commit message would have been useful.
>> Yes we can use the devm_kzalloc(..) but then we have to pass (sizeof(*smmu->smrs) * size ) as size argument to devm_kzalloc(..)
>> I thought for better code readability I will use kzalloc_array() as the function name suggests we are allocating memory for an array.
> 
> My point is devm_k*alloc() and k*alloc() are quite different on the paper. One will allocate memory for a given device while the other is unknown memory.
> 
> It would have been better to call the function devm_kzalloc_array() to keep to keep the code coherent. Can you please send a patch to make the switch?

Ok. I will modify the code as per your request as below . I will use devm_kcalloc(..) as this will be more coherent.

diff --git a/xen/drivers/passthrough/arm/smmu.c b/xen/drivers/passthrough/arm/smmu.c
index da2cd457d7..658c40433c 100644
--- a/xen/drivers/passthrough/arm/smmu.c
+++ b/xen/drivers/passthrough/arm/smmu.c
@@ -149,7 +149,8 @@ typedef enum irqreturn irqreturn_t;
 #define kzalloc(size, flags)           _xzalloc(size, sizeof(void *))
 #define devm_kzalloc(dev, size, flags) _xzalloc(size, sizeof(void *))
 #define kmalloc_array(size, n, flags)  _xmalloc_array(size, sizeof(void *), n)
-#define kzalloc_array(size, n, flags)  _xzalloc_array(size, sizeof(void *), n)
+#define devm_kcalloc(dev, n, size, flags)                      \
+       _xzalloc_array(size, sizeof(void *), n)
 
 static void __iomem *devm_ioremap_resource(struct device *dev,
                                           struct resource *res)
@@ -2222,7 +2223,8 @@ static int arm_smmu_device_cfg_probe(struct arm_smmu_device *smmu)
                smmu->smr_mask_mask = smr >> SMR_MASK_SHIFT;
 
                /* Zero-initialised to mark as invalid */
-               smmu->smrs = kzalloc_array(sizeof(*smmu->smrs), size, GFP_KERNEL);
+               smmu->smrs = devm_kcalloc(smmu->dev, size, sizeof(*smmu->smrs),
+                                                               GFP_KERNEL);
                if (!smmu->smrs)
                        return -ENOMEM;

Regards,
Rahul

> 
> Cheers,
> 
> -- 
> Julien Grall
Julien Grall July 3, 2021, 12:28 p.m. UTC | #5
On 02/07/2021 10:54, Rahul Singh wrote:
> Hi Julien,

Hi Rahul,

>> On 30 Jun 2021, at 7:00 pm, Julien Grall <julien@xen.org> wrote:
>>
>>
>>
>> On 30/06/2021 18:49, Rahul Singh wrote:
>>> Hi Julien,
>>
>> Hi,
>>
>>>> On 30 Jun 2021, at 10:09 am, Julien Grall <julien@xen.org> wrote:
>>>>
>>>> Hi Rahul,
>>>>
>>>> On 25/06/2021 17:37, Rahul Singh wrote:
>>>>> SMR allocation should be based on the number of supported stream
>>>>> matching register for each SMMU device.
>>>>> Issue introduced by commit 5e08586afbb90b2e2d56c175c07db77a4afa873c
>>>>> when backported the patches from Linux to XEN to fix the stream match
>>>>> conflict issue when two devices have the same stream-id.
>>>>> Acked-by: Stefano Stabellini <sstabellini@kernel.org>
>>>>> Tested-by: Stefano Stabellini <sstabellini@kernel.org>
>>>>> Signed-off-by: Rahul Singh <rahul.singh@arm.com>
>>>>> ---
>>>>>   xen/drivers/passthrough/arm/smmu.c | 3 ++-
>>>>>   1 file changed, 2 insertions(+), 1 deletion(-)
>>>>> diff --git a/xen/drivers/passthrough/arm/smmu.c b/xen/drivers/passthrough/arm/smmu.c
>>>>> index d9a3a0cbf6..da2cd457d7 100644
>>>>> --- a/xen/drivers/passthrough/arm/smmu.c
>>>>> +++ b/xen/drivers/passthrough/arm/smmu.c
>>>>> @@ -149,6 +149,7 @@ typedef enum irqreturn irqreturn_t;
>>>>>   #define kzalloc(size, flags)		_xzalloc(size, sizeof(void *))
>>>>>   #define devm_kzalloc(dev, size, flags)	_xzalloc(size, sizeof(void *))
>>>>>   #define kmalloc_array(size, n, flags)	_xmalloc_array(size, sizeof(void *), n)
>>>>> +#define kzalloc_array(size, n, flags)	_xzalloc_array(size, sizeof(void *), n)
>>>>>     static void __iomem *devm_ioremap_resource(struct device *dev,
>>>>>   					   struct resource *res)
>>>>> @@ -2221,7 +2222,7 @@ static int arm_smmu_device_cfg_probe(struct arm_smmu_device *smmu)
>>>>>   		smmu->smr_mask_mask = smr >> SMR_MASK_SHIFT;
>>>>>     		/* Zero-initialised to mark as invalid */
>>>>> -		smmu->smrs = devm_kzalloc(smmu->dev, sizeof(*smmu->smrs), GFP_KERNEL);
>>>>> +		smmu->smrs = kzalloc_array(sizeof(*smmu->smrs), size, GFP_KERNEL);
>>>>
>>>> I noticed this is already in... However, I am a bit puzzled into why this was switched devm_kzalloc() to kzalloc_array(). This doesn't matter for Xen as they are just wrappers to x*alloc() but a mention in the commit message would have been useful.
>>> Yes we can use the devm_kzalloc(..) but then we have to pass (sizeof(*smmu->smrs) * size ) as size argument to devm_kzalloc(..)
>>> I thought for better code readability I will use kzalloc_array() as the function name suggests we are allocating memory for an array.
>>
>> My point is devm_k*alloc() and k*alloc() are quite different on the paper. One will allocate memory for a given device while the other is unknown memory.
>>
>> It would have been better to call the function devm_kzalloc_array() to keep to keep the code coherent. Can you please send a patch to make the switch?
> 
> Ok. I will modify the code as per your request as below . I will use devm_kcalloc(..) as this will be more coherent.
> 
> diff --git a/xen/drivers/passthrough/arm/smmu.c b/xen/drivers/passthrough/arm/smmu.c
> index da2cd457d7..658c40433c 100644
> --- a/xen/drivers/passthrough/arm/smmu.c
> +++ b/xen/drivers/passthrough/arm/smmu.c
> @@ -149,7 +149,8 @@ typedef enum irqreturn irqreturn_t;
>   #define kzalloc(size, flags)           _xzalloc(size, sizeof(void *))
>   #define devm_kzalloc(dev, size, flags) _xzalloc(size, sizeof(void *))
>   #define kmalloc_array(size, n, flags)  _xmalloc_array(size, sizeof(void *), n)
> -#define kzalloc_array(size, n, flags)  _xzalloc_array(size, sizeof(void *), n)
> +#define devm_kcalloc(dev, n, size, flags)                      \
> +       _xzalloc_array(size, sizeof(void *), n)
>   
>   static void __iomem *devm_ioremap_resource(struct device *dev,
>                                             struct resource *res)
> @@ -2222,7 +2223,8 @@ static int arm_smmu_device_cfg_probe(struct arm_smmu_device *smmu)
>                  smmu->smr_mask_mask = smr >> SMR_MASK_SHIFT;
>   
>                  /* Zero-initialised to mark as invalid */
> -               smmu->smrs = kzalloc_array(sizeof(*smmu->smrs), size, GFP_KERNEL);
> +               smmu->smrs = devm_kcalloc(smmu->dev, size, sizeof(*smmu->smrs),
> +                                                               GFP_KERNEL);
>                  if (!smmu->smrs)
>                          return -ENOMEM;

This sounds good to me.

Cheers,
diff mbox series

Patch

diff --git a/xen/drivers/passthrough/arm/smmu.c b/xen/drivers/passthrough/arm/smmu.c
index d9a3a0cbf6..da2cd457d7 100644
--- a/xen/drivers/passthrough/arm/smmu.c
+++ b/xen/drivers/passthrough/arm/smmu.c
@@ -149,6 +149,7 @@  typedef enum irqreturn irqreturn_t;
 #define kzalloc(size, flags)		_xzalloc(size, sizeof(void *))
 #define devm_kzalloc(dev, size, flags)	_xzalloc(size, sizeof(void *))
 #define kmalloc_array(size, n, flags)	_xmalloc_array(size, sizeof(void *), n)
+#define kzalloc_array(size, n, flags)	_xzalloc_array(size, sizeof(void *), n)
 
 static void __iomem *devm_ioremap_resource(struct device *dev,
 					   struct resource *res)
@@ -2221,7 +2222,7 @@  static int arm_smmu_device_cfg_probe(struct arm_smmu_device *smmu)
 		smmu->smr_mask_mask = smr >> SMR_MASK_SHIFT;
 
 		/* Zero-initialised to mark as invalid */
-		smmu->smrs = devm_kzalloc(smmu->dev, sizeof(*smmu->smrs), GFP_KERNEL);
+		smmu->smrs = kzalloc_array(sizeof(*smmu->smrs), size, GFP_KERNEL);
 		if (!smmu->smrs)
 			return -ENOMEM;