From: "Aneesh Kumar K.V" <aneesh.kumar@linux.vnet.ibm.com>
To: qemu-devel@nongnu.org
Cc: aliguori@us.ibm.com,
"Aneesh Kumar K.V" <aneesh.kumar@linux.vnet.ibm.com>
Subject: [Qemu-devel] [PATCH -V3 2/8] hw/9pfs: Add file descriptor reclaim support
Date: Sat, 5 Mar 2011 23:22:07 +0530 [thread overview]
Message-ID: <1299347533-17047-2-git-send-email-aneesh.kumar@linux.vnet.ibm.com> (raw)
In-Reply-To: <1299347533-17047-1-git-send-email-aneesh.kumar@linux.vnet.ibm.com>
Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
---
hw/9pfs/virtio-9p.c | 99 ++++++++++++++++++++++++++++++++++++++++++++++++--
1 files changed, 95 insertions(+), 4 deletions(-)
diff --git a/hw/9pfs/virtio-9p.c b/hw/9pfs/virtio-9p.c
index a9f52c6..811ac38 100644
--- a/hw/9pfs/virtio-9p.c
+++ b/hw/9pfs/virtio-9p.c
@@ -20,6 +20,7 @@
#include "virtio-9p-xattr.h"
int debug_9p_pdu;
+static void v9fs_reclaim_fd(V9fsState *s);
enum {
Oread = 0x00,
@@ -107,7 +108,12 @@ static int v9fs_do_closedir(V9fsState *s, DIR *dir)
static int v9fs_do_open(V9fsState *s, V9fsString *path, int flags)
{
- return s->ops->open(&s->ctx, path->data, flags);
+ int fd;
+ fd = s->ops->open(&s->ctx, path->data, flags);
+ if (fd > P9_FD_RECLAIM_THRES) {
+ v9fs_reclaim_fd(s);
+ }
+ return fd;
}
static DIR *v9fs_do_opendir(V9fsState *s, V9fsString *path)
@@ -188,6 +194,7 @@ static int v9fs_do_fstat(V9fsState *s, int fd, struct stat *stbuf)
static int v9fs_do_open2(V9fsState *s, char *fullname, uid_t uid, gid_t gid,
int flags, int mode)
{
+ int fd;
FsCred cred;
cred_init(&cred);
@@ -196,7 +203,11 @@ static int v9fs_do_open2(V9fsState *s, char *fullname, uid_t uid, gid_t gid,
cred.fc_mode = mode & 07777;
flags = flags;
- return s->ops->open2(&s->ctx, fullname, flags, &cred);
+ fd = s->ops->open2(&s->ctx, fullname, flags, &cred);
+ if (fd > P9_FD_RECLAIM_THRES) {
+ v9fs_reclaim_fd(s);
+ }
+ return fd;
}
static int v9fs_do_symlink(V9fsState *s, V9fsFidState *fidp,
@@ -434,6 +445,23 @@ static V9fsFidState *lookup_fid(V9fsState *s, int32_t fid)
for (f = s->fid_list; f; f = f->next) {
if (f->fid == fid) {
+ /*
+ * check whether we need to reopen the
+ * file. We might have closed the fd
+ * while trying to free up some file
+ * descriptors.
+ */
+ if (f->fsmap.fid_type == P9_FID_FILE) {
+ /* FIXME!! should we remember the open flags ?*/
+ if (f->fsmap.fs.fd == -1) {
+ f->fsmap.fs.fd = v9fs_do_open(s, &f->fsmap.path, O_RDWR);
+ }
+ }
+ /*
+ * Mark the fid as referenced so that the LRU
+ * reclaim won't close the file descriptor
+ */
+ f->fsmap.flags |= FID_REFERENCED;
return f;
}
}
@@ -461,6 +489,62 @@ static V9fsFidState *alloc_fid(V9fsState *s, int32_t fid)
return f;
}
+static void v9fs_reclaim_fd(V9fsState *s)
+{
+ int reclaim_count = 0;
+ V9fsFidState *f;
+
+ for (f = s->fid_list; f; f = f->next) {
+ /*
+ * Unlink fids cannot be reclaimed. Check
+ * for them and skip them
+ */
+ if (f->fsmap.flags & FID_NON_RECLAIMABLE) {
+ continue;
+ }
+ /*
+ * if it is a recently referenced fid
+ * we leave the fid untouched and clear the
+ * reference bit. We come back to it later
+ * in the next iteration. (a simple LRU without
+ * moving list elements around)
+ */
+ if (f->fsmap.flags & FID_REFERENCED) {
+ f->fsmap.flags &= ~FID_REFERENCED;
+ continue;
+ }
+ /*
+ * reclaim fd, by closing the file descriptors
+ */
+ if (f->fsmap.fid_type == P9_FID_FILE) {
+ if (f->fsmap.fs.fd != -1) {
+ v9fs_do_close(s, f->fsmap.fs.fd);
+ f->fsmap.fs.fd = -1;
+ reclaim_count++;
+ }
+ }
+ if (reclaim_count >= P9_FD_RECLAIM_THRES/2) {
+ break;
+ }
+ }
+}
+
+static void v9fs_mark_fids_unreclaim(V9fsState *s, V9fsString *str)
+{
+ V9fsFidState *fidp;
+ for (fidp = s->fid_list; fidp; fidp = fidp->next) {
+ if (!strcmp(fidp->fsmap.path.data, str->data)) {
+ /* Mark the fid non reclaimable. */
+ fidp->fsmap.flags |= FID_NON_RECLAIMABLE;
+ /* reopen the file if already closed */
+ if (fidp->fsmap.fs.fd == -1) {
+ fidp->fsmap.fs.fd = v9fs_do_open(s, &fidp->fsmap.path, O_RDWR);
+ }
+ }
+ }
+}
+
+
static int v9fs_xattr_fid_clunk(V9fsState *s, V9fsFidState *fidp)
{
int retval = 0;
@@ -516,7 +600,10 @@ static int free_fid(V9fsState *s, int32_t fid)
*fidpp = fidp->next;
if (fidp->fsmap.fid_type == P9_FID_FILE) {
- v9fs_do_close(s, fidp->fsmap.fs.fd);
+ /* I we reclaimed the fd no need to close */
+ if (fidp->fsmap.fs.fd != -1) {
+ v9fs_do_close(s, fidp->fsmap.fs.fd);
+ }
} else if (fidp->fsmap.fid_type == P9_FID_DIR) {
v9fs_do_closedir(s, fidp->fsmap.fs.dir);
} else if (fidp->fsmap.fid_type == P9_FID_XATTR) {
@@ -2719,7 +2806,11 @@ static void v9fs_remove(V9fsState *s, V9fsPDU *pdu)
err = -EINVAL;
goto out;
}
-
+ /*
+ * IF the file is unlinked, we cannot reopen
+ * the file later. So don't reclaim fd
+ */
+ v9fs_mark_fids_unreclaim(s, &vs->fidp->fsmap.path);
err = v9fs_do_remove(s, &vs->fidp->fsmap.path);
v9fs_remove_post_remove(s, vs, err);
return;
--
1.7.1
next prev parent reply other threads:[~2011-03-05 17:52 UTC|newest]
Thread overview: 36+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-03-05 17:52 [Qemu-devel] [PATCH -V3 1/8] hw/9pfs: Add V9fsfidmap in preparation for adding fd reclaim Aneesh Kumar K.V
2011-03-05 17:52 ` Aneesh Kumar K.V [this message]
2011-03-13 16:08 ` [Qemu-devel] [PATCH -V3 2/8] hw/9pfs: Add file descriptor reclaim support Stefan Hajnoczi
2011-03-13 18:57 ` Aneesh Kumar K. V
2011-03-14 10:13 ` Stefan Hajnoczi
2011-03-15 8:35 ` Aneesh Kumar K. V
2011-03-05 17:52 ` [Qemu-devel] [PATCH -V3 3/8] hw/9pfs: Use v9fs_do_close instead of close Aneesh Kumar K.V
2011-03-13 16:10 ` Stefan Hajnoczi
2011-03-13 18:58 ` Aneesh Kumar K. V
2011-03-05 17:52 ` [Qemu-devel] [PATCH -V3 4/8] hw/9pfs: Implement syncfs Aneesh Kumar K.V
2011-03-13 16:24 ` Stefan Hajnoczi
2011-03-13 18:59 ` Aneesh Kumar K. V
2011-03-05 17:52 ` [Qemu-devel] [PATCH -V3 5/8] hw/9pfs: Add open flag to fid Aneesh Kumar K.V
2011-03-13 16:38 ` Stefan Hajnoczi
2011-03-13 19:01 ` Aneesh Kumar K. V
2011-03-05 17:52 ` [Qemu-devel] [PATCH -V3 6/8] hw/9pfs: Add directory reclaim support Aneesh Kumar K.V
2011-03-13 16:42 ` Stefan Hajnoczi
2011-03-13 19:02 ` Aneesh Kumar K. V
2011-03-05 17:52 ` [Qemu-devel] [PATCH -V3 7/8] hw/9pfs: Add new virtfs option cache=none to skip host page cache Aneesh Kumar K.V
2011-03-13 17:23 ` Stefan Hajnoczi
2011-03-13 19:04 ` Aneesh Kumar K. V
2011-03-13 20:57 ` Stefan Hajnoczi
2011-03-15 8:36 ` Aneesh Kumar K. V
2011-03-14 10:20 ` Stefan Hajnoczi
2011-03-15 9:19 ` Aneesh Kumar K. V
2011-03-15 11:11 ` Stefan Hajnoczi
2011-03-15 12:30 ` Aneesh Kumar K. V
2011-03-16 8:59 ` Stefan Hajnoczi
2011-03-05 17:52 ` [Qemu-devel] [PATCH -V3 8/8] hw/9pfs: Skip file system sync if we have specified cache=none option Aneesh Kumar K.V
2011-03-13 15:46 ` [Qemu-devel] [PATCH -V3 1/8] hw/9pfs: Add V9fsfidmap in preparation for adding fd reclaim Stefan Hajnoczi
2011-03-13 19:06 ` Aneesh Kumar K. V
2011-03-13 20:53 ` Stefan Hajnoczi
2011-03-14 10:23 ` Stefan Hajnoczi
2011-03-15 9:20 ` Aneesh Kumar K. V
2011-03-15 10:38 ` Stefan Hajnoczi
2011-03-15 12:27 ` Aneesh Kumar K. V
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=1299347533-17047-2-git-send-email-aneesh.kumar@linux.vnet.ibm.com \
--to=aneesh.kumar@linux.vnet.ibm.com \
--cc=aliguori@us.ibm.com \
--cc=qemu-devel@nongnu.org \
/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).