diff options
Diffstat (limited to 'kernel/kexec.c')
-rw-r--r-- | kernel/kexec.c | 29 |
1 files changed, 20 insertions, 9 deletions
diff --git a/kernel/kexec.c b/kernel/kexec.c index dc7bc0829286..7b0886786701 100644 --- a/kernel/kexec.c +++ b/kernel/kexec.c | |||
@@ -32,7 +32,6 @@ | |||
32 | #include <linux/console.h> | 32 | #include <linux/console.h> |
33 | #include <linux/vmalloc.h> | 33 | #include <linux/vmalloc.h> |
34 | #include <linux/swap.h> | 34 | #include <linux/swap.h> |
35 | #include <linux/kmsg_dump.h> | ||
36 | #include <linux/syscore_ops.h> | 35 | #include <linux/syscore_ops.h> |
37 | 36 | ||
38 | #include <asm/page.h> | 37 | #include <asm/page.h> |
@@ -1094,8 +1093,6 @@ void crash_kexec(struct pt_regs *regs) | |||
1094 | if (kexec_crash_image) { | 1093 | if (kexec_crash_image) { |
1095 | struct pt_regs fixed_regs; | 1094 | struct pt_regs fixed_regs; |
1096 | 1095 | ||
1097 | kmsg_dump(KMSG_DUMP_KEXEC); | ||
1098 | |||
1099 | crash_setup_regs(&fixed_regs, regs); | 1096 | crash_setup_regs(&fixed_regs, regs); |
1100 | crash_save_vmcoreinfo(); | 1097 | crash_save_vmcoreinfo(); |
1101 | machine_crash_shutdown(&fixed_regs); | 1098 | machine_crash_shutdown(&fixed_regs); |
@@ -1132,6 +1129,8 @@ int crash_shrink_memory(unsigned long new_size) | |||
1132 | { | 1129 | { |
1133 | int ret = 0; | 1130 | int ret = 0; |
1134 | unsigned long start, end; | 1131 | unsigned long start, end; |
1132 | unsigned long old_size; | ||
1133 | struct resource *ram_res; | ||
1135 | 1134 | ||
1136 | mutex_lock(&kexec_mutex); | 1135 | mutex_lock(&kexec_mutex); |
1137 | 1136 | ||
@@ -1141,11 +1140,15 @@ int crash_shrink_memory(unsigned long new_size) | |||
1141 | } | 1140 | } |
1142 | start = crashk_res.start; | 1141 | start = crashk_res.start; |
1143 | end = crashk_res.end; | 1142 | end = crashk_res.end; |
1143 | old_size = (end == 0) ? 0 : end - start + 1; | ||
1144 | if (new_size >= old_size) { | ||
1145 | ret = (new_size == old_size) ? 0 : -EINVAL; | ||
1146 | goto unlock; | ||
1147 | } | ||
1144 | 1148 | ||
1145 | if (new_size >= end - start + 1) { | 1149 | ram_res = kzalloc(sizeof(*ram_res), GFP_KERNEL); |
1146 | ret = -EINVAL; | 1150 | if (!ram_res) { |
1147 | if (new_size == end - start + 1) | 1151 | ret = -ENOMEM; |
1148 | ret = 0; | ||
1149 | goto unlock; | 1152 | goto unlock; |
1150 | } | 1153 | } |
1151 | 1154 | ||
@@ -1157,7 +1160,15 @@ int crash_shrink_memory(unsigned long new_size) | |||
1157 | 1160 | ||
1158 | if ((start == end) && (crashk_res.parent != NULL)) | 1161 | if ((start == end) && (crashk_res.parent != NULL)) |
1159 | release_resource(&crashk_res); | 1162 | release_resource(&crashk_res); |
1163 | |||
1164 | ram_res->start = end; | ||
1165 | ram_res->end = crashk_res.end; | ||
1166 | ram_res->flags = IORESOURCE_BUSY | IORESOURCE_MEM; | ||
1167 | ram_res->name = "System RAM"; | ||
1168 | |||
1160 | crashk_res.end = end - 1; | 1169 | crashk_res.end = end - 1; |
1170 | |||
1171 | insert_resource(&iomem_resource, ram_res); | ||
1161 | crash_unmap_reserved_pages(); | 1172 | crash_unmap_reserved_pages(); |
1162 | 1173 | ||
1163 | unlock: | 1174 | unlock: |
@@ -1523,7 +1534,7 @@ int kernel_kexec(void) | |||
1523 | 1534 | ||
1524 | #ifdef CONFIG_KEXEC_JUMP | 1535 | #ifdef CONFIG_KEXEC_JUMP |
1525 | if (kexec_image->preserve_context) { | 1536 | if (kexec_image->preserve_context) { |
1526 | mutex_lock(&pm_mutex); | 1537 | lock_system_sleep(); |
1527 | pm_prepare_console(); | 1538 | pm_prepare_console(); |
1528 | error = freeze_processes(); | 1539 | error = freeze_processes(); |
1529 | if (error) { | 1540 | if (error) { |
@@ -1576,7 +1587,7 @@ int kernel_kexec(void) | |||
1576 | thaw_processes(); | 1587 | thaw_processes(); |
1577 | Restore_console: | 1588 | Restore_console: |
1578 | pm_restore_console(); | 1589 | pm_restore_console(); |
1579 | mutex_unlock(&pm_mutex); | 1590 | unlock_system_sleep(); |
1580 | } | 1591 | } |
1581 | #endif | 1592 | #endif |
1582 | 1593 | ||