On thu, 26 Dec 2013 18:22:10 +0800, Gu Zheng wrote:
> 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 <[email protected]>

Reviewed-by: Miao Xie <[email protected]>

Thanks
Miao

> ---
>  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);
>  
> 

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to