On Mon, Mar 10, 2014 at 11:32:17AM -0700, Sebastian Capella wrote:
I've moved to this second implementation. I don't think I understand the ramifications enough to add the virt_to_pfn call for arm.
Let's look at the implementations...
#define __pa(x) __virt_to_phys((unsigned long)(x)) static inline phys_addr_t __virt_to_phys(unsigned long x) { return (phys_addr_t)x - PAGE_OFFSET + PHYS_OFFSET; }
So, __pa() returns a phys_addr_t (which may be either 32-bit or 64-bit).
#define virt_to_pfn(kaddr) (__pa(kaddr) >> PAGE_SHIFT)
And that will do an appropriate shift to convert the phys_addr_t to a PFN, which will be fine to assign to an unsigned long variable.
#define __phys_to_pfn(paddr) ((unsigned long)((paddr) >> PAGE_SHIFT))
This does the same thing, but has an explicit cast.
So, the only difference between the two suggestions is that additional cast, which has no effect here.
I've changed one thing. __nosave_end is pointing at the first byte not included in the nosave region. I subtracted one from it so that we make sure we're referring to the last pfn, and left the pfn comparison as you'd suggested.
Yes, that should be safer.