public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: ebiederm@xmission.com (Eric W. Biederman)
To: Andrew Morton <akpm@osdl.org>
Cc: linux-kernel@vger.kernel.org
Subject: Re: 2.6.6-mm5
Date: 22 May 2004 20:45:32 -0600	[thread overview]
Message-ID: <m11xlbsvxv.fsf@ebiederm.dsl.xmission.com> (raw)
In-Reply-To: <20040522180837.3d3cc8a9.akpm@osdl.org>

Andrew Morton <akpm@osdl.org> writes:

> ebiederm@xmission.com (Eric W. Biederman) wrote:
> >
> > Andrew Morton <akpm@osdl.org> writes:
> > 
> > >
> http://www.kernel.org/pub/linux/kernel/people/akpm/patches/2.6/2.6.6/2.6.6-mm5/
> 
> > >
> ftp://ftp.kernel.org/pub/linux/kernel/people/akpm/patches/2.6/2.6.6/2.6.6-mm5/
> 
> > > 
> > > 
> > > add-i386-readq.patch
> > >   add i386 readq()/writeq()
> > 
> > > static inline u64 readq(void *addr)
> > > {
> > > 	return readl(addr) | (((u64)readl(addr + 4)) << 32);
> > > }
> > > 
> > > static inline void writeq(u64 v, void *addr)
> > > {
> > > 	u32 v32;
> > > 
> > > 	v32 = v;
> > > 	writel(v32, addr);
> > > 	v32 = v >> 32;
> > > 	writel(v32, addr + 4);
> > > }
> > > 
> > > #endif
> > 
> > The implementation is broken and it will break drivers that actually
> > expect writeq and readq to be 64bit reads and writes.
> 
> I don't think we can expect all architectures to be able to implement
> atomic 64-bit IO's, can we?

No I don't think we can expect all architectures to be able to
generate 64-bit bus cycles.  Although I think we can expect a majority
of them to, and I believe that majority encompasses all the platforms
we want to run drivers that require readq and writeq.

There are some drivers that cannot be implemented on architectures
without 64bit transactions on the I/O bus.  This is not always a race
issue that can be fixed with locking.  I know of at least mtd map
driver where if you don't feed the device 64bit writes you will store
corrupt data.

If we want to use the above quoted functions we need to call them
readq_emulated and writeq_emulated.  Because they are not the real
mccoy.  Likely only readq_emulated and writeq_emulated can be
implemented on all architectures.

As I understand the current situation every architecture that
implements readq/writeq generates true 64bit bus cycles.  A driver can
test if it the support exists at compile time with a simple #ifdef to
see if the function is present.  If the function is not supported at
compile time the driver can implement a work around (like
readq_emulated) or it can fail to compile.

> ergo, drivers which want to use readq and writeq should provide the
> appropriate locking.

Hmm.  I thought the logic:
   I am going to introduce a broken implementation of a generic
   function and this will reduce the maintainability of your driver in
   subtle incomprehensible ways by not doing what is advertised.  In
   addition I will not even attempt to fix all of the drivers in the
   tree when I generate the patch.
did not fly in linux.

I am worried about the general and subtle breakage that may occur
from a driver that works when real 64bit read/writes are generated
on the bus, and fails when we emulate them.

Knowing of two drivers off the top of my head that will break
with this patch, I am opposed to it on general grounds.  The
infiniband driver is not in the tree and it can have locking
added to correct the additional race.  The 64bit mtd map drivers
I have seen for some ppc platrrom will break as soon as they stop
rolling readq/writeq by hand, and no amount of locking will help
there.  I don't know what else in the tree will break.

> > I attempted to suggest some alternative implementations earlier
> > in the original thread that brought this up but it looks like
> > you missed that.
> 
> I saw some stuff float past, but I don't recall seeing anything which would
> work on all architectures?

I am not yet convinced you can write code that will work on all
architectures.  I have yet to see generic code that with all
existing drivers.

