2006-10-23 03:47:53

by bibo,mao

[permalink] [raw]
Subject: [PATCH] fix minor error about efi memory_present

Hi,
Function efi_memory_present_wrapper parameter start/end is physical address,
but function memory_present parameter is PFN, this patch converts physical
address to PFN.

Signed-off-by: bibo, mao <[email protected]>

thanks
bibo,mao

diff --git a/arch/i386/kernel/setup.c b/arch/i386/kernel/setup.c
index 519e63c..141041d 100644
--- a/arch/i386/kernel/setup.c
+++ b/arch/i386/kernel/setup.c
@@ -846,7 +846,7 @@ efi_find_max_pfn(unsigned long start, un
static int __init
efi_memory_present_wrapper(unsigned long start, unsigned long end, void *arg)
{
- memory_present(0, start, end);
+ memory_present(0, PFN_UP(start), PFN_DOWN(end));
return 0;
}


2006-10-23 04:45:13

by Andrew Morton

[permalink] [raw]
Subject: Re: [PATCH] fix minor error about efi memory_present

On Mon, 23 Oct 2006 11:42:33 +0800
"bibo,mao" <[email protected]> wrote:

> Hi,
> Function efi_memory_present_wrapper parameter start/end is physical address,
> but function memory_present parameter is PFN, this patch converts physical
> address to PFN.
>
> Signed-off-by: bibo, mao <[email protected]>
>
> thanks
> bibo,mao
>
> diff --git a/arch/i386/kernel/setup.c b/arch/i386/kernel/setup.c
> index 519e63c..141041d 100644
> --- a/arch/i386/kernel/setup.c
> +++ b/arch/i386/kernel/setup.c
> @@ -846,7 +846,7 @@ efi_find_max_pfn(unsigned long start, un
> static int __init
> efi_memory_present_wrapper(unsigned long start, unsigned long end, void *arg)
> {
> - memory_present(0, start, end);
> + memory_present(0, PFN_UP(start), PFN_DOWN(end));
> return 0;
> }
>

It doesn't _seem_ like a "minor error". How come people's machines haven't
been crashing all over the place?

2006-10-23 05:52:48

by bibo,mao

[permalink] [raw]
Subject: Re: [PATCH] fix minor error about efi memory_present

Andrew Morton wrote:
> On Mon, 23 Oct 2006 11:42:33 +0800
> "bibo,mao" <[email protected]> wrote:
>
>> Hi,
>> Function efi_memory_present_wrapper parameter start/end is physical address,
>> but function memory_present parameter is PFN, this patch converts physical
>> address to PFN.
>>
>> Signed-off-by: bibo, mao <[email protected]>
>>
>> thanks
>> bibo,mao
>>
>> diff --git a/arch/i386/kernel/setup.c b/arch/i386/kernel/setup.c
>> index 519e63c..141041d 100644
>> --- a/arch/i386/kernel/setup.c
>> +++ b/arch/i386/kernel/setup.c
>> @@ -846,7 +846,7 @@ efi_find_max_pfn(unsigned long start, un
>> static int __init
>> efi_memory_present_wrapper(unsigned long start, unsigned long end, void *arg)
>> {
>> - memory_present(0, start, end);
>> + memory_present(0, PFN_UP(start), PFN_DOWN(end));
>> return 0;
>> }
>>
>
> It doesn't _seem_ like a "minor error". How come people's machines haven't
> been crashing all over the place?
This patch is only efi bios relative, most machines in the market are
legacy bios. System only crashes when booting from EFI bios.

thanks
bibo,mao
>
> -
> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> the body of a message to [email protected]
> More majordomo info at http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at http://www.tux.org/lkml/
>

2006-10-23 08:36:10

by Eric Dumazet

[permalink] [raw]
Subject: [PATCH] vmalloc : optimization, cleanup, bugfixes

--- linux-2.6/include/linux/vmalloc.h 2006-10-23 10:09:48.000000000 +0200
+++ linux-2.6-ed/include/linux/vmalloc.h 2006-10-23 10:26:37.000000000 +0200
@@ -23,13 +23,14 @@
#endif

struct vm_struct {
+ /* keep next,addr,size together to speedup lookups */
+ struct vm_struct *next;
void *addr;
unsigned long size;
unsigned long flags;
struct page **pages;
unsigned int nr_pages;
unsigned long phys_addr;
- struct vm_struct *next;
};

/*
--- linux-2.6/mm/vmalloc.c 2006-10-23 10:11:43.000000000 +0200
+++ linux-2.6-ed/mm/vmalloc.c 2006-10-23 10:17:52.000000000 +0200
@@ -180,15 +180,13 @@
addr = ALIGN(start, align);
size = PAGE_ALIGN(size);

+ if (unlikely(!size))
+ return NULL;
+
area = kmalloc_node(sizeof(*area), GFP_KERNEL, node);
if (unlikely(!area))
return NULL;

- if (unlikely(!size)) {
- kfree (area);
- return NULL;
- }
-
/*
* We always allocate a guard page.
*/
@@ -528,11 +526,13 @@
void *ret;

ret = __vmalloc(size, GFP_KERNEL | __GFP_HIGHMEM | __GFP_ZERO, PAGE_KERNEL);
- write_lock(&vmlist_lock);
- area = __find_vm_area(ret);
- area->flags |= VM_USERMAP;
- write_unlock(&vmlist_lock);
-
+ if (ret) {
+ write_lock(&vmlist_lock);
+ area = __find_vm_area(ret);
+ if (area)
+ area->flags |= VM_USERMAP;
+ write_unlock(&vmlist_lock);
+ }
return ret;
}
EXPORT_SYMBOL(vmalloc_user);
@@ -601,11 +601,13 @@
void *ret;

ret = __vmalloc(size, GFP_KERNEL | __GFP_ZERO, PAGE_KERNEL);
- write_lock(&vmlist_lock);
- area = __find_vm_area(ret);
- area->flags |= VM_USERMAP;
- write_unlock(&vmlist_lock);
-
+ if (ret) {
+ write_lock(&vmlist_lock);
+ area = __find_vm_area(ret);
+ if (area)
+ area->flags |= VM_USERMAP;
+ write_unlock(&vmlist_lock);
+ }
return ret;
}
EXPORT_SYMBOL(vmalloc_32_user);


Attachments:
(No filename) (469.00 B)
vmalloc.patch (1.73 kB)
Download all attachments

2006-10-23 09:13:23

by Nick Piggin

[permalink] [raw]
Subject: Re: [PATCH] vmalloc : optimization, cleanup, bugfixes

Eric Dumazet wrote:
> [PATCH] vmalloc : optimization, cleanup, bugfixes
>
> This patch does three things
>
> 1) reorder 'struct vm_struct' to speedup lookups on CPUS with small cache
> lines. The fields 'next,addr,size' should be now in the same cache line, to
> speedup lookups.
>
> 2) One minor cleanup in __get_vm_area_node()
>
> 3) Bugfixes in vmalloc_user() and vmalloc_32_user()
> NULL returns from __vmalloc() and __find_vm_area() were not tested.

