Clarifications on PFN_UP(x) macro

Tobias Boege tobias at
Tue Jun 4 08:34:07 EDT 2013

On Tue, 04 Jun 2013, stl wrote:
> Hello,
> I need some clarifications concerning the macro
> #define PFN_UP(x)    (((x) + PAGE_SIZE-1) >> PAGE_SHIFT)
> found in "pfn.h"
> I suppose that its aim is to give the page frame number of the page
> following the page holding the physical address x, contrary to
> PFN_DOWN(x) which give the page frame number of the page holding the
> address x.
> Assuming that the first page has the range 0x0000 to 0x0FFF,
> the second 0x1000 to 0x1FFF and so on, it seems that there is
> an issu with the starting address of each page, for example:
> x = 0x10000  (PFN number 10)
> 0x10000 + 0xFFF >> 12    =    10, but should be 11 no?
> I certainly misunderstood something.
> Could someone clarify this point please?

Your calculation is good. Your understanding of what the macro does is not.
You should understand the macro like "return the address of the next page
relative to this address" which includes the address as is if it is page-


More information about the Kernelnewbies mailing list