I was attempting to start the conversation, because I don't know all
of the answers, I can just detect failures.  In general on a 32bit
arch you need to use the FPU to implement a 64bit read or write. This
is not something you can code casually in the kernel or that you can
write generically.  Although the basic idiom will likely be the same
for different architectures.

Currently I know of a safe version that will work on x86 on processors
with sse support.   And I how to generate 64bit I/O cycles with using
mmx or x87 registers,  but don't know if I can write code that touches
the FPU registers that is interrupt safe.

Eric



  parent reply	other threads:[~2004-05-23  2:47 UTC|newest]

Thread overview: 34+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2004-05-22  8:36 2.6.6-mm5 Andrew Morton
2004-05-22  9:09 ` 2.6.6-mm5 Jeff Garzik
2004-05-22  9:22   ` 2.6.6-mm5 hch
2004-05-22  9:26     ` 2.6.6-mm5 Andrew Morton
2004-05-22 11:51   ` 2.6.6-mm5 R. J. Wysocki
2004-05-22  9:26 ` 2.6.6-mm5 hch
2004-05-22  9:32   ` 2.6.6-mm5 Andrew Morton
2004-05-22  9:41     ` 2.6.6-mm5 hch
2004-05-22 19:03       ` 2.6.6-mm5 Brian King
2004-05-22  9:38 ` 2.6.6-mm5 hch
2004-05-22  9:44   ` 2.6.6-mm5 Jens Axboe
2004-05-22  9:46 ` 2.6.6-mm5 Felipe Alfaro Solana
2004-05-23 15:51   ` 2.6.6-mm5 James Morris
2004-05-22 11:59 ` 2.6.6-mm5 Matthias Andree
2004-05-22 12:19 ` [patch] 2.6.6-mm5: JFFS2_FS_NAND=y compile error Adrian Bunk
2004-05-23  1:01 ` 2.6.6-mm5 Eric W. Biederman
2004-05-23  1:08   ` 2.6.6-mm5 Andrew Morton
2004-05-23  1:15     ` 2.6.6-mm5 Roland Dreier
2004-05-24 16:17       ` 2.6.6-mm5 Matt Mackall
2004-05-24 17:03         ` 2.6.6-mm5 Eric W. Biederman
2004-05-24 17:43           ` 2.6.6-mm5 Roland Dreier
2004-05-25  7:25             ` 2.6.6-mm5 Eric W. Biederman
2004-05-23  2:45     ` Eric W. Biederman [this message]
2004-05-24 22:11 ` 2.6.6-mm5 (compile stats) John Cherry
2004-05-25 13:53 ` 2.6.6-mm5 Pavel Machek
2004-05-26 12:41 ` 2.6.6-mm5 Anders Gustafsson
2004-05-26 12:49   ` 2.6.6-mm5 Jens Axboe
2004-05-26 12:59     ` 2.6.6-mm5 Anders Gustafsson
2004-05-26 13:03       ` 2.6.6-mm5 Jens Axboe
  -- strict thread matches above, loose matches on Subject: below --
2004-05-22 10:27 2.6.6-mm5 Oleg Nesterov
2004-05-22 18:02 2.6.6-mm5 Adam Radford
     [not found] <1YAd2-6Th-13@gated-at.bofh.it>
     [not found] ` <1YPF4-2hJ-11@gated-at.bofh.it>
     [not found]   ` <1YPOI-2nq-1@gated-at.bofh.it>
     [not found]     ` <1YRdQ-3pu-5@gated-at.bofh.it>
2004-05-23 11:39       ` 2.6.6-mm5 Andi Kleen
2004-05-23 21:32         ` 2.6.6-mm5 Eric W. Biederman
2004-05-24  0:02         ` 2.6.6-mm5 Eric W. Biederman

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=m11xlbsvxv.fsf@ebiederm.dsl.xmission.com \
    --to=ebiederm@xmission.com \
    --cc=akpm@osdl.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