diff options
Diffstat (limited to 'kernel/kexec.c')
-rw-r--r-- | kernel/kexec.c | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/kernel/kexec.c b/kernel/kexec.c index 20ed47ae252f..60bf181b3eae 100644 --- a/kernel/kexec.c +++ b/kernel/kexec.c | |||
@@ -1129,6 +1129,7 @@ int crash_shrink_memory(unsigned long new_size) | |||
1129 | { | 1129 | { |
1130 | int ret = 0; | 1130 | int ret = 0; |
1131 | unsigned long start, end; | 1131 | unsigned long start, end; |
1132 | struct resource *ram_res; | ||
1132 | 1133 | ||
1133 | mutex_lock(&kexec_mutex); | 1134 | mutex_lock(&kexec_mutex); |
1134 | 1135 | ||
@@ -1146,6 +1147,12 @@ int crash_shrink_memory(unsigned long new_size) | |||
1146 | goto unlock; | 1147 | goto unlock; |
1147 | } | 1148 | } |
1148 | 1149 | ||
1150 | ram_res = kzalloc(sizeof(*ram_res), GFP_KERNEL); | ||
1151 | if (!ram_res) { | ||
1152 | ret = -ENOMEM; | ||
1153 | goto unlock; | ||
1154 | } | ||
1155 | |||
1149 | start = roundup(start, KEXEC_CRASH_MEM_ALIGN); | 1156 | start = roundup(start, KEXEC_CRASH_MEM_ALIGN); |
1150 | end = roundup(start + new_size, KEXEC_CRASH_MEM_ALIGN); | 1157 | end = roundup(start + new_size, KEXEC_CRASH_MEM_ALIGN); |
1151 | 1158 | ||
@@ -1154,7 +1161,15 @@ int crash_shrink_memory(unsigned long new_size) | |||
1154 | 1161 | ||
1155 | if ((start == end) && (crashk_res.parent != NULL)) | 1162 | if ((start == end) && (crashk_res.parent != NULL)) |
1156 | release_resource(&crashk_res); | 1163 | release_resource(&crashk_res); |
1164 | |||
1165 | ram_res->start = end; | ||
1166 | ram_res->end = crashk_res.end; | ||
1167 | ram_res->flags = IORESOURCE_BUSY | IORESOURCE_MEM; | ||
1168 | ram_res->name = "System RAM"; | ||
1169 | |||
1157 | crashk_res.end = end - 1; | 1170 | crashk_res.end = end - 1; |
1171 | |||
1172 | insert_resource(&iomem_resource, ram_res); | ||
1158 | crash_unmap_reserved_pages(); | 1173 | crash_unmap_reserved_pages(); |
1159 | 1174 | ||
1160 | unlock: | 1175 | unlock: |