On Thu, Jan 13, 2022 at 9:12 AM Peter Xu <pet...@redhat.com> wrote: > > On Thu, Jan 13, 2022 at 10:42:39AM +0000, Daniel P. Berrangé wrote: > > On Thu, Jan 13, 2022 at 06:34:12PM +0800, Peter Xu wrote: > > > On Thu, Jan 13, 2022 at 10:06:14AM +0000, Daniel P. Berrangé wrote: > > > > On Thu, Jan 13, 2022 at 02:48:15PM +0800, Peter Xu wrote: > > > > > On Thu, Jan 06, 2022 at 07:13:39PM -0300, Leonardo Bras wrote: > > > > > > @@ -558,15 +575,26 @@ static ssize_t > > > > > > qio_channel_socket_writev(QIOChannel *ioc, > > > > > > memcpy(CMSG_DATA(cmsg), fds, fdsize); > > > > > > } > > > > > > > > > > > > + if (flags & QIO_CHANNEL_WRITE_FLAG_ZERO_COPY) { > > > > > > + sflags = MSG_ZEROCOPY; > > > > > > + } > > > > > > + > > > > > > retry: > > > > > > - ret = sendmsg(sioc->fd, &msg, 0); > > > > > > + ret = sendmsg(sioc->fd, &msg, sflags); > > > > > > if (ret <= 0) { > > > > > > - if (errno == EAGAIN) { > > > > > > + switch (errno) { > > > > > > + case EAGAIN: > > > > > > return QIO_CHANNEL_ERR_BLOCK; > > > > > > - } > > > > > > - if (errno == EINTR) { > > > > > > + case EINTR: > > > > > > goto retry; > > > > > > + case ENOBUFS: > > > > > > + if (sflags & MSG_ZEROCOPY) { > > > > > > + error_setg_errno(errp, errno, > > > > > > + "Process can't lock enough memory > > > > > > for using MSG_ZEROCOPY"); > > > > > > + return -1; > > > > > > + } > > > > > > > > > > I have no idea whether it'll make a real differnece, but - should we > > > > > better add > > > > > a "break" here? If you agree and with that fixed, feel free to add: > > > > > > > > > > Reviewed-by: Peter Xu <pet...@redhat.com> > > > > > > > > > > I also wonder whether you hit ENOBUFS in any of the environments. On > > > > > Fedora > > > > > here it's by default unlimited, but just curious when we should keep > > > > > an eye. > > > > > > > > Fedora doesn't allow unlimited locked memory by default > > > > > > > > $ grep "locked memory" /proc/self/limits > > > > Max locked memory 65536 65536 > > > > bytes > > > > > > > > And regardless of Fedora defaults, libvirt will set a limit > > > > for the guest. It will only be unlimited if requiring certain > > > > things like VFIO. > > > > > > Thanks, I obviously checked up the wrong host.. > > > > > > Leo, do you know how much locked memory will be needed by zero copy? Will > > > there be a limit? Is it linear to the number of sockets/channels? > > > > IIRC we decided it would be limited by the socket send buffer size, rather > > than guest RAM, because writes will block once the send buffer is full. > > > > This has a default global setting, with per-socket override. On one box I > > have it is 200 Kb. With multifd you'll need "num-sockets * send buffer". > > > > > It'll be better if we can fail at enabling the feature when we detected > > > that > > > the specified locked memory limit may not be suffice. > > > > Checking this value against available locked memory though will always > > have an error margin because other things in QEMU can use locked memory > > too > > We could always still allow false positive in this check, so we can fail if we > have a solid clue to know we'll fail later (e.g. minimum locked_vm needed is > already less than total). But no strong opinion; we could have this merged > and > see whether that's needed in real life. Thanks,
I agree, this is a good approach. Leo