From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755369AbcAOTuW (ORCPT ); Fri, 15 Jan 2016 14:50:22 -0500 Received: from smtp.citrix.com ([66.165.176.89]:39580 "EHLO SMTP.CITRIX.COM" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754343AbcAOTuT (ORCPT ); Fri, 15 Jan 2016 14:50:19 -0500 X-IronPort-AV: E=Sophos;i="5.22,301,1449532800"; d="scan'208";a="325483870" Subject: Re: [Xen-devel] [PATCH] xen/gntdev: Don't allocate struct gntdev_copy_batch on stack To: Boris Ostrovsky , , References: <1452887025-27285-1-git-send-email-boris.ostrovsky@oracle.com> CC: , From: Andrew Cooper Message-ID: <56994D79.1010702@citrix.com> Date: Fri, 15 Jan 2016 19:50:17 +0000 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Icedove/38.5.0 MIME-Version: 1.0 In-Reply-To: <1452887025-27285-1-git-send-email-boris.ostrovsky@oracle.com> Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 8bit X-DLP: MIA2 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 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 > --- > 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; > } >