Hmm, so they weren't. As far as testing the return of __find_vm_area,
you can just turn that into a BUG_ON(!area), because at that point,
we've established that the vmalloc succeeded.

--
SUSE Labs, Novell Inc.
Send instant messages to your online friends http://au.messenger.yahoo.com

2006-10-23 09:30:25

by Eric Dumazet

[permalink] [raw]
Subject: Re: [PATCH] vmalloc : optimization, cleanup, bugfixes

--- linux-2.6/include/linux/vmalloc.h 2006-10-23 10:09:48.000000000 +0200
+++ linux-2.6-ed/include/linux/vmalloc.h 2006-10-23 10:26:37.000000000 +0200
@@ -23,13 +23,14 @@
#endif

struct vm_struct {
+ /* keep next,addr,size together to speedup lookups */
+ struct vm_struct *next;
void *addr;
unsigned long size;
unsigned long flags;
struct page **pages;
unsigned int nr_pages;
unsigned long phys_addr;
- struct vm_struct *next;
};

/*
--- linux-2.6/mm/vmalloc.c 2006-10-23 10:11:43.000000000 +0200
+++ linux-2.6-ed/mm/vmalloc.c 2006-10-23 11:26:47.000000000 +0200
@@ -180,15 +180,13 @@
addr = ALIGN(start, align);
size = PAGE_ALIGN(size);

+ if (unlikely(!size))
+ return NULL;
+
area = kmalloc_node(sizeof(*area), GFP_KERNEL, node);
if (unlikely(!area))
return NULL;

- if (unlikely(!size)) {
- kfree (area);
- return NULL;
- }
-
/*
* We always allocate a guard page.
*/
@@ -528,11 +526,13 @@
void *ret;

