From: Rusty Russell <rusty@rustcorp.com.au>
To: "Michael S. Tsirkin" <mst@redhat.com>
Cc: "Sjur Brændeland" <sjurbren@gmail.com>,
"Linus Walleij" <linus.walleij@linaro.org>,
virtualization@lists.linux-foundation.org,
LKML <linux-kernel@vger.kernel.org>,
"Sjur Brændeland" <sjur.brandeland@stericsson.com>,
"Ohad Ben-Cohen" <ohad@wizery.com>
Subject: Re: [RFCv2 00/12] Introduce host-side virtio queue and CAIF Virtio.
Date: Thu, 17 Jan 2013 12:40:29 +1030 [thread overview]
Message-ID: <87k3rcy2y2.fsf@rustcorp.com.au> (raw)
In-Reply-To: <20130116081606.GB11465@redhat.com>
"Michael S. Tsirkin" <mst@redhat.com> writes:
> On Wed, Jan 16, 2013 at 01:43:32PM +1030, Rusty Russell wrote:
>> "Michael S. Tsirkin" <mst@redhat.com> writes:
>> >> +static int resize_iovec(struct vringh_iov *iov, gfp_t gfp)
>> >> +{
>> >> + struct iovec *new;
>> >> + unsigned int new_num = iov->max * 2;
>> >
>> > We must limit this I think, this is coming
>> > from userspace. How about UIO_MAXIOV?
>>
>> We limit it to the ring size already;
>
> 1. do we limit it in case there's a loop in the descriptor ring?
Yes, we catch loops as per normal (simple counter):
if (count++ == vrh->vring.num) {
vringh_bad("Descriptor loop in %p", descs);
err = -ELOOP;
goto fail;
}
> 2. do we limit it in case there are indirect descriptors?
> I guess I missed where we do this could you point this out to me?
Well, the total is limited above, indirect descriptors or no (since we
handle them inline). Because each indirect descriptor must contain one
descriptor (we always grab descriptor 0), the loop must terminate.
>> UIO_MAXIOV is a weird choice here.
>
> It's kind of forced by the need to pass the iov on to the linux kernel,
> so we know that any guest using more is broken on existing hypervisors.
>
> Ring size is somewhat arbitrary too, isn't it? A huge ring where we
> post lots of short descriptors (e.g. RX buffers) seems like a valid thing to do.
Sure, but the ring size is a documented limit (even if indirect
descriptors are used). I hadn't realized we have an
implementation-specific limit of 1024 descriptors: I shall add this.
While noone reasonable will exceed that, we should document it somewhere
in the spec.
>> > I really dislike raw pointers that we must never dereference.
>> > Since we are forcing everything to __user anyway, why don't we
>> > tag all addresses as __user? The kernel users of this API
>> > can cast that away, this will keep the casts to minimum.
>> >
>> > Failing that, we can add our own class
>> > # define __virtio __attribute__((noderef, address_space(2)))
>>
>> In this case, perhaps we should leave addr as a u64?
>
> Point being? All users will cast to a pointer.
> It seems at first passing in raw pointers is cleaner,
> but it turns out in the API we are passing iovs around,
> and they are __user anyway.
> So using raw pointers here does not buy us anything,
> so let's use __user and gain extra static checks at no cost.
I resist sprinkling __user everywhere because it's *not* always user
addresses, and it's deeply misleading to anyone reading it. I'd rather
have it in one place with a big comment.
I can try using a union of kvec and iovec, since they are the same
layout in practice AFAICT.
>> >> + iov->iov[iov->i].iov_base = (__force __user void *)addr;
>> >> + iov->iov[iov->i].iov_len = desc.len;
>> >> + iov->i++;
>> >
>> >
>> > This looks like it won't do the right thing if desc.len spans multiple
>> > ranges. I don't know if this happens in practice but this is something
>> > vhost supports ATM.
>>
>> Well, kind of. I assumed that the bool (*getrange)(u64, struct
>> vringh_range *)) callback would meld any adjacent ranges if it needs to.
>
> Confused. If addresses 0 to 0x1000 map to virtual addresses 0 to 0x1000
> and 0x1000 to 0x2000 map to virtual addresses 0x2000 to 0x3000, then
> a single descriptor covering 0 to 0x2000 in guest needs two
> iov entries. What can getrange do about it?
getrange doesn't map virtual to physical, it maps virtual to user.
Cheers,
Rusty.
next prev parent reply other threads:[~2013-01-17 2:38 UTC|newest]
Thread overview: 76+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-10-31 22:46 [RFC virtio-next 0/4] Introduce CAIF Virtio and reversed Vrings Sjur Brændeland
2012-10-31 22:46 ` Sjur Brændeland
2012-10-31 22:46 ` [RFC virtio-next 1/4] virtio: Move definitions to header file vring.h Sjur Brændeland
2012-10-31 22:46 ` Sjur Brændeland
2012-10-31 22:46 ` [RFC virtio-next 2/4] include/vring.h: Add support for reversed vritio rings Sjur Brændeland
2012-10-31 22:46 ` Sjur Brændeland
2012-10-31 22:46 ` [RFC virtio-next 3/4] virtio_ring: Call callback function even when used ring is empty Sjur Brændeland
2012-10-31 22:46 ` Sjur Brændeland
2012-10-31 22:46 ` [RFC virtio-next 4/4] caif_virtio: Add CAIF over virtio Sjur Brændeland
2012-10-31 22:46 ` Sjur Brændeland
2012-11-01 7:41 ` [RFC virtio-next 0/4] Introduce CAIF Virtio and reversed Vrings Rusty Russell
2012-11-01 7:41 ` Rusty Russell
2012-11-01 7:41 ` Rusty Russell
2012-11-05 12:12 ` Sjur Brændeland
2012-11-05 12:12 ` Sjur Brændeland
2012-11-06 2:09 ` Rusty Russell
2012-11-06 2:09 ` Rusty Russell
2012-12-05 14:36 ` [RFCv2 00/12] Introduce host-side virtio queue and CAIF Virtio Sjur Brændeland
2012-12-05 14:36 ` [RFCv2 01/12] vhost: Use struct vring in vhost_virtqueue Sjur Brændeland
2012-12-05 14:37 ` [RFCv2 02/12] vhost: Isolate reusable vring related functions Sjur Brændeland
2012-12-05 14:37 ` [RFCv2 03/12] virtio-ring: Introduce file virtio_ring_host Sjur Brændeland
2012-12-05 14:37 ` [RFCv2 04/12] virtio-ring: Refactor out the functions accessing user memory Sjur Brændeland
2012-12-06 9:52 ` Michael S. Tsirkin
2012-12-06 11:03 ` Sjur BRENDELAND
2012-12-06 11:15 ` Michael S. Tsirkin
2012-12-07 11:05 ` Sjur BRENDELAND
2012-12-07 12:40 ` Michael S. Tsirkin
2012-12-07 13:02 ` Sjur BRENDELAND
2012-12-07 14:05 ` Michael S. Tsirkin
2012-12-05 14:37 ` [RFCv2 05/12] virtio-ring: Refactor move attributes to struct virtqueue Sjur Brændeland
2012-12-05 14:37 ` [RFCv2 06/12] virtio_ring: Move SMP macros to virtio_ring.h Sjur Brændeland
2012-12-05 14:37 ` [RFCv2 07/12] virtio-ring: Add Host side virtio-ring implementation Sjur Brændeland
2012-12-05 14:37 ` [RFCv2 08/12] virtio: Update vring_interrupt for host-side virtio queues Sjur Brændeland
2012-12-05 14:37 ` [RFCv2 09/12] virtio-ring: Add BUG_ON checking on host/guest ring type Sjur Brændeland
2012-12-05 14:37 ` [RFCv2 10/12] virtio: Add argument reversed to function find_vqs() Sjur Brændeland
2012-12-05 14:37 ` [RFCv2 11/12] remoteproc: Add support for host-virtqueues Sjur Brændeland
2012-12-05 14:37 ` [RFCv2 12/12] caif_virtio: Introduce caif over virtio Sjur Brændeland
2012-12-06 10:27 ` [RFCv2 00/12] Introduce host-side virtio queue and CAIF Virtio Michael S. Tsirkin
2012-12-21 6:11 ` Rusty Russell
2013-01-08 8:04 ` Sjur Brændeland
2013-01-08 23:17 ` Rusty Russell
2013-01-10 10:30 ` Rusty Russell
2013-01-10 10:30 ` Rusty Russell
2013-01-10 11:11 ` Michael S. Tsirkin
2013-01-10 11:11 ` Michael S. Tsirkin
2013-01-10 22:48 ` Rusty Russell
2013-01-11 7:31 ` Michael S. Tsirkin
2013-01-12 0:20 ` Rusty Russell
2013-01-14 16:54 ` Michael S. Tsirkin
2013-01-11 7:31 ` Michael S. Tsirkin
2013-01-10 18:39 ` Sjur Brændeland
2013-01-10 18:39 ` Sjur Brændeland
2013-01-10 23:35 ` Rusty Russell
2013-01-10 23:35 ` Rusty Russell
2013-01-11 6:37 ` Rusty Russell
2013-01-11 6:37 ` Rusty Russell
2013-01-11 15:02 ` Sjur Brændeland
2013-01-11 15:02 ` Sjur Brændeland
2013-01-12 0:26 ` Rusty Russell
2013-01-12 0:26 ` Rusty Russell
2013-01-14 17:39 ` Michael S. Tsirkin
2013-01-14 17:39 ` Michael S. Tsirkin
2013-01-16 3:13 ` Rusty Russell
2013-01-16 3:13 ` Rusty Russell
2013-01-16 8:16 ` Michael S. Tsirkin
2013-01-16 8:16 ` Michael S. Tsirkin
2013-01-17 2:10 ` Rusty Russell
2013-01-17 2:10 ` Rusty Russell [this message]
2013-01-17 9:58 ` Michael S. Tsirkin
2013-01-17 9:58 ` Michael S. Tsirkin
2013-01-21 11:55 ` Rusty Russell
2013-01-21 11:55 ` Rusty Russell
2013-01-17 10:35 ` Rusty Russell
2013-01-17 10:35 ` Rusty Russell
2013-01-11 14:52 ` Sjur Brændeland
2013-01-11 14:52 ` Sjur Brændeland
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=87k3rcy2y2.fsf@rustcorp.com.au \
--to=rusty@rustcorp.com.au \
--cc=linus.walleij@linaro.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mst@redhat.com \
--cc=ohad@wizery.com \
--cc=sjur.brandeland@stericsson.com \
--cc=sjurbren@gmail.com \
--cc=virtualization@lists.linux-foundation.org \
/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.