Messages in this thread | | | Date | Mon, 1 May 2017 23:31:10 +0800 | From | Baoquan He <> | Subject | Re: [PATCH] x86/mm: Fix incorrect for loop count calculation in sync_global_pgds |
| |
On 05/01/17 at 08:24am, Dan Williams wrote: > On Mon, May 1, 2017 at 7:52 AM, Baoquan He <bhe@redhat.com> wrote: > > On 05/01/17 at 07:40am, Dan Williams wrote: > >> On Mon, May 1, 2017 at 4:41 AM, Baoquan He <bhe@redhat.com> wrote: > >> > arch/x86/mm/init_64.c | 6 ++++-- > >> > 1 file changed, 4 insertions(+), 2 deletions(-) > >> > > >> > diff --git a/arch/x86/mm/init_64.c b/arch/x86/mm/init_64.c > >> > index 15173d3..dbf4f00 100644 > >> > --- a/arch/x86/mm/init_64.c > >> > +++ b/arch/x86/mm/init_64.c > >> > @@ -94,12 +94,14 @@ __setup("noexec32=", nonx32_setup); > >> > */ > >> > void sync_global_pgds(unsigned long start, unsigned long end) > >> > { > >> > - unsigned long address; > >> > + unsigned long address, address_next; > >> > > >> > - for (address = start; address <= end; address += PGDIR_SIZE) { > >> > + for (address = start; address <= end; address = address_next) { > >> > const pgd_t *pgd_ref = pgd_offset_k(address); > >> > struct page *page; > >> > > >> > + address_next = (address & PGDIR_MASK) + PGDIR_SIZE; > >> > + > >> > >> Let's change this to put the next address calculation in the for loop > >> directly and use the ALIGN macro. Something like: > >> > >> for (address = start; address <= end; address = ALIGN(address + 1, PGDIR_SIZE)) > > > > Hi Dan, > > > > Good idea! > > > > Do you think below change is OK for you? Taking out the initialization > > can make the for loop line be shorter than 80 char. > > > > I would just wrap the "address = ALIGN(address + 1, PGDIR_SIZE)" if it > doesn't fit.
OK, it's fine, will do wrapping.
> > > > > diff --git a/arch/x86/mm/init_64.c b/arch/x86/mm/init_64.c > > index 15173d3..0840311 100644 > > --- a/arch/x86/mm/init_64.c > > +++ b/arch/x86/mm/init_64.c > > @@ -94,12 +94,14 @@ __setup("noexec32=", nonx32_setup); > > */ > > void sync_global_pgds(unsigned long start, unsigned long end) > > { > > - unsigned long address; > > + unsigned long address = start; > > > > - for (address = start; address <= end; address += PGDIR_SIZE) { > > + for (; address <= end; address = ALIGN(address + 1, PGDIR_SIZE)) > > { > > const pgd_t *pgd_ref = pgd_offset_k(address); > > struct page *page; > > > > + address_next = (address & PGDIR_MASK) + PGDIR_SIZE; > > + > > This gets deleted of course.
Sure, forget deleting it. while I am also testing on Jeff's system, that code is right, otherwise compiling won't pass.
Will repost after the pgd crossing case seen and passed.
Thanks Baoquan
| |