All of lore.kernel.org
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH 0/2] block/nfs: add support for libnfs pagecache
@ 2016-05-17 14:11 Peter Lieven
  2016-05-17 14:11 ` [Qemu-devel] [PATCH 1/2] " Peter Lieven
                   ` (2 more replies)
  0 siblings, 3 replies; 6+ messages in thread
From: Peter Lieven @ 2016-05-17 14:11 UTC (permalink / raw)
  To: qemu-block; +Cc: ronniesahlberg, jcody, qemu-devel, Peter Lieven

this adds support for the upcoming libnfs cachepage to Qemu.
While at it neglect to use readahead if cache.direct is on.

Peter Lieven (2):
  block/nfs: add support for libnfs pagecache
  block/nfs: refuse readahead if cache.direct is on

 block/nfs.c | 45 +++++++++++++++++++++++++++++++++++++++++----
 1 file changed, 41 insertions(+), 4 deletions(-)

-- 
1.9.1

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [Qemu-devel] [PATCH 1/2] block/nfs: add support for libnfs pagecache
  2016-05-17 14:11 [Qemu-devel] [PATCH 0/2] block/nfs: add support for libnfs pagecache Peter Lieven
@ 2016-05-17 14:11 ` Peter Lieven
  2016-05-17 14:11 ` [Qemu-devel] [PATCH 2/2] block/nfs: refuse readahead if cache.direct is on Peter Lieven
  2016-05-18  7:45 ` [Qemu-devel] [PATCH 0/2] block/nfs: add support for libnfs pagecache Fam Zheng
  2 siblings, 0 replies; 6+ messages in thread
From: Peter Lieven @ 2016-05-17 14:11 UTC (permalink / raw)
  To: qemu-block; +Cc: ronniesahlberg, jcody, qemu-devel, Peter Lieven

upcoming libnfs will have support for a read cache that can
significantly help to speed up requests since libnfs by design
circumvents the kernel cache.

Example:
 qemu -cdrom nfs://127.0.0.1/iso/my.iso?pagecache=1024

The pagecache parameters takes the maximum amount of pages to
cache.  A page in libnfs is always the NFS_BLKSIZE which is
4KB.

Signed-off-by: Peter Lieven <pl@kamp.de>
---
 block/nfs.c | 40 ++++++++++++++++++++++++++++++++++++----
 1 file changed, 36 insertions(+), 4 deletions(-)

diff --git a/block/nfs.c b/block/nfs.c
index 9f51cc3..975510f 100644
--- a/block/nfs.c
+++ b/block/nfs.c
@@ -1,7 +1,7 @@
 /*
  * QEMU Block driver for native access to files on NFS shares
  *
- * Copyright (c) 2014 Peter Lieven <pl@kamp.de>
+ * Copyright (c) 2014-2016 Peter Lieven <pl@kamp.de>
  *
  * Permission is hereby granted, free of charge, to any person obtaining a copy
  * of this software and associated documentation files (the "Software"), to deal
@@ -38,6 +38,7 @@
 #include <nfsc/libnfs.h>
 
 #define QEMU_NFS_MAX_READAHEAD_SIZE 1048576
+#define QEMU_NFS_MAX_PAGECACHE_SIZE (8388608 / NFS_BLKSIZE)
 #define QEMU_NFS_MAX_DEBUG_LEVEL 2
 
 typedef struct NFSClient {
@@ -278,7 +279,7 @@ static void nfs_file_close(BlockDriverState *bs)
 }
 
 static int64_t nfs_client_open(NFSClient *client, const char *filename,
-                               int flags, Error **errp)
+                               int flags, Error **errp, int open_flags)
 {
     int ret = -EINVAL, i;
     struct stat st;
@@ -336,6 +337,9 @@ static int64_t nfs_client_open(NFSClient *client, const char *filename,
                 val = QEMU_NFS_MAX_READAHEAD_SIZE;
             }
             nfs_set_readahead(client->context, val);
+#ifdef LIBNFS_FEATURE_PAGECACHE
+            nfs_set_pagecache_ttl(client->context, 0);
+#endif
 #endif
 #ifdef LIBNFS_FEATURE_DEBUG
         } else if (!strcmp(qp->p[i].name, "debug")) {
@@ -348,6 +352,21 @@ static int64_t nfs_client_open(NFSClient *client, const char *filename,
             }
             nfs_set_debug(client->context, val);
 #endif
+#ifdef LIBNFS_FEATURE_PAGECACHE
+        } else if (!strcmp(qp->p[i].name, "pagecache")) {
+            if (open_flags & BDRV_O_NOCACHE) {
+                error_setg(errp, "Cannot enable NFS pagecache "
+                                 "if cache.direct = on");
+                goto fail;
+            }
+            if (val > QEMU_NFS_MAX_PAGECACHE_SIZE) {
+                error_report("NFS Warning: Truncating NFS pagecache"
+                             " size to %d pages", QEMU_NFS_MAX_PAGECACHE_SIZE);
+                val = QEMU_NFS_MAX_PAGECACHE_SIZE;
+            }
+            nfs_set_pagecache(client->context, val);
+            nfs_set_pagecache_ttl(client->context, 0);
+#endif
         } else {
             error_setg(errp, "Unknown NFS parameter name: %s",
                        qp->p[i].name);
@@ -418,7 +437,7 @@ static int nfs_file_open(BlockDriverState *bs, QDict *options, int flags,
     }
     ret = nfs_client_open(client, qemu_opt_get(opts, "filename"),
                           (flags & BDRV_O_RDWR) ? O_RDWR : O_RDONLY,
-                          errp);
+                          errp, bs->open_flags);
     if (ret < 0) {
         goto out;
     }
@@ -454,7 +473,7 @@ static int nfs_file_create(const char *url, QemuOpts *opts, Error **errp)
     total_size = ROUND_UP(qemu_opt_get_size_del(opts, BLOCK_OPT_SIZE, 0),
                           BDRV_SECTOR_SIZE);
 
-    ret = nfs_client_open(client, url, O_CREAT, errp);
+    ret = nfs_client_open(client, url, O_CREAT, errp, 0);
     if (ret < 0) {
         goto out;
     }
@@ -530,6 +549,15 @@ static int nfs_reopen_prepare(BDRVReopenState *state,
     return 0;
 }
 
+#ifdef LIBNFS_FEATURE_PAGECACHE
+static void nfs_invalidate_cache(BlockDriverState *bs,
+                                 Error **errp)
+{
+    NFSClient *client = bs->opaque;
+    nfs_pagecache_invalidate(client->context, client->fh);
+}
+#endif
+
 static BlockDriver bdrv_nfs = {
     .format_name                    = "nfs",
     .protocol_name                  = "nfs",
@@ -553,6 +581,10 @@ static BlockDriver bdrv_nfs = {
 
     .bdrv_detach_aio_context        = nfs_detach_aio_context,
     .bdrv_attach_aio_context        = nfs_attach_aio_context,
+
+#ifdef LIBNFS_FEATURE_PAGECACHE
+    .bdrv_invalidate_cache          = nfs_invalidate_cache,
+#endif
 };
 
 static void nfs_block_init(void)
-- 
1.9.1

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [Qemu-devel] [PATCH 2/2] block/nfs: refuse readahead if cache.direct is on
  2016-05-17 14:11 [Qemu-devel] [PATCH 0/2] block/nfs: add support for libnfs pagecache Peter Lieven
  2016-05-17 14:11 ` [Qemu-devel] [PATCH 1/2] " Peter Lieven
@ 2016-05-17 14:11 ` Peter Lieven
  2016-05-18 13:28   ` Jeff Cody
  2016-05-18  7:45 ` [Qemu-devel] [PATCH 0/2] block/nfs: add support for libnfs pagecache Fam Zheng
  2 siblings, 1 reply; 6+ messages in thread
From: Peter Lieven @ 2016-05-17 14:11 UTC (permalink / raw)
  To: qemu-block; +Cc: ronniesahlberg, jcody, qemu-devel, Peter Lieven

Signed-off-by: Peter Lieven <pl@kamp.de>
---
 block/nfs.c | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/block/nfs.c b/block/nfs.c
index 975510f..8b73a35 100644
--- a/block/nfs.c
+++ b/block/nfs.c
@@ -331,6 +331,11 @@ static int64_t nfs_client_open(NFSClient *client, const char *filename,
             nfs_set_tcp_syncnt(client->context, val);
 #ifdef LIBNFS_FEATURE_READAHEAD
         } else if (!strcmp(qp->p[i].name, "readahead")) {
+            if (open_flags & BDRV_O_NOCACHE) {
+                error_setg(errp, "Cannot enable NFS readahead "
+                                 "if cache.direct = on");
+                goto fail;
+            }
             if (val > QEMU_NFS_MAX_READAHEAD_SIZE) {
                 error_report("NFS Warning: Truncating NFS readahead"
                              " size to %d", QEMU_NFS_MAX_READAHEAD_SIZE);
-- 
1.9.1

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [Qemu-devel] [PATCH 0/2] block/nfs: add support for libnfs pagecache
  2016-05-17 14:11 [Qemu-devel] [PATCH 0/2] block/nfs: add support for libnfs pagecache Peter Lieven
  2016-05-17 14:11 ` [Qemu-devel] [PATCH 1/2] " Peter Lieven
  2016-05-17 14:11 ` [Qemu-devel] [PATCH 2/2] block/nfs: refuse readahead if cache.direct is on Peter Lieven
@ 2016-05-18  7:45 ` Fam Zheng
  2 siblings, 0 replies; 6+ messages in thread
From: Fam Zheng @ 2016-05-18  7:45 UTC (permalink / raw)
  To: Peter Lieven; +Cc: qemu-block, jcody, qemu-devel, ronniesahlberg

