All of lore.kernel.org
 help / color / mirror / Atom feed
From: "H. Peter Anvin" <hpa@zytor.com>
To: Mikael Pettersson <mikpe@it.uu.se>
Cc: Yinghai Lu <yinghai@kernel.org>,
	Linus Torvalds <torvalds@linux-foundation.org>,
	Ingo Molnar <mingo@elte.hu>, Matthew Wilcox <matthew@wil.cx>,
	Grant Grundler <grundler@parisc-linux.org>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	linux-pci@vger.kernel.org
Subject: Re: [BUG 2.6.31-rc1] HIGHMEM64G causes hang in PCI init on 32-bit x86
Date: Tue, 30 Jun 2009 07:48:17 -0700	[thread overview]
Message-ID: <4A4A25B1.5010102@zytor.com> (raw)
In-Reply-To: <19017.53428.834539.389495@pilspetsen.it.uu.se>

Mikael Pettersson wrote:
> 
> Thanks, 2.6.31-rc1 vanilla (which didn't boot) plus this one does boot.
> /proc/iomem now looks as follows:
> 

... as it should.  So far so good, and this is a real problem.

However, there is something that really bothers me: *why does this help
on Mikael's system, which is PAE and therefore has a 64-bit
resource_size_t*?  This whole patch should be a no-op!  There is still
something that doesn't make sense.

The use of "unsigned long" in ram_alignment() will overflow after 2^52
bytes, but again, that's not the issue here, since the highest "start"
value we have is (0x2 << 32).

By process of elimination, the culprit must be round_up(), which reveals
that the macro definition of round_up() has a *very* sublte behavior
with mixed types:

#define round_up(x, y) (((x) + (y) - 1) & ~((y) - 1))

ram_alignment() returns unsigned long, which becomes (y).  This means
that the mask word on the right hand of the & gets truncated to 32 bits
*before* the masking happens -- since ((y) - 1) is still unsigned long,
inverting it will not set bits [63..32] to on.

I think this macro is actively dangerous.  Better would be:

({ __typeof__(x) __mask = (y)-1;  ((x)+__mask) & ~__mask; })

... which is also multiple-inclusion-free at the cost of using gcc
({...}) constructs.

The deep irony in this is that in our particular case is perhaps that
align_up(x,y)-1 is the same thing as x | (y-1) which would have avoided
the problem...

	-hpa

-- 
H. Peter Anvin, Intel Open Source Technology Center
I work for Intel.  I don't speak on their behalf.


  reply	other threads:[~2009-06-30 14:50 UTC|newest]

Thread overview: 56+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-06-26 15:59 [BUG 2.6.31-rc1] HIGHMEM64G causes hang in PCI init on 32-bit x86 Mikael Pettersson
2009-06-27  1:13 ` Mikael Pettersson
2009-06-27  4:25   ` Grant Grundler
2009-06-27  5:31     ` H. Peter Anvin
2009-06-29  2:24       ` Grant Grundler
2009-06-27  9:42     ` Mikael Pettersson
2009-06-27 19:27       ` H. Peter Anvin
2009-06-27 21:34         ` Mikael Pettersson
2009-06-27  4:53   ` H. Peter Anvin
2009-06-27  9:45     ` Mikael Pettersson
2009-06-29  2:29       ` Grant Grundler
2009-06-29  5:00         ` H. Peter Anvin
2009-06-29 11:12           ` Mikael Pettersson
2009-06-29 11:21             ` Matthew Wilcox
2009-06-29 11:57               ` Mikael Pettersson
2009-06-29 18:29                 ` H. Peter Anvin
2009-06-29 22:47                   ` Yinghai Lu
2009-06-29 23:29                     ` Yinghai Lu
2009-06-30  0:27                       ` H. Peter Anvin
2009-06-30  1:14                         ` Yinghai Lu
2009-06-30  1:18                           ` H. Peter Anvin
2009-06-30  1:24                             ` Yinghai Lu
2009-06-30  2:41                               ` H. Peter Anvin
2009-06-30  1:26                           ` Linus Torvalds
2009-06-30  1:41                             ` Yinghai Lu
2009-06-30  8:45                               ` Mikael Pettersson
2009-06-30 14:48                                 ` H. Peter Anvin [this message]
2009-06-30 15:00                                   ` Rolf Eike Beer
2009-06-30 18:52                                     ` H. Peter Anvin
2009-06-30 19:33                                   ` Yinghai Lu
2009-06-30 19:44                                     ` H. Peter Anvin
2009-06-30 20:05                                       ` Yinghai Lu
2009-06-30 21:21                                         ` H. Peter Anvin
2009-06-30 21:50                                           ` Yinghai Lu
2009-06-30 22:10                                             ` Linus Torvalds
2009-06-30 22:30                                               ` Yinghai Lu
2009-06-30 22:51                                                 ` Yinghai Lu
2009-06-30 22:54                                                   ` H. Peter Anvin
2009-06-30 23:00                                                 ` Linus Torvalds
2009-06-30 23:04                                                   ` Linus Torvalds
2009-06-30 23:13                                                     ` Yinghai Lu
2009-06-30 23:19                                                       ` H. Peter Anvin
2009-07-01 19:32                                                         ` [PATCH] x86: add boundary check for 32bit res before expand e820 resource to alignment Yinghai Lu
2009-07-01 19:33                                                           ` [PATCH] fix round_up/down Yinghai Lu
2009-07-01 19:39                                                             ` Joe Perches
2009-07-01 20:02                                                               ` Andrew Morton
2009-07-02 18:10                                                           ` [PATCH] x86: add boundary check for 32bit res before expand e820 resource to alignment -v2 Yinghai Lu
2009-07-03  8:05                                                             ` Ingo Molnar
2009-06-30 23:16                                                   ` [BUG 2.6.31-rc1] HIGHMEM64G causes hang in PCI init on 32-bit x86 H. Peter Anvin
2009-06-30 20:10                                   ` Linus Torvalds
2009-06-30  1:44                             ` H. Peter Anvin
2009-06-30  0:22                     ` H. Peter Anvin
2009-06-27 19:33 ` [tip:x86/urgent] Revert "x86: cap iomem_resource to addressable physical memory" tip-bot for H. Peter Anvin
2009-06-27 21:49   ` Mikael Pettersson
2009-06-27 22:04 ` tip-bot for H. Peter Anvin
2009-06-28  7:39 ` tip-bot for H. Peter Anvin

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=4A4A25B1.5010102@zytor.com \
    --to=hpa@zytor.com \
    --cc=grundler@parisc-linux.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-pci@vger.kernel.org \
    --cc=matthew@wil.cx \
    --cc=mikpe@it.uu.se \
    --cc=mingo@elte.hu \
    --cc=torvalds@linux-foundation.org \
    --cc=yinghai@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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.