mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Linus Torvalds <torvalds@osdl.org>
To: Mikulas Patocka <mikulas@artax.karlin.mff.cuni.cz>
Cc: linux-kernel@vger.kernel.org
Subject: Re: New filesystem for Linux
Date: Thu, 2 Nov 2006 15:15:33 -0800 (PST)	[thread overview]
Message-ID: <Pine.LNX.4.64.0611021458240.25218@g5.osdl.org> (raw)
In-Reply-To: <Pine.LNX.4.64.0611022221330.4104@artax.karlin.mff.cuni.cz>



On Thu, 2 Nov 2006, Mikulas Patocka wrote:
> 
> * There is a rw semaphore that is locked for read for nearly all operations
> and locked for write only rarely. However locking for read causes cache line
> pingpong on SMP systems. Do you have an idea how to make it better?

In a filesystem, I doubt you should ever really notice, since it should 
hopefully be called mainly for operations that need IO, not for cached 
stuff. The one exception tends to be "readdir()", which calls down to the 
filesystem even though the directory is cached, because the VFS cannot 
parse the directory structure on its own.

So in fact, a regular lock can be _better_ than a rw-lock for precisely 
the thing you noticed: the lock itself will still ping-pong, but you may 
find that other data structures end up more well-behaved.

That said, if you <i>really</i> want to make reads go fast, and you can 
share all the data structures well across CPU's (ie you don't do things 
that dirty cachelines), then RCU is likely your best bet. It limits you in 
certain ways to exactly what you can do, but it certainly allows unlimited 
read-side scalability.

Also, you might look into <linux/seqlock.h> if your data structures are 
stable enough to be used in that kind of schenario.