On Tue, 05/17 16:11, Peter Lieven wrote:
> this adds support for the upcoming libnfs cachepage to Qemu.
> While at it neglect to use readahead if cache.direct is on.
> 
> Peter Lieven (2):
>   block/nfs: add support for libnfs pagecache
>   block/nfs: refuse readahead if cache.direct is on
> 
>  block/nfs.c | 45 +++++++++++++++++++++++++++++++++++++++++----
>  1 file changed, 41 insertions(+), 4 deletions(-)
> 
> -- 
> 1.9.1
> 
> 

Reviewed-by: Fam Zheng <famz@redhat.com>

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [Qemu-devel] [PATCH 2/2] block/nfs: refuse readahead if cache.direct is on
  2016-05-17 14:11 ` [Qemu-devel] [PATCH 2/2] block/nfs: refuse readahead if cache.direct is on Peter Lieven
@ 2016-05-18 13:28   ` Jeff Cody
  2016-05-19  6:03     ` Peter Lieven
  0 siblings, 1 reply; 6+ messages in thread
From: Jeff Cody @ 2016-05-18 13:28 UTC (permalink / raw)
  To: Peter Lieven; +Cc: qemu-block, ronniesahlberg, qemu-devel

On Tue, May 17, 2016 at 04:11:55PM +0200, Peter Lieven wrote:
> Signed-off-by: Peter Lieven <pl@kamp.de>
> ---
>  block/nfs.c | 5 +++++
>  1 file changed, 5 insertions(+)
> 
> diff --git a/block/nfs.c b/block/nfs.c
> index 975510f..8b73a35 100644
> --- a/block/nfs.c
> +++ b/block/nfs.c
> @@ -331,6 +331,11 @@ static int64_t nfs_client_open(NFSClient *client, const char *filename,
>              nfs_set_tcp_syncnt(client->context, val);
>  #ifdef LIBNFS_FEATURE_READAHEAD
>          } else if (!strcmp(qp->p[i].name, "readahead")) {
> +            if (open_flags & BDRV_O_NOCACHE) {
> +                error_setg(errp, "Cannot enable NFS readahead "
> +                                 "if cache.direct = on");
> +                goto fail;
> +            }
>              if (val > QEMU_NFS_MAX_READAHEAD_SIZE) {
>                  error_report("NFS Warning: Truncating NFS readahead"
>                               " size to %d", QEMU_NFS_MAX_READAHEAD_SIZE);
> -- 
> 1.9.1
>

Do we to check for cache mode changes now in nfs_reopen_prepare()?

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [Qemu-devel] [PATCH 2/2] block/nfs: refuse readahead if cache.direct is on
  2016-05-18 13:28   ` Jeff Cody
@ 2016-05-19  6:03     ` Peter Lieven
  0 siblings, 0 replies; 6+ messages in thread
From: Peter Lieven @ 2016-05-19  6:03 UTC (permalink / raw)
  To: Jeff Cody; +Cc: qemu-block, ronniesahlberg, qemu-devel

Am 18.05.2016 um 15:28 schrieb Jeff Cody:
> On Tue, May 17, 2016 at 04:11:55PM +0200, Peter Lieven wrote:
>> Signed-off-by: Peter Lieven <pl@kamp.de>
>> ---
>>   block/nfs.c | 5 +++++
>>   1 file changed, 5 insertions(+)
>>
>> diff --git a/block/nfs.c b/block/nfs.c
>> index 975510f..8b73a35 100644
>> --- a/block/nfs.c
>> +++ b/block/nfs.c
>> @@ -331,6 +331,11 @@ static int64_t nfs_client_open(NFSClient *client, const char *filename,
>>               nfs_set_tcp_syncnt(client->context, val);
>>   #ifdef LIBNFS_FEATURE_READAHEAD
>>           } else if (!strcmp(qp->p[i].name, "readahead")) {
>> +            if (open_flags & BDRV_O_NOCACHE) {
>> +                error_setg(errp, "Cannot enable NFS readahead "
>> +                                 "if cache.direct = on");
>> +                goto fail;
>> +            }
>>               if (val > QEMU_NFS_MAX_READAHEAD_SIZE) {
>>                   error_report("NFS Warning: Truncating NFS readahead"
>>                                " size to %d", QEMU_NFS_MAX_READAHEAD_SIZE);
>> -- 
>> 1.9.1
>>
> Do we to check for cache mode changes now in nfs_reopen_prepare()?

Good point. I guess I have to error out in bdrv_reopen_prepare if we change the cache.direct from off to on and
have readahead or pagecache enabled. Will send an update.

Thanks,
Peter

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2016-05-19  6:03 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-05-17 14:11 [Qemu-devel] [PATCH 0/2] block/nfs: add support for libnfs pagecache Peter Lieven
2016-05-17 14:11 ` [Qemu-devel] [PATCH 1/2] " Peter Lieven
2016-05-17 14:11 ` [Qemu-devel] [PATCH 2/2] block/nfs: refuse readahead if cache.direct is on Peter Lieven
2016-05-18 13:28   ` Jeff Cody
2016-05-19  6:03     ` Peter Lieven
2016-05-18  7:45 ` [Qemu-devel] [PATCH 0/2] block/nfs: add support for libnfs pagecache Fam Zheng

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.