diff mbox series

tools/libxengnttab: correct size of allocated memory

Message ID 20200520083501.31704-1-jgross@suse.com (mailing list archive)
State New, archived
Headers show
Series tools/libxengnttab: correct size of allocated memory | expand

Commit Message

Jürgen Groß May 20, 2020, 8:35 a.m. UTC
The size of the memory allocated for the IOCTL_GNTDEV_MAP_GRANT_REF
ioctl() parameters is calculated wrong, which results in too much
memory allocated.

Signed-off-by: Juergen Gross <jgross@suse.com>
---
 tools/libs/gnttab/freebsd.c | 2 +-
 tools/libs/gnttab/linux.c   | 8 +++-----
 2 files changed, 4 insertions(+), 6 deletions(-)

Comments

Ian Jackson May 20, 2020, 2:49 p.m. UTC | #1
Juergen Gross writes ("[PATCH] tools/libxengnttab: correct size of allocated memory"):
> The size of the memory allocated for the IOCTL_GNTDEV_MAP_GRANT_REF
> ioctl() parameters is calculated wrong, which results in too much
> memory allocated.

Added Roger to CC.

Firstly,

Reviewed-by: Ian Jackson <ian.jackson@eu.citrix.com>

Thank you.


But, looking at this code, why on earth what the ?

The FreeBSD code checks to see if it's less than a page and if so uses
malloc and otherwise uses mmap !  Why not unconditionally use malloc ?

Likewise, the Linux code has its own mmap-based memory-obtainer.  ISTM
that malloc is probably going to be better.  Often it will be able to
give out even a substantial amount without making a syscall.

Essentially, we have two (similar but not identical) tiny custom
memory allocators here.  Also, the Linux and FreeBSD code are
remarkably similar which bothers me.

Anyway, these observations are no criticism of Juergen's patch.

Regards,
Ian.
Roger Pau Monne May 20, 2020, 3:56 p.m. UTC | #2
On Wed, May 20, 2020 at 03:49:59PM +0100, Ian Jackson wrote:
> Juergen Gross writes ("[PATCH] tools/libxengnttab: correct size of allocated memory"):
> > The size of the memory allocated for the IOCTL_GNTDEV_MAP_GRANT_REF
> > ioctl() parameters is calculated wrong, which results in too much
> > memory allocated.
> 
> Added Roger to CC.
> 
> Firstly,
> 
> Reviewed-by: Ian Jackson <ian.jackson@eu.citrix.com>

For the FreeBSD bits:

Reviewed-by: Roger Pau Monné <roger.pau@citrix.com>

> 
> Thank you.
> 
> 
> But, looking at this code, why on earth what the ?
> 
> The FreeBSD code checks to see if it's less than a page and if so uses
> malloc and otherwise uses mmap !  Why not unconditionally use malloc ?
> 
> Likewise, the Linux code has its own mmap-based memory-obtainer.  ISTM
> that malloc is probably going to be better.  Often it will be able to
> give out even a substantial amount without making a syscall.
> 
> Essentially, we have two (similar but not identical) tiny custom
> memory allocators here.  Also, the Linux and FreeBSD code are
> remarkably similar which bothers me.

Right. This is due to the FreeBSD file being mostly a clone of the
Linux one. I agree the duplication could be abstracted away.

I really have no idea why malloc or mmap is used, maybe at some point
requesting regions > PAGE_SIZE was considered faster using mmap
directly?

Thanks, Roger.
Jürgen Groß June 11, 2020, 3:25 p.m. UTC | #3
On 20.05.20 17:56, Roger Pau Monné wrote:
> On Wed, May 20, 2020 at 03:49:59PM +0100, Ian Jackson wrote:
>> Juergen Gross writes ("[PATCH] tools/libxengnttab: correct size of allocated memory"):
>>> The size of the memory allocated for the IOCTL_GNTDEV_MAP_GRANT_REF
>>> ioctl() parameters is calculated wrong, which results in too much
>>> memory allocated.
>>
>> Added Roger to CC.
>>
>> Firstly,
>>
>> Reviewed-by: Ian Jackson <ian.jackson@eu.citrix.com>
> 
> For the FreeBSD bits:
> 
> Reviewed-by: Roger Pau Monné <roger.pau@citrix.com>

