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@xxxxxxxxxx> > --- > 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@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html