Both seqlocks and RCU essentially requires that you are atomic in the 
sequence (ie you can't do IO). They also require that no writers will ever 
cause the situation that the data structures can ever cause _problems_ for 
an unsynchronized reader - the reader will go ahead as if the writer 
didn't exist at all (which is what allows things to be fast).

(Seqlocks could be changed to drop the first requirement, although it 
could cause some serious starvation issues, so I'm not sure it's a good 
idea. For RCU the atomic nature is pretty much designed-in.)

> It could be improved by making a semaphore for each CPU and locking for read
> only the CPU's semaphore and for write all semaphores. Or is there a better
> method?

No. Don't go down there. It's a total mess, and really not worth it. The 
deadlocks, the write starvation, everything. If you can't make things work 
with either RCU or seqlocks, just use a regular semaphore.

> * This leads to another observation --- on i386 locking a semaphore is 2
> instructions, on x86_64 it is a call to two nested functions. Has it some
> reason or was it just implementator's laziness? Given the fact that locked
> instruction takes 16 ticks on Opteron (and can overlap about 2 ticks with
> other instructions), it would make sense to have optimized semaphores too.

It's generally not worth worrying about. We started doing spinlocks out of 
line, essentially because the instruction overhead was less than the I$ 
overhead (it also allowed us to do the code sharing with debugging locks 
more easily).

You do want to avoid locking overhead (so if you're nesting very deep, you 
have problems, but your problems are worse than the few extra function 
calls). I doubt you'll hit it in practice - see the initial comment on why 
things like the FS really should be totally invisible anyway. Apart from 
things like readdir() (and possibly "revalidate()", but in a local 
filesystem that shouldn't be an issue), you should worry a lot more about 
the IO costs than about the CPU costs.

> * How to implement ordered-data consistency? That would mean that on internal
> sync event, I'd have to flush all pages of a files that were extended. I could
> scan all dirty inodes and find pages to flush --- what kernel function would
> you recommend for doing it? Currently I call only sync_blockdev which doesn't
> touch buffers attached to pages.

You're not going to get data consistency with memory-mapped usage anyway, 
without the app helping you with msync() etc. 

		Linus

  parent reply	other threads:[~2006-11-02 23:15 UTC|newest]

Thread overview: 99+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2006-11-02 21:52 Mikulas Patocka
2006-11-02 22:32 ` Gabriel C
2006-11-03  1:22   ` Mikulas Patocka
2006-11-03  1:41     ` Andrew Morton
2006-11-03 17:14       ` Oleg Verych
2006-11-03 17:09         ` Mikulas Patocka
2006-11-03 17:36           ` Oleg Verych
2006-11-03 18:14             ` Mikulas Patocka
2006-11-03 19:08             ` Adrian Bunk
2006-11-03 19:32               ` Oleg Verych
2006-11-03 19:00         ` Alan Cox
2006-11-03 19:14           ` Andi Kleen
2006-11-03  2:09     ` Gabriel C
2006-11-03  8:26       ` Jan Engelhardt
2006-11-03 11:52         ` Mikulas Patocka
2006-11-03 11:59           ` Mikulas Patocka
2006-11-03 12:50             ` Jan Engelhardt
2006-11-03 18:48               ` Mikulas Patocka
2006-11-03 21:51                 ` Jan Engelhardt
2006-11-03 11:47       ` Mikulas Patocka
2006-11-02 22:53 ` Eric Dumazet
2006-11-03  1:28   ` Mikulas Patocka
2006-11-03  1:43     ` Andrew Morton
2006-11-04 18:40   ` Mikulas Patocka
2006-11-04 19:07     ` Eric Dumazet
2006-11-04 19:39     ` Tomasz Torcz
2006-11-05  1:58     ` Alan Cox
2006-11-05  2:09       ` Patrick McFarland
2006-11-05 13:03     ` Maurizio Lombardi
2006-11-05 20:16       ` H. Peter Anvin
2006-11-02 22:54 ` Grzegorz Kulewski
2006-11-02 23:10   ` Eric Dumazet
2006-11-02 23:19   ` Mikulas Patocka
2006-11-02 23:29     ` Grzegorz Kulewski
2006-11-03  1:34       ` Mikulas Patocka
2006-11-03 20:30         ` Christoph Lameter
2006-11-04 18:46           ` Mikulas Patocka
2006-11-05 12:02             ` Theodore Tso
2006-11-03 22:00         ` Oleg Verych
2006-11-03 22:42           ` Mikulas Patocka
2006-11-03  0:57     ` Nigel Cunningham
2006-11-03 13:05     ` Ric Wheeler
2006-11-06  2:42     ` Phillip Susi
2006-11-04 19:59   ` Albert Cahalan
2006-11-04 21:01     ` Jan-Benedict Glaw
2006-11-05 16:37       ` Albert Cahalan
2006-11-04 23:38     ` Mikulas Patocka
2006-11-04 23:46       ` Kyle Moffett
2006-11-05 20:26         ` H. Peter Anvin
2006-11-05 21:27           ` Rene Herman
2006-11-05 21:51             ` H. Peter Anvin
2006-11-06  0:36               ` Rene Herman
2006-11-05 21:49       ` Pavel Machek
2006-11-05  1:57     ` Alan Cox
2006-11-05 11:14       ` James Courtier-Dutton
2006-11-05 11:27         ` Brad Campbell
2006-11-05 12:37           ` Alan Cox
2006-11-06  2:48           ` Phillip Susi
2006-11-05 16:22         ` Albert Cahalan
2006-11-05 17:18       ` Mikulas Patocka
2006-11-05 18:14         ` Alan Cox
2006-11-05 18:18           ` Mikulas Patocka
2006-11-05 19:14             ` Alan Cox
2006-11-02 23:15 ` Linus Torvalds [this message]
2006-11-03 20:02   ` Paul E. McKenney
2006-11-02 23:41 ` Andi Kleen
2006-11-03  1:45   ` Mikulas Patocka
2006-11-03 13:47     ` Nikita Danilov
2006-11-03 14:39       ` Mikulas Patocka
2006-11-02 23:59 ` Jörn Engel
2006-11-03  1:19   ` Mikulas Patocka
2006-11-03 10:19     ` Jörn Engel
2006-11-03 11:56       ` Mikulas Patocka
2006-11-03 12:21         ` Jörn Engel
2006-11-03 13:31           ` Mikulas Patocka
2006-11-03 13:48             ` Jörn Engel
2006-11-03 14:19               ` Mikulas Patocka
2006-11-03 14:53                 ` Jörn Engel
2006-11-03 19:01                   ` Mikulas Patocka
2006-11-04 10:46                     ` Jörn Engel
2006-11-04 18:50                       ` Mikulas Patocka
2006-11-06 21:19                         ` Jörn Engel
2006-11-03 19:51             ` Adrian Bunk
2006-11-03 19:00     ` dean gaudet
2006-11-04 10:53       ` Jörn Engel
2006-11-04 11:13         ` dean gaudet
2006-11-04 20:07           ` Jörn Engel
2006-11-04 18:52       ` Mikulas Patocka
2006-11-04 18:56         ` Grzegorz Kulewski
2006-11-04 19:18           ` Mikulas Patocka
2006-11-04 17:37 ` Gautham R Shenoy
2006-11-04 18:27   ` Eric Dumazet
2006-11-05 22:33     ` Paul E. McKenney
2006-11-05  0:52 ` Linus Torvalds
2006-11-05  4:14   ` Mikulas Patocka
2006-11-05  8:34     ` Willy Tarreau
2006-11-05 11:31       ` Jan Engelhardt
2006-11-05 14:48     ` Bruno Cesar Ribas
2006-11-06 17:40 Al Boldi

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=Pine.LNX.4.64.0611021458240.25218@g5.osdl.org \
    --to=torvalds@osdl.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mikulas@artax.karlin.mff.cuni.cz \
    /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

all inboxes | Powered by JetHome®