This patch removes filp_count_lock spinlock, used to protect 
files_stat.nr_files.

Just use atomic_t type and atomic_inc()/atomic_dec() operations.

This patch assumes that atomic_read() is a plain {return v->counter;} on all architectures. (keywords : sysctl, /proc/sys/fs/file-nr, proc_dointvec)

Signed-off-by: Eric Dumazet <[EMAIL PROTECTED]>
diff -Nru linux-2.6.13-rc7/fs/file_table.c linux-2.6.13-rc7-ed/fs/file_table.c
--- linux-2.6.13-rc7/fs/file_table.c    2005-08-24 05:39:14.000000000 +0200
+++ linux-2.6.13-rc7-ed/fs/file_table.c 2005-08-25 10:41:00.000000000 +0200
@@ -28,29 +28,21 @@
 /* public. Not pretty! */
  __cacheline_aligned_in_smp DEFINE_SPINLOCK(files_lock);
 
-static DEFINE_SPINLOCK(filp_count_lock);
 
 /* slab constructors and destructors are called from arbitrary
- * context and must be fully threaded - use a local spinlock
- * to protect files_stat.nr_files
+ * context and must be fully threaded
  */
 void filp_ctor(void * objp, struct kmem_cache_s *cachep, unsigned long cflags)
 {
        if ((cflags & (SLAB_CTOR_VERIFY|SLAB_CTOR_CONSTRUCTOR)) ==
            SLAB_CTOR_CONSTRUCTOR) {
-               unsigned long flags;
-               spin_lock_irqsave(&filp_count_lock, flags);
-               files_stat.nr_files++;
-               spin_unlock_irqrestore(&filp_count_lock, flags);
+               atomic_inc(&files_stat.nr_files);
        }
 }
 
 void filp_dtor(void * objp, struct kmem_cache_s *cachep, unsigned long dflags)
 {
-       unsigned long flags;
-       spin_lock_irqsave(&filp_count_lock, flags);
-       files_stat.nr_files--;
-       spin_unlock_irqrestore(&filp_count_lock, flags);
+       atomic_dec(&files_stat.nr_files);
 }
 
 static inline void file_free(struct file *f)
@@ -70,7 +62,7 @@
        /*
         * Privileged users can go above max_files
         */
-       if (files_stat.nr_files >= files_stat.max_files &&
+       if (atomic_read(&files_stat.nr_files) >= files_stat.max_files &&
                                !capable(CAP_SYS_ADMIN))
                goto over;
 
@@ -94,10 +86,10 @@
 
 over:
        /* Ran out of filps - report that */
-       if (files_stat.nr_files > old_max) {
+       if (atomic_read(&files_stat.nr_files) > old_max) {
                printk(KERN_INFO "VFS: file-max limit %d reached\n",
                                        files_stat.max_files);
-               old_max = files_stat.nr_files;
+               old_max = atomic_read(&files_stat.nr_files);
        }
        goto fail;
 
diff -Nru linux-2.6.13-rc7/fs/xfs/linux-2.6/xfs_linux.h 
linux-2.6.13-rc7-ed/fs/xfs/linux-2.6/xfs_linux.h
--- linux-2.6.13-rc7/fs/xfs/linux-2.6/xfs_linux.h       2005-08-24 
05:39:14.000000000 +0200
+++ linux-2.6.13-rc7-ed/fs/xfs/linux-2.6/xfs_linux.h    2005-08-25 
10:41:00.000000000 +0200
@@ -242,7 +242,7 @@
 
 /* IRIX uses the current size of the name cache to guess a good value */
 /* - this isn't the same but is a good enough starting point for now. */
-#define DQUOT_HASH_HEURISTIC   files_stat.nr_files
+#define DQUOT_HASH_HEURISTIC   atomic_read(&files_stat.nr_files)
 
 /* IRIX inodes maintain the project ID also, zero this field on Linux */
 #define DEFAULT_PROJID 0
diff -Nru linux-2.6.13-rc7/include/linux/fs.h 
linux-2.6.13-rc7-ed/include/linux/fs.h
--- linux-2.6.13-rc7/include/linux/fs.h 2005-08-24 05:39:14.000000000 +0200
+++ linux-2.6.13-rc7-ed/include/linux/fs.h      2005-08-25 10:41:00.000000000 
+0200
@@ -30,7 +30,7 @@
 
 /* And dynamically-tunable limits and defaults: */
 struct files_stat_struct {
-       int nr_files;           /* read only */
+       atomic_t nr_files;              /* read only */
        int nr_free_files;      /* read only */
        int max_files;          /* tunable */
 };

Reply via email to