All of lore.kernel.org
 help / color / mirror / Atom feed
From: gong lei <arei.gonglei@hotmail.com>
To: Stefan Hajnoczi <stefanha@redhat.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 12:24:02 +0000	[thread overview]
Message-ID: <HK2PR0601MB14273277A4B19CD8CFDEB9579FC50@HK2PR0601MB1427.apcprd06.prod.outlook.com> (raw)
In-Reply-To: <20161004090513.GB4587@stefanha-x1.localdomain>

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).
> 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?

-- 
Regards,
-Gonglei

       reply	other threads:[~2016-10-04 12:44 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     ` gong lei [this message]
2016-10-04 16:16       ` [Qemu-devel] [PATCH v11 1/2] virtio-crypto: Add virtio crypto device specification Stefan Hajnoczi
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=HK2PR0601MB14273277A4B19CD8CFDEB9579FC50@HK2PR0601MB1427.apcprd06.prod.outlook.com \
    --to=arei.gonglei@hotmail.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@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=stefanha@redhat.com \
    --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 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.