Message ID | 1452887025-27285-1-git-send-email-boris.ostrovsky@oracle.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On 15/01/16 19:43, Boris Ostrovsky wrote: > struct gntdev_copy_batch is over 1300 bytes in size, we shouldn't > put it on stack. > > Some compilers (e.g. 5.2.1) complain: > drivers/xen/gntdev.c: In function ‘gntdev_ioctl_grant_copy.isra.5’: > drivers/xen/gntdev.c:949:1: warning: the frame size of 1416 bytes > is larger than 1024 bytes [-Wframe-larger-than=] > > Signed-off-by: Boris Ostrovsky <boris.ostrovsky@oracle.com> > --- > drivers/xen/gntdev.c | 20 +++++++++++++------- > 1 file changed, 13 insertions(+), 7 deletions(-) > > diff --git a/drivers/xen/gntdev.c b/drivers/xen/gntdev.c > index dc49538..43a2c1c 100644 > --- a/drivers/xen/gntdev.c > +++ b/drivers/xen/gntdev.c > @@ -915,15 +915,19 @@ static int gntdev_grant_copy_seg(struct gntdev_copy_batch *batch, > static long gntdev_ioctl_grant_copy(struct gntdev_priv *priv, void __user *u) > { > struct ioctl_gntdev_grant_copy copy; > - struct gntdev_copy_batch batch; > + struct gntdev_copy_batch *batch; > unsigned int i; > int ret = 0; > > if (copy_from_user(©, u, sizeof(copy))) > return -EFAULT; > > - batch.nr_ops = 0; > - batch.nr_pages = 0; > + batch = kmalloc(sizeof(*batch), GFP_KERNEL); > + if (!batch) > + return -ENOMEM; > + > + batch->nr_ops = 0; > + batch->nr_pages = 0; > > for (i = 0; i < copy.count; i++) { > struct gntdev_grant_copy_segment seg; > @@ -933,18 +937,20 @@ static long gntdev_ioctl_grant_copy(struct gntdev_priv *priv, void __user *u) > goto out; > } > > - ret = gntdev_grant_copy_seg(&batch, &seg, ©.segments[i].status); > + ret = gntdev_grant_copy_seg(batch, &seg, > + ©.segments[i].status); > if (ret < 0) > goto out; > > cond_resched(); > } > - if (batch.nr_ops) > - ret = gntdev_copy(&batch); > + if (batch->nr_ops) > + ret = gntdev_copy(batch); You presumably want a kfree() here? > return ret; > > out: > - gntdev_put_pages(&batch); > + gntdev_put_pages(batch); > + kfree(batch); > return ret; > } >
On 01/15/2016 02:50 PM, Andrew Cooper wrote: > On 15/01/16 19:43, Boris Ostrovsky wrote: >> @@ -933,18 +937,20 @@ static long gntdev_ioctl_grant_copy(struct gntdev_priv *priv, void __user *u) >> goto out; >> } >> >> - ret = gntdev_grant_copy_seg(&batch, &seg, ©.segments[i].status); >> + ret = gntdev_grant_copy_seg(batch, &seg, >> + ©.segments[i].status); >> if (ret < 0) >> goto out; >> >> cond_resched(); >> } >> - if (batch.nr_ops) >> - ret = gntdev_copy(&batch); >> + if (batch->nr_ops) >> + ret = gntdev_copy(batch); > You presumably want a kfree() here? Ah, missed it. Thanks. > >> return ret; >>
On 15/01/16 19:43, Boris Ostrovsky wrote: > struct gntdev_copy_batch is over 1300 bytes in size, we shouldn't > put it on stack. > > Some compilers (e.g. 5.2.1) complain: > drivers/xen/gntdev.c: In function ‘gntdev_ioctl_grant_copy.isra.5’: > drivers/xen/gntdev.c:949:1: warning: the frame size of 1416 bytes > is larger than 1024 bytes [-Wframe-larger-than=] I thought I'd already reduced the size of this enough (from a batch size of 32 to 24) but this obviously isn't enough for 64-bit platforms. In the absence of any performance data on the best approach I would prefer just reducing the batch size to 16. David
On 01/18/2016 06:11 AM, David Vrabel wrote: > On 15/01/16 19:43, Boris Ostrovsky wrote: >> struct gntdev_copy_batch is over 1300 bytes in size, we shouldn't >> put it on stack. >> >> Some compilers (e.g. 5.2.1) complain: >> drivers/xen/gntdev.c: In function ‘gntdev_ioctl_grant_copy.isra.5’: >> drivers/xen/gntdev.c:949:1: warning: the frame size of 1416 bytes >> is larger than 1024 bytes [-Wframe-larger-than=] > I thought I'd already reduced the size of this enough (from a batch size > of 32 to 24) but this obviously isn't enough for 64-bit platforms. > > In the absence of any performance data on the best approach I would > prefer just reducing the batch size to 16. That would still leave us with over 900 bytes on the stack which I think is rather high. Do we expect this ioctl to be on some sort of a hot path? -boris
On 19/01/16 14:26, Boris Ostrovsky wrote: > On 01/18/2016 06:11 AM, David Vrabel wrote: >> On 15/01/16 19:43, Boris Ostrovsky wrote: >>> struct gntdev_copy_batch is over 1300 bytes in size, we shouldn't >>> put it on stack. >>> >>> Some compilers (e.g. 5.2.1) complain: >>> drivers/xen/gntdev.c: In function ‘gntdev_ioctl_grant_copy.isra.5’: >>> drivers/xen/gntdev.c:949:1: warning: the frame size of 1416 bytes >>> is larger than 1024 bytes [-Wframe-larger-than=] >> I thought I'd already reduced the size of this enough (from a batch size >> of 32 to 24) but this obviously isn't enough for 64-bit platforms. >> >> In the absence of any performance data on the best approach I would >> prefer just reducing the batch size to 16. > > That would still leave us with over 900 bytes on the stack which I think > is rather high. The stack depth to here isn't very deep, so I think even the ~1500 byte frame was fine. > Do we expect this ioctl to be on some sort of a hot path? Yes. David
diff --git a/drivers/xen/gntdev.c b/drivers/xen/gntdev.c index dc49538..43a2c1c 100644 --- a/drivers/xen/gntdev.c +++ b/drivers/xen/gntdev.c @@ -915,15 +915,19 @@ static int gntdev_grant_copy_seg(struct gntdev_copy_batch *batch, static long gntdev_ioctl_grant_copy(struct gntdev_priv *priv, void __user *u) { struct ioctl_gntdev_grant_copy copy; - struct gntdev_copy_batch batch; + struct gntdev_copy_batch *batch; unsigned int i; int ret = 0; if (copy_from_user(©, u, sizeof(copy))) return -EFAULT; - batch.nr_ops = 0; - batch.nr_pages = 0; + batch = kmalloc(sizeof(*batch), GFP_KERNEL); + if (!batch) + return -ENOMEM; + + batch->nr_ops = 0; + batch->nr_pages = 0; for (i = 0; i < copy.count; i++) { struct gntdev_grant_copy_segment seg; @@ -933,18 +937,20 @@ static long gntdev_ioctl_grant_copy(struct gntdev_priv *priv, void __user *u) goto out; } - ret = gntdev_grant_copy_seg(&batch, &seg, ©.segments[i].status); + ret = gntdev_grant_copy_seg(batch, &seg, + ©.segments[i].status); if (ret < 0) goto out; cond_resched(); } - if (batch.nr_ops) - ret = gntdev_copy(&batch); + if (batch->nr_ops) + ret = gntdev_copy(batch); return ret; out: - gntdev_put_pages(&batch); + gntdev_put_pages(batch); + kfree(batch); return ret; }
struct gntdev_copy_batch is over 1300 bytes in size, we shouldn't put it on stack. Some compilers (e.g. 5.2.1) complain: drivers/xen/gntdev.c: In function ‘gntdev_ioctl_grant_copy.isra.5’: drivers/xen/gntdev.c:949:1: warning: the frame size of 1416 bytes is larger than 1024 bytes [-Wframe-larger-than=] Signed-off-by: Boris Ostrovsky <boris.ostrovsky@oracle.com> --- drivers/xen/gntdev.c | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-)