| 
    
 [Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH] xen/arm: smmuv1: Fixed stream matching register allocation
 Hi Julien,
> On 30 Jun 2021, at 7:00 pm, Julien Grall <julien@xxxxxxx> wrote:
> 
> 
> 
> On 30/06/2021 18:49, Rahul Singh wrote:
>> Hi Julien,
> 
> Hi,
> 
>>> On 30 Jun 2021, at 10:09 am, Julien Grall <julien@xxxxxxx> 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@xxxxxxxxxx>
>>>> Tested-by: Stefano Stabellini <sstabellini@xxxxxxxxxx>
>>>> Signed-off-by: Rahul Singh <rahul.singh@xxxxxxx>
>>>> ---
>>>>  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
 
  | 
  
![]()  | 
            
         Lists.xenproject.org is hosted with RackSpace, monitoring our  |