ret = __vmalloc(size, GFP_KERNEL | __GFP_HIGHMEM | __GFP_ZERO, PAGE_KERNEL);
- write_lock(&vmlist_lock);
- area = __find_vm_area(ret);
- area->flags |= VM_USERMAP;
- write_unlock(&vmlist_lock);
-
+ if (ret) {
+ write_lock(&vmlist_lock);
+ area = __find_vm_area(ret);
+ BUG_ON(!area);
+ area->flags |= VM_USERMAP;
+ write_unlock(&vmlist_lock);
+ }
return ret;
}
EXPORT_SYMBOL(vmalloc_user);
@@ -601,11 +601,13 @@
void *ret;

ret = __vmalloc(size, GFP_KERNEL | __GFP_ZERO, PAGE_KERNEL);
- write_lock(&vmlist_lock);
- area = __find_vm_area(ret);
- area->flags |= VM_USERMAP;
- write_unlock(&vmlist_lock);
-
+ if (ret) {
+ write_lock(&vmlist_lock);
+ area = __find_vm_area(ret);
+ BUG_ON(!area);
+ area->flags |= VM_USERMAP;
+ write_unlock(&vmlist_lock);
+ }
return ret;
}
EXPORT_SYMBOL(vmalloc_32_user);


Attachments:
(No filename) (872.00 B)
vmalloc.patch (1.74 kB)
Download all attachments

2006-10-30 20:42:35

by Zwane Mwaikambo

[permalink] [raw]
Subject: Re: [PATCH] vmalloc : optimization, cleanup, bugfixes

On Mon, 23 Oct 2006, Nick Piggin wrote:

> Eric Dumazet wrote:
> > [PATCH] vmalloc : optimization, cleanup, bugfixes
> >
> > This patch does three things
> >
> > 1) reorder 'struct vm_struct' to speedup lookups on CPUS with small cache
> > lines. The fields 'next,addr,size' should be now in the same cache line, to
> > speedup lookups.
> >
> > 2) One minor cleanup in __get_vm_area_node()
> >
> > 3) Bugfixes in vmalloc_user() and vmalloc_32_user()
> > NULL returns from __vmalloc() and __find_vm_area() were not tested.
>
> Hmm, so they weren't. As far as testing the return of __find_vm_area,
> you can just turn that into a BUG_ON(!area), because at that point,
> we've established that the vmalloc succeeded.

No need for a BUG_ON it'll simply be a NULL dereference, at which point
we're back to the original code.

Zwane

2006-10-30 21:10:48

by Eric Dumazet

[permalink] [raw]
Subject: Re: [PATCH] vmalloc : optimization, cleanup, bugfixes

Zwane Mwaikambo a ?crit :
> On Mon, 23 Oct 2006, Nick Piggin wrote:
>
>> Eric Dumazet wrote:
>>> [PATCH] vmalloc : optimization, cleanup, bugfixes
>>>
>>> This patch does three things
>>>
>>> 1) reorder 'struct vm_struct' to speedup lookups on CPUS with small cache
>>> lines. The fields 'next,addr,size' should be now in the same cache line, to
>>> speedup lookups.
>>>
>>> 2) One minor cleanup in __get_vm_area_node()
>>>
>>> 3) Bugfixes in vmalloc_user() and vmalloc_32_user()
>>> NULL returns from __vmalloc() and __find_vm_area() were not tested.
>> Hmm, so they weren't. As far as testing the return of __find_vm_area,
>> you can just turn that into a BUG_ON(!area), because at that point,
>> we've established that the vmalloc succeeded.
>
> No need for a BUG_ON it'll simply be a NULL dereference, at which point
> we're back to the original code.

Indeed

This is what Andrew said one week ago :)