Re: [-mm PATCH] register_memory/unregister_memory clean ups

Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]
From: Dave Hansen
Date: Tuesday, February 12, 2008 - 1:59 pm

On Tue, 2008-02-12 at 09:22 -0800, Badari Pulavarty wrote:

I think you need at least a WARN_ON() there.  

I'd probably also not use pfn_valid(), personally.  


Can none of this ever fail?

I also think having a function called __remove_section() that takes a
pfn is a bad idea.  How about passing an actual 'struct mem_section *'
into it?  One of the reasons I even made that structure was so that you
could hand it around to things and never be confused about pfn vs. paddr
vs. vaddr vs. section_nr.  Please use it.


I'd like to see some warnings in there if nr_pages or phys_start_pfn are
not section-aligned and some other sanity checks.  If someone is trying
to remove non-section-aligned areas, we either have something wrong, or
some other work to do, first keeping track of what section portions are
"removed".

I'd probably do:

void __remove_pages(struct zone *zone, unsigned long phys_start_pfn,
  		    unsigned long nr_pages)
{
	int i;
	int sections_to_remove;

	/*
	 * We can only remove entire sections.
	 */
	if (phys_start_pfn & ~PAGE_SECTION_MASK)
		return ...;
	if (nr_pages % PAGES_PER_SECTION)
		return ...;
	sections_to_remove = nr_pages / PAGES_PER_SECTION;

	for (i = 0; i < sections_to_remove; i++) {
		unsigned long pfn = phys_start_pfn + i*PAGES_PER_SECTION;
		__remove_section(zone, __pfn_to_section(pfn));
	}
}
	


You're abusing this memmap variable.  Please make another variable
that's unsigned long and has a nice name if you're actually going to
store an 'unsigned long' in it.  That cast below should be a big red
flag.


Ugh.  Please put this in its own helper.  Also, sparse_decode_mem_map()
has absolutely no other users.  Please modify it so that you don't have
to do this gunk, like put the '& SECTION_MAP_MASK' in there.  You
probably just need:

struct page *sparse_decode_mem_map(unsigned long coded_mem_map, unsigned long pnum)
{
	/*
	 * mask off the extra low bits of information
	 */
	coded_mem_map &= SECTION_MAP_MASK;
        return ((struct page *)coded_mem_map) + section_nr_to_pfn(pnum);
}

Then, you can just do this:

	memmap = sparse_decode_mem_map(ms->section_mem_map, section_nr);

No casting, no temp variables.  *PLEASE* look around at things and feel
free to modify to modify them.  Otherwise, it'll just become a mess.
(oh, and get rid of the unused attribute on it).


Do what we did with the memmap and store some of its origination
information in the low bits.

-- Dave

--
Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]

Messages in current thread:
[-mm PATCH] register_memory/unregister_memory clean ups, Badari Pulavarty, (Mon Feb 11, 10:23 am)
Re: [-mm PATCH] register_memory/unregister_memory clean ups, Badari Pulavarty, (Mon Feb 11, 11:05 am)
Re: [-mm PATCH] register_memory/unregister_memory clean ups, Badari Pulavarty, (Mon Feb 11, 2:32 pm)
Re: [-mm PATCH] register_memory/unregister_memory clean ups, Badari Pulavarty, (Tue Feb 12, 10:22 am)
Re: [-mm PATCH] register_memory/unregister_memory clean ups, Dave Hansen, (Tue Feb 12, 1:59 pm)
Re: [-mm PATCH] register_memory/unregister_memory clean ups, Badari Pulavarty, (Tue Feb 12, 2:56 pm)
Re: [-mm PATCH] register_memory/unregister_memory clean ups, Badari Pulavarty, (Tue Feb 12, 3:07 pm)
Re: [-mm PATCH] register_memory/unregister_memory clean ups, Badari Pulavarty, (Tue Feb 12, 3:51 pm)
Re: [-mm PATCH] register_memory/unregister_memory clean ups, Badari Pulavarty, (Tue Feb 12, 4:03 pm)
Re: [-mm PATCH] register_memory/unregister_memory clean ups, Badari Pulavarty, (Wed Feb 13, 10:31 am)