Changeset
include/block/nbd.h |  3 ++-
nbd/server.c        | 10 ++++++----
2 files changed, 8 insertions(+), 5 deletions(-)
Git apply log
Switched to a new branch '20180413143156.11409-1-vsementsov@virtuozzo.com'
Applying: nbd/server: introduce NBD_CMD_CACHE
To https://github.com/patchew-project/qemu
 * [new tag]         patchew/20180413143156.11409-1-vsementsov@virtuozzo.com -> patchew/20180413143156.11409-1-vsementsov@virtuozzo.com
Test passed: checkpatch

loading

Test passed: docker-mingw@fedora

loading

Test passed: docker-build@min-glib

loading

Test passed: s390x

loading

[Qemu-devel] [PATCH] nbd/server: introduce NBD_CMD_CACHE
Posted by Vladimir Sementsov-Ogievskiy, 6 days ago
Handle nbd CACHE command. Just do read, without sending read data back.
Cache mechanism should be done by exported node driver chain.

Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
---
 include/block/nbd.h |  3 ++-
 nbd/server.c        | 10 ++++++----
 2 files changed, 8 insertions(+), 5 deletions(-)

diff --git a/include/block/nbd.h b/include/block/nbd.h
index fcdcd54502..b4793d0a29 100644
--- a/include/block/nbd.h
+++ b/include/block/nbd.h
@@ -135,6 +135,7 @@ typedef struct NBDExtent {
 #define NBD_FLAG_SEND_TRIM         (1 << 5) /* Send TRIM (discard) */
 #define NBD_FLAG_SEND_WRITE_ZEROES (1 << 6) /* Send WRITE_ZEROES */
 #define NBD_FLAG_SEND_DF           (1 << 7) /* Send DF (Do not Fragment) */
+#define NBD_FLAG_SEND_CACHE        (1 << 8) /* Send CACHE (prefetch) */
 
 /* New-style handshake (global) flags, sent from server to client, and
    control what will happen during handshake phase. */
@@ -195,7 +196,7 @@ enum {
     NBD_CMD_DISC = 2,
     NBD_CMD_FLUSH = 3,
     NBD_CMD_TRIM = 4,
-    /* 5 reserved for failed experiment NBD_CMD_CACHE */
+    NBD_CMD_CACHE = 5,
     NBD_CMD_WRITE_ZEROES = 6,
     NBD_CMD_BLOCK_STATUS = 7,
 };
diff --git a/nbd/server.c b/nbd/server.c
index 9e1f227178..30d7d3f444 100644
--- a/nbd/server.c
+++ b/nbd/server.c
@@ -1134,7 +1134,7 @@ static coroutine_fn int nbd_negotiate(NBDClient *client, Error **errp)
     int ret;
     const uint16_t myflags = (NBD_FLAG_HAS_FLAGS | NBD_FLAG_SEND_TRIM |
                               NBD_FLAG_SEND_FLUSH | NBD_FLAG_SEND_FUA |
-                              NBD_FLAG_SEND_WRITE_ZEROES);
+                              NBD_FLAG_SEND_WRITE_ZEROES | NBD_FLAG_SEND_CACHE);
     bool oldStyle;
 
     /* Old style negotiation header, no room for options
@@ -1826,7 +1826,9 @@ static int nbd_co_receive_request(NBDRequestData *req, NBDRequest *request,
         return -EIO;
     }
 
-    if (request->type == NBD_CMD_READ || request->type == NBD_CMD_WRITE) {
+    if (request->type == NBD_CMD_READ || request->type == NBD_CMD_WRITE ||
+        request->type == NBD_CMD_CACHE)
+    {
         if (request->len > NBD_MAX_BUFFER_SIZE) {
             error_setg(errp, "len (%" PRIu32" ) is larger than max len (%u)",
                        request->len, NBD_MAX_BUFFER_SIZE);
@@ -1911,7 +1913,7 @@ static coroutine_fn int nbd_do_cmd_read(NBDClient *client, NBDRequest *request,
     int ret;
     NBDExport *exp = client->exp;
 
-    assert(request->type == NBD_CMD_READ);
+    assert(request->type == NBD_CMD_READ || request->type == NBD_CMD_CACHE);
 
     /* XXX: NBD Protocol only documents use of FUA with WRITE */
     if (request->flags & NBD_CMD_FLAG_FUA) {
@@ -1930,7 +1932,7 @@ static coroutine_fn int nbd_do_cmd_read(NBDClient *client, NBDRequest *request,
 
     ret = blk_pread(exp->blk, request->from + exp->dev_offset, data,
                     request->len);
-    if (ret < 0) {
+    if (ret < 0 || request->type == NBD_CMD_CACHE) {
         return nbd_send_generic_reply(client, request->handle, ret,
                                       "reading from file failed", errp);
     }
-- 
2.11.1


Re: [Qemu-devel] [PATCH] nbd/server: introduce NBD_CMD_CACHE
Posted by Vladimir Sementsov-Ogievskiy, 6 days ago
13.04.2018 17:31, Vladimir Sementsov-Ogievskiy wrote:
> Handle nbd CACHE command. Just do read, without sending read data back.
> Cache mechanism should be done by exported node driver chain.
>
> Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
> ---
>   include/block/nbd.h |  3 ++-
>   nbd/server.c        | 10 ++++++----
>   2 files changed, 8 insertions(+), 5 deletions(-)
>
> diff --git a/include/block/nbd.h b/include/block/nbd.h
> index fcdcd54502..b4793d0a29 100644
> --- a/include/block/nbd.h
> +++ b/include/block/nbd.h
> @@ -135,6 +135,7 @@ typedef struct NBDExtent {
>   #define NBD_FLAG_SEND_TRIM         (1 << 5) /* Send TRIM (discard) */
>   #define NBD_FLAG_SEND_WRITE_ZEROES (1 << 6) /* Send WRITE_ZEROES */
>   #define NBD_FLAG_SEND_DF           (1 << 7) /* Send DF (Do not Fragment) */
> +#define NBD_FLAG_SEND_CACHE        (1 << 8) /* Send CACHE (prefetch) */
>   
>   /* New-style handshake (global) flags, sent from server to client, and
>      control what will happen during handshake phase. */
> @@ -195,7 +196,7 @@ enum {
>       NBD_CMD_DISC = 2,
>       NBD_CMD_FLUSH = 3,
>       NBD_CMD_TRIM = 4,
> -    /* 5 reserved for failed experiment NBD_CMD_CACHE */
> +    NBD_CMD_CACHE = 5,
>       NBD_CMD_WRITE_ZEROES = 6,
>       NBD_CMD_BLOCK_STATUS = 7,
>   };
> diff --git a/nbd/server.c b/nbd/server.c
> index 9e1f227178..30d7d3f444 100644
> --- a/nbd/server.c
> +++ b/nbd/server.c
> @@ -1134,7 +1134,7 @@ static coroutine_fn int nbd_negotiate(NBDClient *client, Error **errp)
>       int ret;
>       const uint16_t myflags = (NBD_FLAG_HAS_FLAGS | NBD_FLAG_SEND_TRIM |
>                                 NBD_FLAG_SEND_FLUSH | NBD_FLAG_SEND_FUA |
> -                              NBD_FLAG_SEND_WRITE_ZEROES);
> +                              NBD_FLAG_SEND_WRITE_ZEROES | NBD_FLAG_SEND_CACHE);
>       bool oldStyle;
>   
>       /* Old style negotiation header, no room for options
> @@ -1826,7 +1826,9 @@ static int nbd_co_receive_request(NBDRequestData *req, NBDRequest *request,
>           return -EIO;
>       }
>   
> -    if (request->type == NBD_CMD_READ || request->type == NBD_CMD_WRITE) {
> +    if (request->type == NBD_CMD_READ || request->type == NBD_CMD_WRITE ||
> +        request->type == NBD_CMD_CACHE)
> +    {
>           if (request->len > NBD_MAX_BUFFER_SIZE) {
>               error_setg(errp, "len (%" PRIu32" ) is larger than max len (%u)",
>                          request->len, NBD_MAX_BUFFER_SIZE);
> @@ -1911,7 +1913,7 @@ static coroutine_fn int nbd_do_cmd_read(NBDClient *client, NBDRequest *request,
>       int ret;
>       NBDExport *exp = client->exp;
>   
> -    assert(request->type == NBD_CMD_READ);
> +    assert(request->type == NBD_CMD_READ || request->type == NBD_CMD_CACHE);
>   
>       /* XXX: NBD Protocol only documents use of FUA with WRITE */
>       if (request->flags & NBD_CMD_FLAG_FUA) {
> @@ -1930,7 +1932,7 @@ static coroutine_fn int nbd_do_cmd_read(NBDClient *client, NBDRequest *request,
>   
>       ret = blk_pread(exp->blk, request->from + exp->dev_offset, data,
>                       request->len);
> -    if (ret < 0) {
> +    if (ret < 0 || request->type == NBD_CMD_CACHE) {
>           return nbd_send_generic_reply(client, request->handle, ret,
>                                         "reading from file failed", errp);
>       }

ohh, forget the main thing:

diff --git a/nbd/server.c b/nbd/server.c
index 30d7d3f444..d6a161c8d5 100644
--- a/nbd/server.c
+++ b/nbd/server.c
@@ -1965,6 +1965,7 @@ static coroutine_fn int 
nbd_handle_request(NBDClient *client,

      switch (request->type) {
      case NBD_CMD_READ:
+    case NBD_CMD_CACHE:
          return nbd_do_cmd_read(client, request, data, errp);

      case NBD_CMD_WRITE:



-- 
Best regards,
Vladimir


Re: [Qemu-devel] [PATCH] nbd/server: introduce NBD_CMD_CACHE
Posted by Eric Blake, 1 day ago
On 04/13/2018 09:31 AM, Vladimir Sementsov-Ogievskiy wrote:
> Handle nbd CACHE command. Just do read, without sending read data back.
> Cache mechanism should be done by exported node driver chain.
> 
> Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
> ---
>  include/block/nbd.h |  3 ++-
>  nbd/server.c        | 10 ++++++----
>  2 files changed, 8 insertions(+), 5 deletions(-)
> 
> diff --git a/include/block/nbd.h b/include/block/nbd.h
> index fcdcd54502..b4793d0a29 100644
> --- a/include/block/nbd.h
> +++ b/include/block/nbd.h
> @@ -135,6 +135,7 @@ typedef struct NBDExtent {
>  #define NBD_FLAG_SEND_TRIM         (1 << 5) /* Send TRIM (discard) */
>  #define NBD_FLAG_SEND_WRITE_ZEROES (1 << 6) /* Send WRITE_ZEROES */
>  #define NBD_FLAG_SEND_DF           (1 << 7) /* Send DF (Do not Fragment) */
> +#define NBD_FLAG_SEND_CACHE        (1 << 8) /* Send CACHE (prefetch) */

Hmm, this flag is not documented in the upstream NBD protocol yet; are
we sure it matches the xNBD implementation?  We'll want at least a
documentation patch proposed for the NBD list before taking this.

-- 
Eric Blake, Principal Software Engineer
Red Hat, Inc.           +1-919-301-3266
Virtualization:  qemu.org | libvirt.org

Re: [Qemu-devel] [PATCH] nbd/server: introduce NBD_CMD_CACHE
Posted by Vladimir Sementsov-Ogievskiy, 18 hours ago
18.04.2018 19:37, Eric Blake wrote:
> On 04/13/2018 09:31 AM, Vladimir Sementsov-Ogievskiy wrote:
>> Handle nbd CACHE command. Just do read, without sending read data back.
>> Cache mechanism should be done by exported node driver chain.
>>
>> Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
>> ---
>>   include/block/nbd.h |  3 ++-
>>   nbd/server.c        | 10 ++++++----
>>   2 files changed, 8 insertions(+), 5 deletions(-)
>>
>> diff --git a/include/block/nbd.h b/include/block/nbd.h
>> index fcdcd54502..b4793d0a29 100644
>> --- a/include/block/nbd.h
>> +++ b/include/block/nbd.h
>> @@ -135,6 +135,7 @@ typedef struct NBDExtent {
>>   #define NBD_FLAG_SEND_TRIM         (1 << 5) /* Send TRIM (discard) */
>>   #define NBD_FLAG_SEND_WRITE_ZEROES (1 << 6) /* Send WRITE_ZEROES */
>>   #define NBD_FLAG_SEND_DF           (1 << 7) /* Send DF (Do not Fragment) */
>> +#define NBD_FLAG_SEND_CACHE        (1 << 8) /* Send CACHE (prefetch) */
> Hmm, this flag is not documented in the upstream NBD protocol yet; are
> we sure it matches the xNBD implementation?  We'll want at least a
> documentation patch proposed for the NBD list before taking this.
>

The discussion already on list:
https://lists.debian.org/nbd/2018/03/msg00040.html

-- 
Best regards,
Vladimir


Re: [Qemu-devel] [PATCH] nbd/server: introduce NBD_CMD_CACHE
Posted by Eric Blake, 11 hours ago
On 04/19/2018 03:36 AM, Vladimir Sementsov-Ogievskiy wrote:
> 18.04.2018 19:37, Eric Blake wrote:
>> On 04/13/2018 09:31 AM, Vladimir Sementsov-Ogievskiy wrote:
>>> Handle nbd CACHE command. Just do read, without sending read data back.
>>> Cache mechanism should be done by exported node driver chain.
>>>
>>> Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
>>> ---
>>>   include/block/nbd.h |  3 ++-
>>>   nbd/server.c        | 10 ++++++----
>>>   2 files changed, 8 insertions(+), 5 deletions(-)
>>>
>>> diff --git a/include/block/nbd.h b/include/block/nbd.h
>>> index fcdcd54502..b4793d0a29 100644
>>> --- a/include/block/nbd.h
>>> +++ b/include/block/nbd.h
>>> @@ -135,6 +135,7 @@ typedef struct NBDExtent {
>>>   #define NBD_FLAG_SEND_TRIM         (1 << 5) /* Send TRIM (discard) */
>>>   #define NBD_FLAG_SEND_WRITE_ZEROES (1 << 6) /* Send WRITE_ZEROES */
>>>   #define NBD_FLAG_SEND_DF           (1 << 7) /* Send DF (Do not
>>> Fragment) */
>>> +#define NBD_FLAG_SEND_CACHE        (1 << 8) /* Send CACHE (prefetch) */
>> Hmm, this flag is not documented in the upstream NBD protocol yet; are
>> we sure it matches the xNBD implementation?  We'll want at least a
>> documentation patch proposed for the NBD list before taking this.
>>
> 
> The discussion already on list:
> https://lists.debian.org/nbd/2018/03/msg00040.html

Indeed, and that made me realize that we may want to add NBD_CMD_FLAG_*
values corresponding to other useful posix_fadvise() modes before
finalizing the NBD protocol addition of this feature, in which case we'd
want to make sure the qemu implementation is in line with that.

-- 
Eric Blake, Principal Software Engineer
Red Hat, Inc.           +1-919-301-3266
Virtualization:  qemu.org | libvirt.org