* [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 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
* 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
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 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).