Any reason the patch didn't go in yet?


Juergen
Paul Durrant June 11, 2020, 4:02 p.m. UTC | #4
> -----Original Message-----
> From: Xen-devel <xen-devel-bounces@lists.xenproject.org> On Behalf Of Jürgen Groß
> Sent: 11 June 2020 16:26
> To: Roger Pau Monné <roger.pau@citrix.com>; Ian Jackson <ian.jackson@citrix.com>
> Cc: xen-devel@lists.xenproject.org; Wei Liu <wl@xen.org>
> Subject: Re: [PATCH] tools/libxengnttab: correct size of allocated memory
> 
> On 20.05.20 17:56, Roger Pau Monné wrote:
> > On Wed, May 20, 2020 at 03:49:59PM +0100, Ian Jackson wrote:
> >> Juergen Gross writes ("[PATCH] tools/libxengnttab: correct size of allocated memory"):
> >>> The size of the memory allocated for the IOCTL_GNTDEV_MAP_GRANT_REF
> >>> ioctl() parameters is calculated wrong, which results in too much
> >>> memory allocated.
> >>
> >> Added Roger to CC.
> >>
> >> Firstly,
> >>
> >> Reviewed-by: Ian Jackson <ian.jackson@eu.citrix.com>
> >
> > For the FreeBSD bits:
> >
> > Reviewed-by: Roger Pau Monné <roger.pau@citrix.com>
> 
> Any reason the patch didn't go in yet?
> 

I'd be quite happy for this to go in now, consider it

Release-acked-by: Paul Durrant <paul@xen.org>

> 
> Juergen
Ian Jackson June 15, 2020, 2:07 p.m. UTC | #5
Paul Durrant writes ("RE: [PATCH] tools/libxengnttab: correct size of allocated memory"):
> > -----Original Message-----
> > From: Xen-devel <xen-devel-bounces@lists.xenproject.org> On Behalf Of Jürgen Groß
> > Sent: 11 June 2020 16:26
> > To: Roger Pau Monné <roger.pau@citrix.com>; Ian Jackson <ian.jackson@citrix.com>
> > Cc: xen-devel@lists.xenproject.org; Wei Liu <wl@xen.org>
> > Subject: Re: [PATCH] tools/libxengnttab: correct size of allocated memory
> > 
> > On 20.05.20 17:56, Roger Pau Monné wrote:
> > > On Wed, May 20, 2020 at 03:49:59PM +0100, Ian Jackson wrote:
> > >> Juergen Gross writes ("[PATCH] tools/libxengnttab: correct size of allocated memory"):
> > >>> The size of the memory allocated for the IOCTL_GNTDEV_MAP_GRANT_REF
> > >>> ioctl() parameters is calculated wrong, which results in too much
> > >>> memory allocated.
> > >>
> > >> Added Roger to CC.
> > >>
> > >> Firstly,
> > >>
> > >> Reviewed-by: Ian Jackson <ian.jackson@eu.citrix.com>
> > >
> > > For the FreeBSD bits:
> > >
> > > Reviewed-by: Roger Pau Monné <roger.pau@citrix.com>
> > 
> > Any reason the patch didn't go in yet?
> > 
> 
> I'd be quite happy for this to go in now, consider it
> 
> Release-acked-by: Paul Durrant <paul@xen.org>

Thanks.  I tried to apply this but it doesn't seem to apply to
staging.  Jürgen, would you care to rebase/resend ?

