Hi Julien

> -----Original Message-----
> From: Julien Grall <jul...@xen.org>
> Sent: Saturday, July 16, 2022 2:10 AM
> To: Penny Zheng <penny.zh...@arm.com>; xen-devel@lists.xenproject.org
> Cc: Wei Chen <wei.c...@arm.com>; Stefano Stabellini
> <sstabell...@kernel.org>; Bertrand Marquis <bertrand.marq...@arm.com>;
> Volodymyr Babchuk <volodymyr_babc...@epam.com>
> Subject: Re: [PATCH v5 1/8] xen/arm: introduce static shared memory
> 
> Hi Penny,
> 
> On 29/06/2022 09:39, Penny Zheng wrote:
> >>> +    for ( i = 0; i < mem->nr_banks; i++ )
> >>> +    {
> >>> +        /*
> >>> +         * A static shared memory region could be shared between multiple
> >>> +         * domains.
> >>> +         */
> >>> +        if ( paddr == mem->bank[i].start && size == mem->bank[i].size )
> >>> +            break;
> >
> > Maybe I need to add a check on shm-id:
> > "
> >          /*
> >           * A static shared memory region could be shared between multiple
> >           * domains.
> >           */
> >          if ( strcmp(shm_id, mem->bank[i].shm_id) == 0 )
> >          {
> >              if ( paddr == mem->bank[i].start && size == mem->bank[i].size )
> >                  break;
> >              else
> >              {
> >                  printk("Warning: xen,shm-id %s does not match for all the 
> > nodes
> using the same region.\n",
> >                         shm_id);
> >                  return -EINVAL;
> >              }
> >          }
> > "
> > Wdyt?
> 
> AFAICT, this would allow to region to overlap if they have different shm ID. I
> am not entirely sure the rest of your code would work properly in this case
> (what if the owner is different).
> 
> So I think we need the following checks:
>    1) The shm ID matches *and* the region exactly match
>    2) The shm ID doesn't match and the region doesn't overlap with an
> existing one
> 

Understood, true, the overlap shall also be checked.
"
@@ -451,6 +453,31 @@ static int __init process_shm_node(const void *fdt, int 
node,
                 return -EINVAL;
             }
         }
+        else
+        {
+            paddr_t end = paddr + size;
+            paddr_t bank_end = mem->bank[i].start + mem->bank[i].size;
+
+            if ( (paddr < mem->bank[i].start && end <= mem->bank[i].start) ||
+                 (paddr >= bank_end && end > bank_end) )
+            {
+                if ( strncmp(shm_id, mem->bank[i].shm_id,
+                             MAX_SHM_ID_LENGTH) != 0 )
+                    break;
+                else
+                {
+                    printk("fdt: different shared memory region could not 
share the same shm ID %s\n",
+                           shm_id);
+                    return -EINVAL;
+                }
+            }
+            else
+            {
+                printk("fdt: shared memory region overlap with an existing 
entry %#"PRIpaddr" - %#"PRIpaddr"\n",
+                        mem->bank[i].start, bank_end);
+                return -EINVAL;
+            }
+        }
     }

     if ( i == mem->nr_banks )
"

> Cheers,
> 
> --
> Julien Grall

Reply via email to