From: Gu Zheng <guz.fnst@cn.fujitsu.com>
To: Benjamin <bcrl@kvack.org>
Cc: linux-aio@kvack.org, fsdevel <linux-fsdevel@vger.kernel.org>,
linux-kernel <linux-kernel@vger.kernel.org>
Subject: [PATCH] aio: optimize free kioctx slot search
Date: Thu, 26 Dec 2013 18:22:10 +0800 [thread overview]
Message-ID: <52BC0352.2040504@cn.fujitsu.com> (raw)
Add a 'next_free' field into kioctx_table to store the next id that
may be free, in order to reduce the search region when we insert
kioctx into kioctx table.
When we take a free slot from kioctx_table, update 'next_free' to
the next slot. Also when we free one slot to kioctx_table, update 'next_free'
to the new free slot if it's smaller than 'next_free'. So that we can
ensure that the slots before 'next_free' are all used, and the search can start
from 'next_free' to reduce the search and improve the performance.
Signed-off-by: Gu Zheng <guz.fnst@cn.fujitsu.com>
---
fs/aio.c | 10 ++++++++--
1 files changed, 8 insertions(+), 2 deletions(-)
diff --git a/fs/aio.c b/fs/aio.c
index 062a5f6..489fda6 100644
--- a/fs/aio.c
+++ b/fs/aio.c
@@ -69,6 +69,7 @@ struct aio_ring {
struct kioctx_table {
struct rcu_head rcu;
unsigned nr;
+ unsigned next_free;
struct kioctx *table[];
};
@@ -548,11 +549,12 @@ static int ioctx_add_table(struct kioctx *ctx, struct mm_struct *mm)
table = rcu_dereference(mm->ioctx_table);
while (1) {
- if (table)
- for (i = 0; i < table->nr; i++)
+ if (table && table->next_free < table->nr)
+ for (i = table->next_free; i < table->nr; i++)
if (!table->table[i]) {
ctx->id = i;
table->table[i] = ctx;
+ table->next_free = i + 1;
rcu_read_unlock();
spin_unlock(&mm->ioctx_lock);
@@ -579,8 +581,10 @@ static int ioctx_add_table(struct kioctx *ctx, struct mm_struct *mm)
old = rcu_dereference(mm->ioctx_table);
if (!old) {
+ table->next_free = 0;
rcu_assign_pointer(mm->ioctx_table, table);
} else if (table->nr > old->nr) {
+ table->next_free = old->nr;
memcpy(table->table, old->table,
old->nr * sizeof(struct kioctx *));
@@ -716,6 +720,8 @@ static void kill_ioctx(struct mm_struct *mm, struct kioctx *ctx)
WARN_ON(ctx != table->table[ctx->id]);
table->table[ctx->id] = NULL;
+ if (ctx->id < table->next_free)
+ table->next_free = ctx->id;
rcu_read_unlock();
spin_unlock(&mm->ioctx_lock);
--
1.7.7
--
To unsubscribe, send a message with 'unsubscribe linux-aio' in
the body to majordomo@kvack.org. For more info on Linux AIO,
see: http://www.kvack.org/aio/
Don't email: <a href=mailto:"aart@kvack.org">aart@kvack.org</a>
WARNING: multiple messages have this Message-ID (diff)
From: Gu Zheng <guz.fnst@cn.fujitsu.com>
To: Benjamin <bcrl@kvack.org>
Cc: linux-aio@kvack.org, fsdevel <linux-fsdevel@vger.kernel.org>,
linux-kernel <linux-kernel@vger.kernel.org>
Subject: [PATCH] aio: optimize free kioctx slot search
Date: Thu, 26 Dec 2013 18:22:10 +0800 [thread overview]
Message-ID: <52BC0352.2040504@cn.fujitsu.com> (raw)
Add a 'next_free' field into kioctx_table to store the next id that
may be free, in order to reduce the search region when we insert
kioctx into kioctx table.
When we take a free slot from kioctx_table, update 'next_free' to
the next slot. Also when we free one slot to kioctx_table, update 'next_free'
to the new free slot if it's smaller than 'next_free'. So that we can
ensure that the slots before 'next_free' are all used, and the search can start
from 'next_free' to reduce the search and improve the performance.
Signed-off-by: Gu Zheng <guz.fnst@cn.fujitsu.com>
---
fs/aio.c | 10 ++++++++--
1 files changed, 8 insertions(+), 2 deletions(-)
diff --git a/fs/aio.c b/fs/aio.c
index 062a5f6..489fda6 100644
--- a/fs/aio.c
+++ b/fs/aio.c
@@ -69,6 +69,7 @@ struct aio_ring {
struct kioctx_table {
struct rcu_head rcu;
unsigned nr;
+ unsigned next_free;
struct kioctx *table[];
};
@@ -548,11 +549,12 @@ static int ioctx_add_table(struct kioctx *ctx, struct mm_struct *mm)
table = rcu_dereference(mm->ioctx_table);
while (1) {
- if (table)
- for (i = 0; i < table->nr; i++)
+ if (table && table->next_free < table->nr)
+ for (i = table->next_free; i < table->nr; i++)
if (!table->table[i]) {
ctx->id = i;
table->table[i] = ctx;
+ table->next_free = i + 1;
rcu_read_unlock();
spin_unlock(&mm->ioctx_lock);
@@ -579,8 +581,10 @@ static int ioctx_add_table(struct kioctx *ctx, struct mm_struct *mm)
old = rcu_dereference(mm->ioctx_table);
if (!old) {
+ table->next_free = 0;
rcu_assign_pointer(mm->ioctx_table, table);
} else if (table->nr > old->nr) {
+ table->next_free = old->nr;
memcpy(table->table, old->table,
old->nr * sizeof(struct kioctx *));
@@ -716,6 +720,8 @@ static void kill_ioctx(struct mm_struct *mm, struct kioctx *ctx)
WARN_ON(ctx != table->table[ctx->id]);
table->table[ctx->id] = NULL;
+ if (ctx->id < table->next_free)
+ table->next_free = ctx->id;
rcu_read_unlock();
spin_unlock(&mm->ioctx_lock);
--
1.7.7
next reply other threads:[~2013-12-26 10:22 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-12-26 10:22 Gu Zheng [this message]
2013-12-26 10:22 ` [PATCH] aio: optimize free kioctx slot search Gu Zheng
2013-12-26 10:39 ` Miao Xie
2013-12-26 10:39 ` Miao Xie
2013-12-26 14:13 ` Matthew Wilcox
2013-12-27 10:32 ` Gu Zheng
2013-12-27 10:32 ` Gu Zheng
2013-12-27 12:32 ` Matthew Wilcox
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=52BC0352.2040504@cn.fujitsu.com \
--to=guz.fnst@cn.fujitsu.com \
--cc=bcrl@kvack.org \
--cc=linux-aio@kvack.org \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.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 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.