Thanks,
Ian.
Andrew Cooper June 15, 2020, 2:09 p.m. UTC | #6
On 15/06/2020 15:07, Ian Jackson wrote:
> Paul Durrant writes ("RE: [PATCH] tools/libxengnttab: correct size of allocated memory"):
>>> -----Original Message-----
>>> From: Xen-devel <xen-devel-bounces@lists.xenproject.org> On Behalf Of Jürgen Groß
>>> Sent: 11 June 2020 16:26
>>> To: Roger Pau Monné <roger.pau@citrix.com>; Ian Jackson <ian.jackson@citrix.com>
>>> Cc: xen-devel@lists.xenproject.org; Wei Liu <wl@xen.org>
>>> Subject: Re: [PATCH] tools/libxengnttab: correct size of allocated memory
>>>
>>> On 20.05.20 17:56, Roger Pau Monné wrote:
>>>> On Wed, May 20, 2020 at 03:49:59PM +0100, Ian Jackson wrote:
>>>>> Juergen Gross writes ("[PATCH] tools/libxengnttab: correct size of allocated memory"):
>>>>>> The size of the memory allocated for the IOCTL_GNTDEV_MAP_GRANT_REF
>>>>>> ioctl() parameters is calculated wrong, which results in too much
>>>>>> memory allocated.
>>>>> Added Roger to CC.
>>>>>
>>>>> Firstly,
>>>>>
>>>>> Reviewed-by: Ian Jackson <ian.jackson@eu.citrix.com>
>>>> For the FreeBSD bits:
>>>>
>>>> Reviewed-by: Roger Pau Monné <roger.pau@citrix.com>
>>> Any reason the patch didn't go in yet?
>>>
>> I'd be quite happy for this to go in now, consider it
>>
>> Release-acked-by: Paul Durrant <paul@xen.org>
> Thanks.  I tried to apply this but it doesn't seem to apply to
> staging.  Jürgen, would you care to rebase/resend ?

I already committed it, seeing as it was fully acked.

https://xenbits.xen.org/gitweb/?p=xen.git;a=commitdiff;h=aad20e538d7ba0e36f5ed8d2bebb74096e3a6d7f

~Andrew
Ian Jackson June 15, 2020, 2:57 p.m. UTC | #7
Andrew Cooper writes ("Re: [PATCH] tools/libxengnttab: correct size of allocated memory"):
> I already committed it, seeing as it was fully acked.
> 
> https://xenbits.xen.org/gitweb/?p=xen.git;a=commitdiff;h=aad20e538d7ba0e36f5ed8d2bebb74096e3a6d7f

That must be why it didn't apply :-).

Thanks,
Ian.
diff mbox series

Patch

diff --git a/tools/libs/gnttab/freebsd.c b/tools/libs/gnttab/freebsd.c
index 886b588303..0588501d0f 100644
--- a/tools/libs/gnttab/freebsd.c
+++ b/tools/libs/gnttab/freebsd.c
@@ -74,7 +74,7 @@  void *osdep_gnttab_grant_map(xengnttab_handle *xgt,
     void *addr = NULL;
     int domids_stride;
     unsigned int refs_size = ROUNDUP(count *
-                                     sizeof(struct ioctl_gntdev_map_grant_ref),
+                                     sizeof(struct ioctl_gntdev_grant_ref),
                                      PAGE_SHIFT);
 
     domids_stride = (flags & XENGNTTAB_GRANT_MAP_SINGLE_DOMAIN) ? 0 : 1;
diff --git a/tools/libs/gnttab/linux.c b/tools/libs/gnttab/linux.c
index a01bb6c698..74331a4c7b 100644
--- a/tools/libs/gnttab/linux.c
+++ b/tools/libs/gnttab/linux.c
@@ -91,9 +91,7 @@  void *osdep_gnttab_grant_map(xengnttab_handle *xgt,
 {
     int fd = xgt->fd;
     struct ioctl_gntdev_map_grant_ref *map;
-    unsigned int map_size = ROUNDUP((sizeof(*map) + (count - 1) *
-                                    sizeof(struct ioctl_gntdev_map_grant_ref)),
-                                    PAGE_SHIFT);
+    unsigned int map_size = sizeof(*map) + (count - 1) * sizeof(map->refs[0]);
     void *addr = NULL;
     int domids_stride = 1;
     int i;
@@ -102,10 +100,10 @@  void *osdep_gnttab_grant_map(xengnttab_handle *xgt,
         domids_stride = 0;
 
     if ( map_size <= PAGE_SIZE )
-        map = alloca(sizeof(*map) +
-                     (count - 1) * sizeof(struct ioctl_gntdev_map_grant_ref));
+        map = alloca(map_size);
     else
     {
+        map_size = ROUNDUP(map_size, PAGE_SHIFT);
         map = mmap(NULL, map_size, PROT_READ | PROT_WRITE,
                    MAP_PRIVATE | MAP_ANON | MAP_POPULATE, -1, 0);
         if ( map == MAP_FAILED )