Re: [PATCH] reducing overheads in fget/fput

From: Andrew Morton (akpm@digeo.com)
Date: Fri May 02 2003 - 15:54:04 EST


Dipankar Sarma <dipankar@in.ibm.com> wrote:
>
> > That shouldn't be very difficult to fix. For the fget_light/fput_light
> > pair in a syscall, we make the files->count == 1 check only once at the
> > beginning. Do you see a problem with that ?
>
> Here is a patch that fixes that.

This patch is fairly foul.

> kernel sys time std-dev
> ------------ -------- -------
> UP - vanilla 2.104 0.028
> SMP - vanilla 2.976 0.023
> UP - file 1.867 0.019
> SMP - file 2.719 0.026

But it is localised, and makes a substantial difference.

I inlined fput_light:

diff -puN fs/file_table.c~fget-speedup-inline-fput_light fs/file_table.c
--- 25/fs/file_table.c~fget-speedup-inline-fput_light Fri May 2 13:51:45 2003
+++ 25-akpm/fs/file_table.c Fri May 2 13:52:23 2003
@@ -141,19 +141,12 @@ void close_private_file(struct file *fil
         security_file_free(file);
 }
 
-void fput(struct file * file)
+void fput(struct file *file)
 {
         if (atomic_dec_and_test(&file->f_count))
                 __fput(file);
 }
 
-void fput_light(struct file * file, int flag)
-{
- if (unlikely(flag))
- if (atomic_dec_and_test(&file->f_count))
- __fput(file);
-}
-
 /* __fput is called from task context when aio completion releases the last
  * last use of a struct file *. Do not use otherwise.
  */
diff -puN include/linux/file.h~fget-speedup-inline-fput_light include/linux/file.h
--- 25/include/linux/file.h~fget-speedup-inline-fput_light Fri May 2 13:51:45 2003
+++ 25-akpm/include/linux/file.h Fri May 2 13:52:52 2003
@@ -35,7 +35,13 @@ struct files_struct {
 
 extern void FASTCALL(__fput(struct file *));
 extern void FASTCALL(fput(struct file *));
-extern void FASTCALL(fput_light(struct file *, int));
+
+static inline void fput_light(struct file *file, int flag)
+{
+ if (unlikely(flag))
+ fput(file);
+}
+
 extern struct file * FASTCALL(fget(unsigned int fd));
 extern struct file * FASTCALL(fget_light(unsigned int fd, int *flag));
 extern void FASTCALL(set_close_on_exec(unsigned int fd, int flag));

_

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



This archive was generated by hypermail 2b29 : Wed May 07 2003 - 22:00:17 EST