Thread (17 messages) 17 messages, 3 authors, 2011-03-09

Re: [PATCH 2/3] [RFC] Changes for MQ virtio-net

From: Krishna Kumar2 <hidden>
Date: 2011-03-08 15:30:56
Also in: kvm

"Michael S. Tsirkin" [off-list ref] wrote on 03/02/2011 03:36:00 PM:

Sorry for the delayed response, I have been sick the last few days.
I am responding to both your posts here.
quoted
Both virtio-net and vhost need some check to make sure very
high values are not passed by userspace. Is this not required?
Whatever we stick in the header is effectively part of
host/gues interface. Are you sure we'll never want
more than 16 VQs? This value does not seem that high.
OK, so even constants cannot change?  Given that, should I remove all
checks and use kcalloc?
quoted
OK, so virtio_net_config has num_queue_pairs, and this gets converted to
numtxqs in virtnet_info?
Or put num_queue_pairs in virtnet_info too.
For virtnet_info, having numtxqs is easier since all code that loops needs
only 'numtxq'.
quoted
Also, vhost has some
code that processes tx first before rx (e.g. vhost_net_stop/flush),
No idea why did I do it this way. I don't think it matters.
quoted
so this approach seemed helpful.
I am OK either way, what do you
suggest?
We get less code generated but also less flexibility.
I am not sure, I'll play around with code, for now
let's keep it as is.
OK.
quoted
Yes, it is a waste to have these vectors for tx ints. I initially
thought of adding a flag to virtio_device to pass to vp_find_vqs,
but it won't work, so a new API is needed. I can work with you on
this in the background if you like.
OK. For starters, how about we change find_vqs to get a structure?  Then
we can easily add flags that tell us that some interrupts are rare.
Yes. OK to work on this outside this patch series, I guess?
quoted
vq's are matched between qemu, virtio-net and vhost. Isn't some check
required that userspace has not passed a bad value?

For virtio, I'm not too concerned: qemu can already easily
crash the guest :)
For vhost yes, but I'm concerned that even with 16 VQs we are
drinking a lot of resources already. I would be happier
if we had a file descriptor per VQs pair in some way.
The the amount of memory userspace can use up is
limited by the # of file descriptors.
I will start working on this approach this week and see how it goes.
quoted
OK, so define free_unused_bufs() as:

static void free_unused_bufs(struct virtnet_info *vi, struct virtqueue
*svq,
		 		 		      struct virtqueue *rvq)
{
		 /* Use svq and rvq with the remaining code unchanged */
}
Not sure I understand. I am just suggesting
adding symmetrical functions like init/cleanup
alloc/free etc instead of adding stuff in random
functions that just happens to be called at the right time.
OK, I will clean up this part in the next revision.
quoted
I was not sure what is the best way - a sysctl parameter? Or should the
maximum depend on number of host cpus? But that results in too many
threads, e.g. if I have 16 cpus and 16 txqs.
I guess the question is, wouldn't # of threads == # of vqs work best?
If we process stuff on a single CPU, let's make it pass through
a single VQ.
And to do this, we could simply open multiple vhost fds without
changing vhost at all.

Would this work well?
quoted
quoted
quoted
-		 		  enum vhost_net_poll_state tx_poll_state;
+		 		  enum vhost_net_poll_state *tx_poll_state;
another array?
Yes... I am also allocating twice the space than what is required
to make it's usage simple.
Where's the allocation? Couldn't find it.
vhost_setup_vqs(net.c) allocates it based on nvqs, though numtxqs is
enough.

Thanks,

- KK
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help