* [Patch] kexec: increase max of kexec segments and use dynamic allocation
@ 2010-07-22 6:13 Amerigo Wang
2010-07-22 6:28 ` Eric W. Biederman
0 siblings, 1 reply; 9+ messages in thread
From: Amerigo Wang @ 2010-07-22 6:13 UTC (permalink / raw)
To: linux-kernel; +Cc: nhorman, akpm, Amerigo Wang, ebiederm
Currently KEXEC_SEGMENT_MAX is only 16 which is too small for machine with
many memory ranges. Increase this hard limit to 1024 which is reasonably large,
and change ->segment from a static array to a dynamically allocated memory.
Cc: nhorman@redhat.com
Cc: ebiederm@xmission.com
Signed-off-by: WANG Cong <amwang@redhat.com>
---
diff --git a/arch/powerpc/kernel/machine_kexec_64.c b/arch/powerpc/kernel/machine_kexec_64.c
index ed31a29..f115585 100644
--- a/arch/powerpc/kernel/machine_kexec_64.c
+++ b/arch/powerpc/kernel/machine_kexec_64.c
@@ -131,10 +131,7 @@ static void copy_segments(unsigned long ind)
void kexec_copy_flush(struct kimage *image)
{
long i, nr_segments = image->nr_segments;
- struct kexec_segment ranges[KEXEC_SEGMENT_MAX];
-
- /* save the ranges on the stack to efficiently flush the icache */
- memcpy(ranges, image->segment, sizeof(ranges));
+ struct kexec_segment range;
/*
* After this call we may not use anything allocated in dynamic
@@ -148,9 +145,11 @@ void kexec_copy_flush(struct kimage *image)
* we need to clear the icache for all dest pages sometime,
* including ones that were in place on the original copy
*/
- for (i = 0; i < nr_segments; i++)
- flush_icache_range((unsigned long)__va(ranges[i].mem),
- (unsigned long)__va(ranges[i].mem + ranges[i].memsz));
+ for (i = 0; i < nr_segments; i++) {
+ memcpy(&range, &image->segment[i], sizeof(range));
+ flush_icache_range((unsigned long)__va(range.mem),
+ (unsigned long)__va(range.mem + range.memsz));
+ }
}
#ifdef CONFIG_SMP
diff --git a/include/linux/kexec.h b/include/linux/kexec.h
index 03e8e8d..26b70ff 100644
--- a/include/linux/kexec.h
+++ b/include/linux/kexec.h
@@ -57,7 +57,7 @@ typedef unsigned long kimage_entry_t;
#define IND_DONE 0x4
#define IND_SOURCE 0x8
-#define KEXEC_SEGMENT_MAX 16
+#define KEXEC_SEGMENT_MAX 1024
struct kexec_segment {
void __user *buf;
size_t bufsz;
@@ -86,7 +86,7 @@ struct kimage {
struct page *swap_page;
unsigned long nr_segments;
- struct kexec_segment segment[KEXEC_SEGMENT_MAX];
+ struct kexec_segment *segment;
struct list_head control_pages;
struct list_head dest_pages;
diff --git a/kernel/kexec.c b/kernel/kexec.c
index 131b170..3f97309 100644
--- a/kernel/kexec.c
+++ b/kernel/kexec.c
@@ -131,6 +131,11 @@ static int do_kimage_alloc(struct kimage **rimage, unsigned long entry,
if (!image)
goto out;
+ image->segment = kzalloc(nr_segments * sizeof(struct kexec_segment),
+ GFP_KERNEL);
+ if (!image->segment)
+ goto out;
+
image->head = 0;
image->entry = &image->head;
image->last_entry = &image->head;
@@ -216,8 +221,10 @@ static int do_kimage_alloc(struct kimage **rimage, unsigned long entry,
out:
if (result == 0)
*rimage = image;
- else
+ else if (image) {
+ kfree(image->segment);
kfree(image);
+ }
return result;
@@ -261,8 +268,10 @@ static int kimage_normal_alloc(struct kimage **rimage, unsigned long entry,
out:
if (result == 0)
*rimage = image;
- else
+ else if (image) {
+ kfree(image->segment);
kfree(image);
+ }
return result;
}
@@ -330,8 +339,10 @@ static int kimage_crash_alloc(struct kimage **rimage, unsigned long entry,
out:
if (result == 0)
*rimage = image;
- else
+ else if (image) {
+ kfree(image->segment);
kfree(image);
+ }
return result;
}
@@ -656,6 +667,7 @@ static void kimage_free(struct kimage *image)
/* Free the kexec control pages... */
kimage_free_page_list(&image->control_pages);
+ kfree(image->segment);
kfree(image);
}
^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [Patch] kexec: increase max of kexec segments and use dynamic allocation
2010-07-22 6:13 [Patch] kexec: increase max of kexec segments and use dynamic allocation Amerigo Wang
@ 2010-07-22 6:28 ` Eric W. Biederman
2010-07-22 6:40 ` Cong Wang
0 siblings, 1 reply; 9+ messages in thread
From: Eric W. Biederman @ 2010-07-22 6:28 UTC (permalink / raw)
To: Amerigo Wang; +Cc: linux-kernel, nhorman, akpm
Amerigo Wang <amwang@redhat.com> writes:
> Currently KEXEC_SEGMENT_MAX is only 16 which is too small for machine with
> many memory ranges. Increase this hard limit to 1024 which is reasonably large,
> and change ->segment from a static array to a dynamically allocated memory.
???
This should be about segments in the executable being loaded. What
executable has one segment for each range of physical memory?
Not that generalizing this is a bad idea but with a comment that
seems entirely wrong I am wondering what the problem really is.
Eric
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [Patch] kexec: increase max of kexec segments and use dynamic allocation
2010-07-22 6:28 ` Eric W. Biederman
@ 2010-07-22 6:40 ` Cong Wang
2010-07-22 7:08 ` Eric W. Biederman
0 siblings, 1 reply; 9+ messages in thread
From: Cong Wang @ 2010-07-22 6:40 UTC (permalink / raw)
To: Eric W. Biederman; +Cc: linux-kernel, nhorman, akpm
On 07/22/10 14:28, Eric W. Biederman wrote:
> Amerigo Wang<amwang@redhat.com> writes:
>
>> Currently KEXEC_SEGMENT_MAX is only 16 which is too small for machine with
>> many memory ranges. Increase this hard limit to 1024 which is reasonably large,
>> and change ->segment from a static array to a dynamically allocated memory.
>
> ???
>
> This should be about segments in the executable being loaded. What
> executable has one segment for each range of physical memory?
>
> Not that generalizing this is a bad idea but with a comment that
> seems entirely wrong I am wondering what the problem really is.
>
Ah, I think Neil should explain this.
He made a patch which includes many memory ranges, caused kexec
fails to load the kernel. Increasing this limit and the corresponding
one in kexec-tools fixes the problem. His patch is not in upstream
kexec-tools, AFAIK.
However, even if we don't consider that patch, isn't 16 too small too?
Thanks.
--
The opposite of love is not hate, it's indifference.
- Elie Wiesel
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [Patch] kexec: increase max of kexec segments and use dynamic allocation
2010-07-22 6:40 ` Cong Wang
@ 2010-07-22 7:08 ` Eric W. Biederman
2010-07-23 2:57 ` huang ying
0 siblings, 1 reply; 9+ messages in thread
From: Eric W. Biederman @ 2010-07-22 7:08 UTC (permalink / raw)
To: Cong Wang; +Cc: linux-kernel, nhorman, akpm
Cong Wang <amwang@redhat.com> writes:
> On 07/22/10 14:28, Eric W. Biederman wrote:
>> Amerigo Wang<amwang@redhat.com> writes:
>>
>>> Currently KEXEC_SEGMENT_MAX is only 16 which is too small for machine with
>>> many memory ranges. Increase this hard limit to 1024 which is reasonably large,
>>> and change ->segment from a static array to a dynamically allocated memory.
>>
>> ???
>>
>> This should be about segments in the executable being loaded. What
>> executable has one segment for each range of physical memory?
>>
>> Not that generalizing this is a bad idea but with a comment that
>> seems entirely wrong I am wondering what the problem really is.
>>
>
> Ah, I think Neil should explain this.
>
> He made a patch which includes many memory ranges, caused kexec
> fails to load the kernel. Increasing this limit and the corresponding
> one in kexec-tools fixes the problem. His patch is not in upstream
> kexec-tools, AFAIK.
>
> However, even if we don't consider that patch, isn't 16 too small too?
Generally you just need one physical hunk for the code, maybe a second
for the initrd.
It is perfectly fine to raise the number of segments as it doesn't
affect the ABI, but it wants a good explanation of what kind of weird
application wants to write to all over memory when it is loaded.
Eric
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [Patch] kexec: increase max of kexec segments and use dynamic allocation
2010-07-22 7:08 ` Eric W. Biederman
@ 2010-07-23 2:57 ` huang ying
2010-07-25 2:54 ` Eric W. Biederman
0 siblings, 1 reply; 9+ messages in thread
From: huang ying @ 2010-07-23 2:57 UTC (permalink / raw)
To: Eric W. Biederman; +Cc: Cong Wang, linux-kernel, nhorman, akpm
On Thu, Jul 22, 2010 at 3:08 PM, Eric W. Biederman
<ebiederm@xmission.com> wrote:
> Cong Wang <amwang@redhat.com> writes:
>
>> On 07/22/10 14:28, Eric W. Biederman wrote:
>>> Amerigo Wang<amwang@redhat.com> writes:
>>>
>>>> Currently KEXEC_SEGMENT_MAX is only 16 which is too small for machine with
>>>> many memory ranges. Increase this hard limit to 1024 which is reasonably large,
>>>> and change ->segment from a static array to a dynamically allocated memory.
>>>
>>> ???
>>>
>>> This should be about segments in the executable being loaded. What
>>> executable has one segment for each range of physical memory?
>>>
>>> Not that generalizing this is a bad idea but with a comment that
>>> seems entirely wrong I am wondering what the problem really is.
>>>
>>
>> Ah, I think Neil should explain this.
>>
>> He made a patch which includes many memory ranges, caused kexec
>> fails to load the kernel. Increasing this limit and the corresponding
>> one in kexec-tools fixes the problem. His patch is not in upstream
>> kexec-tools, AFAIK.
>>
>> However, even if we don't consider that patch, isn't 16 too small too?
>
> Generally you just need one physical hunk for the code, maybe a second
> for the initrd.
>
> It is perfectly fine to raise the number of segments as it doesn't
> affect the ABI, but it wants a good explanation of what kind of weird
> application wants to write to all over memory when it is loaded.
kexec can be used to load not only the kernel images, but also more
complex images such as hibernation image. So I think it is good to
raise the number of segments.
Best Regards,
Huang Ying
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [Patch] kexec: increase max of kexec segments and use dynamic allocation
2010-07-23 2:57 ` huang ying
@ 2010-07-25 2:54 ` Eric W. Biederman
2010-07-26 10:11 ` Cong Wang
0 siblings, 1 reply; 9+ messages in thread
From: Eric W. Biederman @ 2010-07-25 2:54 UTC (permalink / raw)
To: huang ying; +Cc: Cong Wang, linux-kernel, nhorman, akpm
huang ying <huang.ying.caritas@gmail.com> writes:
> On Thu, Jul 22, 2010 at 3:08 PM, Eric W. Biederman
> <ebiederm@xmission.com> wrote:
>> Cong Wang <amwang@redhat.com> writes:
>>
>>> On 07/22/10 14:28, Eric W. Biederman wrote:
>>>> Amerigo Wang<amwang@redhat.com> writes:
>>>>
>>>>> Currently KEXEC_SEGMENT_MAX is only 16 which is too small for machine with
>>>>> many memory ranges. Increase this hard limit to 1024 which is reasonably large,
>>>>> and change ->segment from a static array to a dynamically allocated memory.
>>>>
>>>> ???
>>>>
>>>> This should be about segments in the executable being loaded. What
>>>> executable has one segment for each range of physical memory?
>>>>
>>>> Not that generalizing this is a bad idea but with a comment that
>>>> seems entirely wrong I am wondering what the problem really is.
>>>>
>>>
>>> Ah, I think Neil should explain this.
>>>
>>> He made a patch which includes many memory ranges, caused kexec
>>> fails to load the kernel. Increasing this limit and the corresponding
>>> one in kexec-tools fixes the problem. His patch is not in upstream
>>> kexec-tools, AFAIK.
>>>
>>> However, even if we don't consider that patch, isn't 16 too small too?
>>
>> Generally you just need one physical hunk for the code, maybe a second
>> for the initrd.
>>
>> It is perfectly fine to raise the number of segments as it doesn't
>> affect the ABI, but it wants a good explanation of what kind of weird
>> application wants to write to all over memory when it is loaded.
>
> kexec can be used to load not only the kernel images, but also more
> complex images such as hibernation image. So I think it is good to
> raise the number of segments.
Totally reasonable.
And in all fairness the patch does a good job of raising the limit.
However if that is the goal 1024 is probably a bit low as I believe
SGI has built machines with that many nodes. Still after the patch
under discussion 1024 was only a limit in a header file so it can
be trivially changed.
Eric
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [Patch] kexec: increase max of kexec segments and use dynamic allocation
2010-07-25 2:54 ` Eric W. Biederman
@ 2010-07-26 10:11 ` Cong Wang
2010-07-26 12:19 ` Eric W. Biederman
0 siblings, 1 reply; 9+ messages in thread
From: Cong Wang @ 2010-07-26 10:11 UTC (permalink / raw)
To: Eric W. Biederman; +Cc: huang ying, linux-kernel, nhorman, akpm
On 07/25/10 10:54, Eric W. Biederman wrote:
> huang ying<huang.ying.caritas@gmail.com> writes:
>
>> On Thu, Jul 22, 2010 at 3:08 PM, Eric W. Biederman
>> <ebiederm@xmission.com> wrote:
>>> Cong Wang<amwang@redhat.com> writes:
>>>
>>>> On 07/22/10 14:28, Eric W. Biederman wrote:
>>>>> Amerigo Wang<amwang@redhat.com> writes:
>>>>>
>>>>>> Currently KEXEC_SEGMENT_MAX is only 16 which is too small for machine with
>>>>>> many memory ranges. Increase this hard limit to 1024 which is reasonably large,
>>>>>> and change ->segment from a static array to a dynamically allocated memory.
>>>>>
>>>>> ???
>>>>>
>>>>> This should be about segments in the executable being loaded. What
>>>>> executable has one segment for each range of physical memory?
>>>>>
>>>>> Not that generalizing this is a bad idea but with a comment that
>>>>> seems entirely wrong I am wondering what the problem really is.
>>>>>
>>>>
>>>> Ah, I think Neil should explain this.
>>>>
>>>> He made a patch which includes many memory ranges, caused kexec
>>>> fails to load the kernel. Increasing this limit and the corresponding
>>>> one in kexec-tools fixes the problem. His patch is not in upstream
>>>> kexec-tools, AFAIK.
>>>>
>>>> However, even if we don't consider that patch, isn't 16 too small too?
>>>
>>> Generally you just need one physical hunk for the code, maybe a second
>>> for the initrd.
>>>
>>> It is perfectly fine to raise the number of segments as it doesn't
>>> affect the ABI, but it wants a good explanation of what kind of weird
>>> application wants to write to all over memory when it is loaded.
>>
>> kexec can be used to load not only the kernel images, but also more
>> complex images such as hibernation image. So I think it is good to
>> raise the number of segments.
>
> Totally reasonable.
>
> And in all fairness the patch does a good job of raising the limit.
>
> However if that is the goal 1024 is probably a bit low as I believe
> SGI has built machines with that many nodes. Still after the patch
> under discussion 1024 was only a limit in a header file so it can
> be trivially changed.
So, what is a better number? 2048? :)
Thanks.
--
The opposite of love is not hate, it's indifference.
- Elie Wiesel
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [Patch] kexec: increase max of kexec segments and use dynamic allocation
2010-07-26 10:11 ` Cong Wang
@ 2010-07-26 12:19 ` Eric W. Biederman
2010-07-27 8:14 ` Cong Wang
0 siblings, 1 reply; 9+ messages in thread
From: Eric W. Biederman @ 2010-07-26 12:19 UTC (permalink / raw)
To: Cong Wang; +Cc: huang ying, linux-kernel, nhorman, akpm
Cong Wang <amwang@redhat.com> writes:
> So, what is a better number? 2048? :)
I was thinking something a little ridiculous like 10K or 64K.
Assuming the usage you care about is something like hibernate on a
machine with disjoint memory where you truly need one segment for
each memory region.
The only point of a limit at all once we introduce dynamic allocation
is to catch buggy apps.
Eric
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [Patch] kexec: increase max of kexec segments and use dynamic allocation
2010-07-26 12:19 ` Eric W. Biederman
@ 2010-07-27 8:14 ` Cong Wang
0 siblings, 0 replies; 9+ messages in thread
From: Cong Wang @ 2010-07-27 8:14 UTC (permalink / raw)
To: Eric W. Biederman; +Cc: huang ying, linux-kernel, nhorman, akpm
On 07/26/10 20:19, Eric W. Biederman wrote:
> Cong Wang<amwang@redhat.com> writes:
>
>> So, what is a better number? 2048? :)
>
> I was thinking something a little ridiculous like 10K or 64K.
>
> Assuming the usage you care about is something like hibernate on a
> machine with disjoint memory where you truly need one segment for
> each memory region.
>
> The only point of a limit at all once we introduce dynamic allocation
> is to catch buggy apps.
>
Ok, I will change that number and improve the changelog.
Thanks.
--
The opposite of love is not hate, it's indifference.
- Elie Wiesel
^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2010-07-27 8:10 UTC | newest]
Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-07-22 6:13 [Patch] kexec: increase max of kexec segments and use dynamic allocation Amerigo Wang
2010-07-22 6:28 ` Eric W. Biederman
2010-07-22 6:40 ` Cong Wang
2010-07-22 7:08 ` Eric W. Biederman
2010-07-23 2:57 ` huang ying
2010-07-25 2:54 ` Eric W. Biederman
2010-07-26 10:11 ` Cong Wang
2010-07-26 12:19 ` Eric W. Biederman
2010-07-27 8:14 ` Cong Wang
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox