Message ID | 1367562318-11989-4-git-send-email-asias@redhat.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Fri, May 03, 2013 at 02:25:17PM +0800, Asias He wrote: > Free ubuf when vhost_dev_ioctl for VHOST_SET_OWNER fails. > > Signed-off-by: Asias He <asias@redhat.com> > --- > drivers/vhost/net.c | 20 ++++++++++++++++++-- > 1 file changed, 18 insertions(+), 2 deletions(-) > > diff --git a/drivers/vhost/net.c b/drivers/vhost/net.c > index b2f6b41..eb73217 100644 > --- a/drivers/vhost/net.c > +++ b/drivers/vhost/net.c > @@ -152,6 +152,19 @@ void vhost_ubuf_put_and_wait(struct vhost_ubuf_ref *ubufs) > kfree(ubufs); > } > > +static void vhost_net_clear_ubuf_info(struct vhost_net *n) > +{ > + > + bool zcopy; > + int i; > + > + for (i = 0; i < n->dev.nvqs; ++i) { > + zcopy = vhost_zcopy_mask & (0x1 << i); > + if (zcopy) > + kfree(n->vqs[i].ubuf_info); > + } > +} > + > int vhost_net_set_ubuf_info(struct vhost_net *n) > { > bool zcopy; > @@ -1069,10 +1082,13 @@ static long vhost_net_ioctl(struct file *f, unsigned int ioctl, > goto out; > } > r = vhost_dev_ioctl(&n->dev, ioctl, argp); > - if (r == -ENOIOCTLCMD) > + if (r == -ENOIOCTLCMD) { > r = vhost_vring_ioctl(&n->dev, ioctl, argp); > - else > + } else { > + if (r < 0 && ioctl == VHOST_SET_OWNER) > + vhost_net_clear_ubuf_info(n); > vhost_net_flush(n); > + } This is becoming too complex. Let's just export vhost_dev_set_owner from vhost.c and have a separate case statement for VHOST_SET_OWNER. Also - could you please send a separate series with bugfixes, so I can apply for 3.10? Cleanups I will queue for 3.11. Thanks! > out: > mutex_unlock(&n->dev.mutex); > return r; > -- > 1.8.1.4 -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On Sun, May 05, 2013 at 04:50:07PM +0300, Michael S. Tsirkin wrote: > On Fri, May 03, 2013 at 02:25:17PM +0800, Asias He wrote: > > Free ubuf when vhost_dev_ioctl for VHOST_SET_OWNER fails. > > > > Signed-off-by: Asias He <asias@redhat.com> > > --- > > drivers/vhost/net.c | 20 ++++++++++++++++++-- > > 1 file changed, 18 insertions(+), 2 deletions(-) > > > > diff --git a/drivers/vhost/net.c b/drivers/vhost/net.c > > index b2f6b41..eb73217 100644 > > --- a/drivers/vhost/net.c > > +++ b/drivers/vhost/net.c > > @@ -152,6 +152,19 @@ void vhost_ubuf_put_and_wait(struct vhost_ubuf_ref *ubufs) > > kfree(ubufs); > > } > > > > +static void vhost_net_clear_ubuf_info(struct vhost_net *n) > > +{ > > + > > + bool zcopy; > > + int i; > > + > > + for (i = 0; i < n->dev.nvqs; ++i) { > > + zcopy = vhost_zcopy_mask & (0x1 << i); > > + if (zcopy) > > + kfree(n->vqs[i].ubuf_info); > > + } > > +} > > + > > int vhost_net_set_ubuf_info(struct vhost_net *n) > > { > > bool zcopy; > > @@ -1069,10 +1082,13 @@ static long vhost_net_ioctl(struct file *f, unsigned int ioctl, > > goto out; > > } > > r = vhost_dev_ioctl(&n->dev, ioctl, argp); > > - if (r == -ENOIOCTLCMD) > > + if (r == -ENOIOCTLCMD) { > > r = vhost_vring_ioctl(&n->dev, ioctl, argp); > > - else > > + } else { > > + if (r < 0 && ioctl == VHOST_SET_OWNER) > > + vhost_net_clear_ubuf_info(n); > > vhost_net_flush(n); > > + } > > This is becoming too complex. > Let's just export vhost_dev_set_owner from vhost.c > and have a separate case statement for VHOST_SET_OWNER. done. > > Also - could you please send a separate series > with bugfixes, so I can apply for 3.10? > Cleanups I will queue for 3.11. done. > Thanks! > > > out: > > mutex_unlock(&n->dev.mutex); > > return r; > > -- > > 1.8.1.4
diff --git a/drivers/vhost/net.c b/drivers/vhost/net.c index b2f6b41..eb73217 100644 --- a/drivers/vhost/net.c +++ b/drivers/vhost/net.c @@ -152,6 +152,19 @@ void vhost_ubuf_put_and_wait(struct vhost_ubuf_ref *ubufs) kfree(ubufs); } +static void vhost_net_clear_ubuf_info(struct vhost_net *n) +{ + + bool zcopy; + int i; + + for (i = 0; i < n->dev.nvqs; ++i) { + zcopy = vhost_zcopy_mask & (0x1 << i); + if (zcopy) + kfree(n->vqs[i].ubuf_info); + } +} + int vhost_net_set_ubuf_info(struct vhost_net *n) { bool zcopy; @@ -1069,10 +1082,13 @@ static long vhost_net_ioctl(struct file *f, unsigned int ioctl, goto out; } r = vhost_dev_ioctl(&n->dev, ioctl, argp); - if (r == -ENOIOCTLCMD) + if (r == -ENOIOCTLCMD) { r = vhost_vring_ioctl(&n->dev, ioctl, argp); - else + } else { + if (r < 0 && ioctl == VHOST_SET_OWNER) + vhost_net_clear_ubuf_info(n); vhost_net_flush(n); + } out: mutex_unlock(&n->dev.mutex); return r;
Free ubuf when vhost_dev_ioctl for VHOST_SET_OWNER fails. Signed-off-by: Asias He <asias@redhat.com> --- drivers/vhost/net.c | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-)