From: Stefan Hajnoczi <stefanha@redhat.com>
To: gong lei <arei.gonglei@hotmail.com>
Cc: "mst@redhat.com" <mst@redhat.com>,
"cornelia.huck@de.ibm.com" <cornelia.huck@de.ibm.com>,
"denglingli@chinamobile.com" <denglingli@chinamobile.com>,
"Jani.Kokkonen@huawei.com" <Jani.Kokkonen@huawei.com>,
"Ola.Liljedahl@arm.com" <Ola.Liljedahl@arm.com>,
"Varun.Sethi@freescale.com" <Varun.Sethi@freescale.com>,
"xin.zeng@intel.com" <xin.zeng@intel.com>,
"brian.a.keating@intel.com" <brian.a.keating@intel.com>,
"liang.j.ma@intel.com" <liang.j.ma@intel.com>,
"john.griffin@intel.com" <john.griffin@intel.com>,
"hanweidong@huawei.com" <hanweidong@huawei.com>,
"mike.caraman@nxp.com" <mike.caraman@nxp.com>,
"weidong.huang@huawei.com" <weidong.huang@huawei.com>,
"luonengjun@huawei.com" <luonengjun@huawei.com>,
"peter.huangpeng@huawei.com" <peter.huangpeng@huawei.com>,
"are.gonglei@huawei.com" <are.gonglei@huawei.com>,
"wu.wubin@huawei.com" <wu.wubin@huawei.com>,
"agraf@suse.de" <agraf@suse.de>,
"Claudio.Fontana@huawei.com" <Claudio.Fontana@huawei.com>,
"Shiqing.Fan@huawei.com" <Shiqing.Fan@huawei.com>,
"jianjay.zhou@huawei.com" <jianjay.zhou@huawei.com>,
"arei.gonglei@huawei.com" <arei.gonglei@huawei.com>,
"qemu-devel@nongnu.org" <qemu-devel@nongnu.org>,
"virtio-dev@lists.oasis-open.org"
<virtio-dev@lists.oasis-open.org>
Subject: Re: [Qemu-devel] [PATCH v11 1/2] virtio-crypto: Add virtio crypto device specification
Date: Tue, 4 Oct 2016 17:16:25 +0100 [thread overview]
Message-ID: <20161004161625.GF28028@stefanha-x1.localdomain> (raw)
In-Reply-To: <HK2PR0601MB14273277A4B19CD8CFDEB9579FC50@HK2PR0601MB1427.apcprd06.prod.outlook.com>
[-- Attachment #1: Type: text/plain, Size: 7249 bytes --]
On Tue, Oct 04, 2016 at 12:24:02PM +0000, gong lei wrote:
> On 2016/10/4 17:05, Stefan Hajnoczi wrote:
> > On Tue, Oct 04, 2016 at 02:53:25AM +0000, gong lei wrote:
> >> Hi Stefan,
> >>
> >> Thanks for your comments.
> >>
> >>> On Wed, Sep 28, 2016 at 05:08:24PM +0800, Gonglei wrote:
> >>>> /+For scatter/gather list support, a buffer can be represented by /
> >>>> /virtio_crypto_iovec structure./
> >>>> /+/
> >>>> /+The structure is defined as follows:/
> >>>> /+/
> >>>> /+\begin{lstlisting}/
> >>>> /+struct virtio_crypto_iovec {/
> >>>> /+ /* Guest physical address *//
> >>>> /+ le64 addr;/
> >>>> /+ /* Length of guest physical address *//
> >>>> /+ le32 len;/
> >>>> /+/* This marks a buffer as continuing via the next field *//
> >>>> /+#define VIRTIO_CRYPTO_IOVEC_F_NEXT 1/
> >>>> /+ /* The flags as indicated above VIRTIO_CRYPTO_IOVEC_F_*. *//
> >>>> /+ le32 flags;/
> >>>> /+ /* Pointer to next struct virtio_crypto_iovec if flags & NEXT *//
> >>>> /+ le64 next_iovec;/
> >>>> /+};/
> >>>> /+\end{lstlisting}/
> >>> The vring already provides scatter-gather I/O. It is usually not
> >>> necessary to define scatter-gather I/O at the device level. Addresses
> >>> can be translated by the virtio transport (PCI, MMIO, CCW). For example
> >>> PCI bus addresses with IO-MMU. Therefore it's messy to use guest
> >>> physical addresses in the device specification.
> >>>
> >>>> /+Each data request uses virtio_crypto_hash_data_req structure to
> >>>> store /
> >>>> /information/
> >>>> /+used to run the HASH operations. The request only occupies one entry/
> >>>> /+in the Vring Descriptor Table in the virtio crypto device's dataq,
> >>>> which /
> >>>> /improves/
> >>>> /+the throughput of data transmitted for the HASH service, so that the
> >>> virtio /
> >>>> /crypto/
> >>>> /+device can be better accelerated./
> >>> Indirect vrings also only require one entry in the descriptor table. I
> >>> don't understand why you are reinventing scatter-gather I/O.
> >>>
> >>> Am I missing something?
> >> Yes, I knew indirect vring. But for virtio-crypto device' request, each
> >> crypto request include
> >> many buffers. Take algorithm chain' request as an examle, the driver
> >> need to transmit source
> >> data, dstination data, initializaion vector, additional authentication
> >> data, digest result
> >> data etc. to the device. In those data, the source data and destionation
> >> data etc. may be composed
> >> by scatter-gather I/O. That's the background.
> >>
> >> In virtio-crypto spec, we use a structure to store all those contents so
> >> that we can put all those data
> >> into one entry in the Descriptor Table, otherwise the effect of
> >> acceleration is not good. We
> >> thought other methods to inprove the performance as well, such as
> >> increasing the virng size
> >> of dataq, but the maxinum is 1024 at present, and it maybe influence the
> >> latency if the vring
> >> size is too big.
> >>
> >> For the indirect ving in existing Virtio spec, is only used for one
> >> buffer, which can't cover
> >> our situation.
> > Indirect vring uses 1 descriptor in the vring descriptor table, but that
> > descriptor points to a separate table that can have many descriptors.
> > You are not limited to just 1 scatter-gather element.
> >
> > Also, I've noticed that the structs in the spec are mixing
> > device-readable and device-writable fields in structs. This is not
> > allowed since virtio requires that all device-readable data comes before
> > all all device-writable data.
> The spec 2.4.5 says something related, but not forced.
>
> A device MUST NOT write to a device-readable buffer, and a device SHOULD
> NOT read a device-writable
> buffer (it MAY do so for debugging or diagnostic purposes).
Please see:
3.2.1.1 Placing Buffers Into The Descriptor Table
A buffer consists of zero or more read-only physically-contiguous
elements followed by zero or more physically-contiguous write-only
elements (it must have at least one element).
You must lay out the request (read-only) and response (write-only) parts
in order. It's not possible to have read-only elements after a
write-only element.
> > I think you'll be able to use indirect vring with the same performance
> > as customer scatter-gather I/O once you think through the layout of
> > device-readable and device-writable data.
> >
> > In order to lay out requests correctly the device-readable headers
> > struct must contain the length of all variable-sized fields.
> >
> > For example, the header would have an iv_len field and the device will
> > expect that number of bytes after the header struct:
> >
> > Device-readable:
> > [header]
> > [iv]
> > [input data]
> >
> > Device-writeable:
> > [output data]
> > [return/error values]
> >
> > One more thing to keep in mind is that according to the VIRTIO
> > specification the device must not rely on the framing (or boundaries of
> > scatter-gather elements). In the example above it means that the [iv]
> > could either be a single vring_desc or it could be multiple descs, or it
> > could share vring_descs with [header] and/or [input data].
> >
> > In other words, the device emulation code must not assume elem->in[0] is
> > [header], elem->in[1] is [iv], and elem->in[2] is [input data]. It has
> > to process without giving special meaning to scatter-gather buffer size.
> >
> > Stefan
>
> Yes, I knew that and I did that last year, but I didn't get the good
> performance unfortunately.
> Because we need to handle multiple buffers respectively on one request,
> which add the overhead
> of software layer. It's obviously for vhost-user cryptodev backend in DPDK.
>
> Maybe I didn't express my meaning clearly. Let's assume that a have 6
> buffers
> in one crypto request:
>
> BufA: output data, a single buffer
> BufB: output data, a scatter-gather I/O
> BufC: output data, a single buffer
> BufD: in data, a scatter-gather I/O
> BufE: in data, a single buffer
> BufF: in data, a single buffer
>
> We need following steps to translate the request to the device:
>
> 1. add_outbuf() for BufA, which will occupy one entry in the descryptor
> table
> 2.add_outbuf() for BufB, which will occupy one entry in the descryptor
> table if using
> indirect vring, or multiple entries if not using indirecting vring
> 3. add_outbuf() for BufC, which will occupy one entry in the descryptor
> table
> 4. add_inbuf() for BufD, which will occupy one entry in the descryptor
> table if using
> indirect vring, or multiple entries if not using indirecting vring
> 5. add_inbuf() for BufE, which will occupy one entry in the descryptor table
> 6. add_outbuf() for BufF, which will occupy one entry in the descryptor
> table
>
> It means that one request will occupy 6 entries at least. Am I right?
No. If these 6 buffers belong to 1 request then you only need a single
indirect descriptor in the vring.
The indirect descriptor table will have:
[header]
[BufA]
[BufB1]
[BufB2]
[BufB...]
[BufBN]
[BufC]
[BufD1]
[BufD2]
[BufD...]
[BufDN]
[BufE]
[BufF]
[footer]
Stefan
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 455 bytes --]
next prev parent reply other threads:[~2016-10-04 16:16 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <37e75a50-1a76-727e-d25a-aea359783a72@hotmail.com>
[not found] ` <HK2PR0601MB1427144BEBD2E091794AB6EC9FC50@HK2PR0601MB1427.apcprd06.prod.outlook.com>
[not found] ` <20161004090513.GB4587@stefanha-x1.localdomain>
2016-10-04 12:24 ` [Qemu-devel] [PATCH v11 1/2] virtio-crypto: Add virtio crypto device specification gong lei
2016-10-04 16:16 ` Stefan Hajnoczi [this message]
2016-10-05 3:51 ` Gonglei (Arei)
2016-09-28 9:08 [Qemu-devel] [PATCH v11 0/2] virtio-crypto: " Gonglei
2016-09-28 9:08 ` [Qemu-devel] [PATCH v11 1/2] virtio-crypto: Add " Gonglei
2016-10-03 15:54 ` Stefan Hajnoczi
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=20161004161625.GF28028@stefanha-x1.localdomain \
--to=stefanha@redhat.com \
--cc=Claudio.Fontana@huawei.com \
--cc=Jani.Kokkonen@huawei.com \
--cc=Ola.Liljedahl@arm.com \
--cc=Shiqing.Fan@huawei.com \
--cc=Varun.Sethi@freescale.com \
--cc=agraf@suse.de \
--cc=are.gonglei@huawei.com \
--cc=arei.gonglei@hotmail.com \
--cc=arei.gonglei@huawei.com \
--cc=brian.a.keating@intel.com \
--cc=cornelia.huck@de.ibm.com \
--cc=denglingli@chinamobile.com \
--cc=hanweidong@huawei.com \
--cc=jianjay.zhou@huawei.com \
--cc=john.griffin@intel.com \
--cc=liang.j.ma@intel.com \
--cc=luonengjun@huawei.com \
--cc=mike.caraman@nxp.com \
--cc=mst@redhat.com \
--cc=peter.huangpeng@huawei.com \
--cc=qemu-devel@nongnu.org \
--cc=virtio-dev@lists.oasis-open.org \
--cc=weidong.huang@huawei.com \
--cc=wu.wubin@huawei.com \
--cc=xin.zeng@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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).