linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: "Wilcox, Matthew R" <matthew.r.wilcox@intel.com>
To: Linus Torvalds <torvalds@linux-foundation.org>,
	Roland Dreier <roland@purestorage.com>,
	Andrew Morton <akpm@linux-foundation.org>,
	Hitoshi Mitake <h.mitake@gmail.com>,
	James Bottomley <James.Bottomley@parallels.com>,
	Ingo Molnar <mingo@elte.hu>
Cc: "linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	"linux-nvme@infradead.org" <linux-nvme@infradead.org>,
	"hpa@linux.intel.com" <hpa@linux.intel.com>
Subject: RE: [PATCH] NVMe: Fix compilation on architecturs without readq/writeq
Date: Fri, 20 Jan 2012 17:43:51 +0000	[thread overview]
Message-ID: <100D68C7BA14664A8938383216E40DE0012321@FMSMSX106.amr.corp.intel.com> (raw)
In-Reply-To: <CA+55aFwmDbDm5+12Nc0wnu7J8dsOKW0tCd_tVf-3pwQOq9MF3w@mail.gmail.com>

Yep, I knew I could check for readq with an ifdef, but I'd rather just use the 32-bit versions everywhere and have consistent behaviour between bittedness.  If this were a performance path, I'd absolutely do what you suggest.

One minor point is that '|' is not a sequence point, so it's not defined whether you'll read the top or bottom half of the register first.  And some hardware people are crazy enough to care.

For this particular hardware, it's defined to work if you read the low order bits first, so I went with the nvme_readq() function to emphasise that this solution works for the nvme driver.

-----Original Message-----
From: linus971@gmail.com [mailto:linus971@gmail.com] On Behalf Of Linus Torvalds
Sent: Thursday, January 19, 2012 5:22 PM
To: Wilcox, Matthew R; Roland Dreier; Andrew Morton; Hitoshi Mitake; James Bottomley; Ingo Molnar
Cc: linux-kernel@vger.kernel.org; linux-nvme@infradead.org; hpa@linux.intel.com
Subject: Re: [PATCH] NVMe: Fix compilation on architecturs without readq/writeq

On Thu, Jan 19, 2012 at 5:01 PM, Matthew Wilcox
<matthew.r.wilcox@intel.com> wrote:
> The only places that uses readq/writeq are in the initialisation
> path.  Since they're not performance critical, always use readl/writel.

The arch rules are that i fthe architecture has readq/writeq, they
will be #define'd (they may be inline functions, but there will be a

  #define readq readq

to make it visible to the preprocessor as well).

So if you don't need the atomicity guarantees of a "real" readq, you
can do this instead:

  #ifndef readq
  static inline u64 readq(void __iomem *addr)
  {
        return readl(addr) | (((u64) readl(addr + 4)) << 32LL);
  }
  #endif

and then use readq() as if it existed.

And I do think we should expose this in some generic manner. Because
we currently don't, we already have that pattern copied in quite a few
drivers.

Maybe <asm-generic/io-nonatomic.h> or something? Making it clear that
its not atomic, but avoiding the silly duplication we do now..

This whole mess was introduced in commit dbee8a0affd5 ("x86: remove
32-bit versions of readq()/writeq()"), and it already talked about the
problems but didn't help with the drivers that simply don't care.

All the people in those threads were doing their self-satisfied
"writeq is broken", without much acknowledging that 99% of users
simply don't seem to care.

"Occupy Writeq - We are the 99%"

                Linus

  reply	other threads:[~2012-01-20 17:52 UTC|newest]

Thread overview: 27+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-01-20  1:01 [PATCH] NVMe: Fix compilation on architecturs without readq/writeq Matthew Wilcox
2012-01-20  1:21 ` Linus Torvalds
2012-01-20 17:43   ` Wilcox, Matthew R [this message]
2012-01-21  8:28   ` Ingo Molnar
2012-01-21 15:54     ` Hitoshi Mitake
2012-01-21 16:58       ` Ingo Molnar
2012-01-23 16:05         ` Hitoshi Mitake
2012-01-23 16:57           ` Linus Torvalds
2012-01-23 23:04             ` H. Peter Anvin
2012-01-29  8:02             ` Hitoshi Mitake
2012-01-31  3:03               ` Linus Torvalds
2012-01-31  3:05                 ` Linus Torvalds
2012-02-04 15:25                   ` Hitoshi Mitake
2012-01-31 11:58                 ` Alan Cox
2012-01-31 12:09                   ` Ingo Molnar
2012-01-31 12:18                     ` Alan Cox
2012-01-31 12:23                       ` Ingo Molnar
2012-02-01 23:35                         ` Linus Torvalds
2012-02-02  1:05                           ` James Bottomley
2012-02-02  1:15                             ` Linus Torvalds
2012-02-02 15:05                             ` H. Peter Anvin
2012-02-04 15:39                               ` Hitoshi Mitake
2012-02-05  6:53                                 ` Geert Uytterhoeven
2012-02-05  7:01                                   ` Hitoshi Mitake
2012-02-04 15:34                             ` Hitoshi Mitake
2012-02-07  2:48                               ` Hitoshi Mitake
2012-02-04 15:24                 ` Hitoshi Mitake

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=100D68C7BA14664A8938383216E40DE0012321@FMSMSX106.amr.corp.intel.com \
    --to=matthew.r.wilcox@intel.com \
    --cc=James.Bottomley@parallels.com \
    --cc=akpm@linux-foundation.org \
    --cc=h.mitake@gmail.com \
    --cc=hpa@linux.intel.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-nvme@infradead.org \
    --cc=mingo@elte.hu \
    --cc=roland@purestorage.com \
    --cc=torvalds@linux-foundation.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;
as well as URLs for NNTP newsgroup(s).