[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH] xen/arm: smmuv1: Fixed stream matching register allocation



On 02/07/2021 10:54, Rahul Singh wrote:
Hi Julien,

Hi Rahul,

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;

This sounds good to me.

Cheers,

--
Julien Grall



 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.