From: Eric Dumazet <dada1@cosmosbay.com>
To: Christoph Hellwig <hch@infradead.org>
Cc: Andrew Morton <akpm@osdl.org>, linux-kernel@vger.kernel.org
Subject: Re: [PATCH] removes filp_count_lock and changes nr_files type to atomic_t
Date: Thu, 25 Aug 2005 12:41:22 +0200 [thread overview]
Message-ID: <430DA052.9070908@cosmosbay.com> (raw)
In-Reply-To: <20050825092322.GA9902@infradead.org>
[-- Attachment #1: Type: text/plain, Size: 996 bytes --]
Christoph Hellwig a écrit :
> On Thu, Aug 25, 2005 at 11:17:23AM +0200, Eric Dumazet wrote:
>
>>>But that's not true. You need to write you own sysctl handler for it,
>>>probably worth adding a generic atomic_t sysctl handler while you're
>>>at it.
>>>
>>
>>I checked linux-2.6.13-rc7 tree, and atomic_read() is just a wrapper to
>>read v->counter.
>
>
> That doesn't matter. atomic_t is an opaqueue type and you must use the
> atomic_* interfaces to access it.
OK, here is a new clean patch that address this problem (nothing assumed about
atomics)
This patch removes filp_count_lock spinlock, used to protect files_stat.nr_files.
Introduce an atomic_t atomic_nr_files to keep the exact count, and mirror its
value into nr_files.
Forcing atomic_nr_files to be in the same cache line than nr_files makes sure
we dont dirty two cache lines.
There is still a locked memory operation on SMP, but it saves an sti/cli pair.
Thank you
Signed-off-by: Eric Dumazet <dada1@cosmosbay.com>
[-- Attachment #2: patch_filp_count_lock --]
[-- Type: text/plain, Size: 2589 bytes --]
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 12:18:02.000000000 +0200
@@ -19,38 +19,28 @@
#include <linux/fsnotify.h>
/* sysctl tunables... */
-struct files_stat_struct files_stat = {
- .max_files = NR_FILE
-};
+struct files_stat_struct files_stat;
EXPORT_SYMBOL(files_stat); /* Needed by unix.o */
/* 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);
+ files_stat.nr_files = atomic_add_return(1, &files_stat.atomic_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);
+ files_stat.nr_files = atomic_sub_return(1, &files_stat.atomic_nr_files);
}
static inline void file_free(struct file *f)
@@ -258,4 +248,5 @@
files_stat.max_files = n;
if (files_stat.max_files < NR_FILE)
files_stat.max_files = NR_FILE;
+ atomic_set(&files_stat.atomic_nr_files, 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 12:39:07.000000000 +0200
@@ -9,6 +9,8 @@
#include <linux/config.h>
#include <linux/limits.h>
#include <linux/ioctl.h>
+#include <linux/cache.h>
+#include <asm/atomic.h>
/*
* It's silly to have NR_OPEN bigger than NR_FILE, but you can change
@@ -30,10 +32,12 @@
/* And dynamically-tunable limits and defaults: */
struct files_stat_struct {
- int nr_files; /* read only */
+ int nr_files; /* mirrors atomic_nr_files value */
int nr_free_files; /* read only */
int max_files; /* tunable */
-};
+
+ atomic_t atomic_nr_files;
+} ____cacheline_aligned;
extern struct files_stat_struct files_stat;
struct inodes_stat_t {
next prev parent reply other threads:[~2005-08-25 10:41 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2005-08-24 21:46 [patch] Additions to .data.read_mostly section Ravikiran G Thirumalai
2005-08-24 22:38 ` Eric Dumazet
2005-08-25 7:56 ` Arjan van de Ven
2005-08-25 8:45 ` [PATCH] removes filp_count_lock and changes nr_files type to atomic_t Eric Dumazet
2005-08-25 9:05 ` Arjan van de Ven
2005-08-25 9:20 ` Eric Dumazet
2005-08-25 9:31 ` Arjan van de Ven
2005-08-25 9:08 ` Christoph Hellwig
2005-08-25 9:17 ` Eric Dumazet
2005-08-25 9:23 ` Christoph Hellwig
2005-08-25 10:41 ` Eric Dumazet [this message]
2005-08-25 11:11 ` Nick Piggin
2005-08-25 12:26 ` Eric Dumazet
2005-08-25 14:51 ` Nick Piggin
2005-08-25 14:56 ` Christoph Hellwig
2005-08-25 15:13 ` Eric Dumazet
2005-08-25 18:19 ` Dipankar Sarma
2005-08-25 18:36 ` Christoph Hellwig
2005-08-26 1:16 ` Nick Piggin
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=430DA052.9070908@cosmosbay.com \
--to=dada1@cosmosbay.com \
--cc=akpm@osdl.org \
--cc=hch@infradead.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox