From: Yuanhan Liu <yuanhan.liu@linux.intel.com>
To: "Tan, Jianfeng" <jianfeng.tan@intel.com>
Cc: dev@dpdk.org, zhihong.wang@intel.com, lining18@jd.com
Subject: Re: [PATCH 2/3] net/virtio_user: fix wrong sequence of messages
Date: Fri, 9 Sep 2016 12:19:49 +0800 [thread overview]
Message-ID: <20160909041949.GP23158@yliu-dev.sh.intel.com> (raw)
In-Reply-To: <11291eac-cbbe-7080-3d35-bdacb5341d89@intel.com>
On Fri, Sep 09, 2016 at 11:59:18AM +0800, Tan, Jianfeng wrote:
> It's actually a good catch. After a light thought, I think in DPDK vhost, we
> may need to create those virtqueues once unix socket gets connected, just
> like in vhost-net, virtqueues are created on char file open. Right?
>
> There is a difference: for vhost-net and tap mode, IIRC, it knows how
> many queues before doing setup.
>
> No, from linux/drivers/vhost/net.c:vhost_net_open(), we can see that
> virtqueues are allocated according to VHOST_NET_VQ_MAX.
>
> Well, if you took a closer look, you will find VHOST_NET_VQ_MAX is
> defined to 2. That means it allocates a queue-pair only.
>
> And FYI, the MQ support for vhost-net is actually done in the tap
> driver, but not in vhost-net driver. That results to the MQ
> implementation is a bit different between vhost-net and vhost-user.
>
> Put simply, in vhost-net, one queue-pair has a backend fd associated
> with it. Vhost requests for different queue-pair are sent by different
> fd. That also means the vhost-net doesn't even need be aware of the
> MQ stuff.
>
> However, for vhost-user implementation, all queue-pairs share one
> socket fd. All requests all also sent over the single socket fd,
> thus the backend (DPDK vhost) has to figure out how many queue
> pairs are actually enabled: and we detect it by reading the
> vring index of SET_VRING_CALL message; it's not quite right though.
>
>
> Aha, right, nice analysis.
Just some rough memory in my mind ;-)
>
>
>
> How about reconsidering previous suggestion to allocate vq once connection
> is established?
>
> That's too much, because DPDK claims to support up to 0x8000
> queue-pairs. Don't even to say that the vhost_virtqueue struct
> was way too big before: it even holds an array of buf_vec with
> size 256.
>
>
> Another mistake of my memory, I was remember it wrongly as only 8 VQs are
> supported.
> One thing not related, provided that VHOST_MAX_QUEUE_PAIRS equals to 0x8000,
> struct vhost_virtqueue *virtqueue[VHOST_MAX_QUEUE_PAIRS * 2] spends 4MB for
> each virtio device, which could be a refined.
Yes, we could allocate a small array first, and then re-allocate if
necessary.
>
>
>
> Never mind, above fix on the vhost side will not take effect on existing
> vpp-vhost implementations.
>
> Actually, I was talking about the DPDK vhost implementation :)
>
>
> This patch is talking about vpp's native vhost implementation, not dpdk-vhost,
> and not the way vpp uses dpdk-vhost.
Yes, I know. What I meant is there was a "workaround" in DPDK vhost
implementation, and since you bring this issue on the table again,
it's a chance to think about how can we fix it.
A rough idea come to my mind is we could check all the per-vring message
at the begining of vhost_user_msg_handler() and allocate related vq when
necessary (when it's the first vring message we got).
Yeah, I know it's a bit ugly, but it at least gets rid of that "not-that-true"
assumption.
>
> Still not working. VPP needs SET_VRING_CALL to create vq firstly.
>
> Didn't get it. In the proposal, SET_FEATURES is sent before every other
> messages, thus it should not cause the issue you described in this patch.
>
>
> OK. Let me try to explain. We take three vhost implementations into
> consideration: dpdk-2.2-vhost, dpdk-master-vhost, vpp-native-vhost.
>
> If set_feature before set_vring_call, dpdk-2.2-vhost will fail: inside
> set_feature handler, assigning header length to VQs which will be created in
> set_vring_call handler.
Oh, right. That was an in-correct implementation.
> So we need to keep set_vring_call firstly.
> Then set_feature needs to be sent
> before any other msgs, this is what vpp-native-vhost requires. In all, the
> sequence is like this:
> 1. set_vring_call,
> 2. set_feature,
> 3. other msgs
>
>
> Besides, haven't we already sent SET_VRING_CALL before other messages
> (well, execept the SET_FEATURES and SET_MEM_TABLE message)?
>
>
> Yes, set_vring_call is already in the first place, but we need to plugin
> set_feature between set_vring_call and other msgs. Previously, set_vring_call
> and other msgs are together.
Okay. Another thing I noticed is that virtio-user lacks some feature
negotiations, like GET_FEATURES and GET_PROTOCOL_FEATURES. I think you
might need add them back somewhen?
--yliu
next prev parent reply other threads:[~2016-09-09 4:19 UTC|newest]
Thread overview: 26+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-08-05 11:36 [PATCH 0/3] fix virtio_user issues Jianfeng Tan
2016-08-05 11:36 ` [PATCH 1/3] net/virtio_user: fix queue pair not enabled Jianfeng Tan
2016-09-06 6:30 ` Yuanhan Liu
2016-08-05 11:36 ` [PATCH 2/3] net/virtio_user: fix wrong sequence of messages Jianfeng Tan
2016-08-05 16:36 ` Stephen Hemminger
2016-08-08 1:19 ` Tan, Jianfeng
2016-09-06 6:42 ` Yuanhan Liu
2016-09-06 7:54 ` Tan, Jianfeng
2016-09-06 8:20 ` Yuanhan Liu
2016-09-08 8:53 ` Tan, Jianfeng
2016-09-08 12:18 ` Yuanhan Liu
2016-09-09 3:59 ` Tan, Jianfeng
2016-09-09 4:19 ` Yuanhan Liu [this message]
2016-09-09 5:50 ` Tan, Jianfeng
2016-09-09 6:03 ` Yuanhan Liu
2016-09-09 6:24 ` Tan, Jianfeng
2016-09-09 6:31 ` Yuanhan Liu
2016-08-05 11:36 ` [PATCH 3/3] net/virtio_user: fix dev not freed after init error Jianfeng Tan
2016-08-05 16:34 ` Stephen Hemminger
2016-08-08 1:07 ` Tan, Jianfeng
2016-08-29 7:01 ` [PATCH 0/3] fix virtio_user issues Christian Ehrhardt
2016-09-27 19:11 ` [PATCH v2 " Jianfeng Tan
2016-09-27 19:11 ` [PATCH v2 1/3] net/virtio_user: fix queue pair not enabled Jianfeng Tan
2016-09-28 0:05 ` Yuanhan Liu
2016-09-27 19:11 ` [PATCH v2 2/3] net/virtio_user: fix wrong sequence of messages Jianfeng Tan
2016-09-27 19:11 ` [PATCH v2 3/3] net/virtio_user: fix dev not freed after init error Jianfeng Tan
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20160909041949.GP23158@yliu-dev.sh.intel.com \
--to=yuanhan.liu@linux.intel.com \
--cc=dev@dpdk.org \
--cc=jianfeng.tan@intel.com \
--cc=lining18@jd.com \
--cc=zhihong.wang@intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.