2009-04-16 15:38:05

by Chris Friesen

[permalink] [raw]
Subject: how to tell if arbitrary kernel memory address is backed by physical memory?

Hi all,

Quick question to the memory management folks.

Is there a portable way to tell whether a particular virtual address in
the lowmem address range is backed by physical memory and is readable?

For background...we have some guys working on a software memory scrubber
for an embedded board. The memory controller supports ECC but doesn't
support scrubbing in hardware. What we want to do is walk all of
lowmem, reading in memory. If a fault is encountered, it will be
handled by other code.

Thanks,

Chris


Subject: Re: how to tell if arbitrary kernel memory address is backed by physical memory?

On Thu, 16 Apr 2009, Chris Friesen wrote:

> Quick question to the memory management folks.
>
> Is there a portable way to tell whether a particular virtual address in the
> lowmem address range is backed by physical memory and is readable?
>
> For background...we have some guys working on a software memory scrubber for
> an embedded board. The memory controller supports ECC but doesn't support
> scrubbing in hardware. What we want to do is walk all of lowmem, reading in
> memory. If a fault is encountered, it will be handled by other code.

Virtual address in the lowmem address range? lowmem address ranges exist
for physical addresses.

If you walk lowmem (physical) then you will never see a missing page.

So I guess you have a process that wants to determine if its memory is
present? See

man 2 mincore

which describes a glibc call that shows which pages of a process are
present.

2009-04-17 16:15:44

by Chris Friesen

[permalink] [raw]
Subject: Re: how to tell if arbitrary kernel memory address is backed by physical memory?

Christoph Lameter wrote:
> On Thu, 16 Apr 2009, Chris Friesen wrote:

>> Is there a portable way to tell whether a particular virtual address in the
>> lowmem address range is backed by physical memory and is readable?
>>
>> For background...we have some guys working on a software memory scrubber for
>> an embedded board. The memory controller supports ECC but doesn't support
>> scrubbing in hardware. What we want to do is walk all of lowmem, reading in
>> memory. If a fault is encountered, it will be handled by other code.
>
> Virtual address in the lowmem address range? lowmem address ranges exist
> for physical addresses.
>
> If you walk lowmem (physical) then you will never see a missing page.

We have a mips board that appears to have holes in the lowmem mappings
such that blindly walking all of it causes problems. I assume the
allocator knows about these holes and simply doesn't assign memory at
those addresses.

We may have found a solution though...it looks like virt_addr_valid()
returns false for the problematic addresses. Would it be reasonable to
call this once for each page before trying to access it?

Chris

Subject: Re: how to tell if arbitrary kernel memory address is backed by physical memory?


On Fri, 17 Apr 2009, Chris Friesen wrote:

> We have a mips board that appears to have holes in the lowmem mappings such
> that blindly walking all of it causes problems. I assume the allocator knows
> about these holes and simply doesn't assign memory at those addresses.

Yes memory is registered in distinct ranges during boot.

> We may have found a solution though...it looks like virt_addr_valid() returns
> false for the problematic addresses. Would it be reasonable to call this once
> for each page before trying to access it?

Sure. Note that virt_addr_valid only ensures that there is a page
struct for that address. You may need to ensure that PageReserved(page) is
false if you want to make sure that you have actual memory there that is
valid to use.