内核不支持 crashkernel=auto 参数分析

105 篇文章 2 订阅

最新的opnfv内核不支持  crashkernel=auto 参数分析,是因为在__parse_crashkernel中少了如下的代码


#ifdef CONFIG_KEXEC_AUTO_RESERVE
	if (strncmp(ck_cmdline, "auto", 4) == 0) {
		unsigned long long size;

		size = arch_default_crash_size(system_ram);
		if (size != 0) {
			*crash_size = size;
			*crash_base = arch_default_crash_base();
			return 0;
		} else {
			pr_warning("crashkernel=auto resulted in zero bytes of reserved memory.\n");
			return -ENOMEM;
		}
	}
#endif


这段代码发现参数为crashkernel=auto后,会用arch_default_crash_size()和arch_default_crash_base() 自动计算小内核的内存大小和起始位置,现在新的内核4.4.6中没有了该逻辑,必须配置crashkernel=256M这样的参数


注:

CONFIG_KEXEC_AUTO_RESERVE这段代码,在upstream的3.10都没有,说明是红帽自己的补丁,网上有讨论,看来没有合入主分支,可以参考

http://marc.info/?t=124947125000003&r=1&w=2


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
/* Linux内核中reserve_crashkernel函数的定义 */ int __init reserve_crashkernel(void) { unsigned long long crash_size; unsigned long long start_crashkernel, end_crashkernel; unsigned long long start_pfn, end_pfn; int ret = 0; unsigned long flags; /* * 如果已经设置了crashkernel参数,则使用该参数的值; * 否则默认使用2个物理页的大小作为crashkernel的大小。 */ if (!crashk_res.start && !crashk_res.end) { crash_size = 2 * (unsigned long long)PAGE_SIZE; printk(KERN_INFO "Reserving %lluMB of memory at %lluMB for crashkernel (System RAM: %lluMB)\n", crash_size >> 20, PFN_PHYS(max_pfn) >> 20, PFN_PHYS(max_pfn) >> 20); } else { crash_size = PFN_PHYS(crashk_res.end - crashk_res.start + 1); printk(KERN_INFO "Reserving %lluMB of memory at %lluMB for crashkernel (System RAM: %lluMB)\n", crash_size >> 20, PFN_PHYS(crashk_res.start) >> 20, PFN_PHYS(max_pfn) >> 20); } /* 获取crashkernel的起始地址和结束地址 */ start_crashkernel = PFN_PHYS(crashk_res.start); end_crashkernel = start_crashkernel + crash_size; /* 获取start_crashkernel和end_crashkernel所对应的物理页框号 */ start_pfn = start_crashkernel >> PAGE_SHIFT; end_pfn = end_crashkernel >> PAGE_SHIFT; /* 如果crashkernel的结束地址超过了系统的最大物理地址,则返回错误 */ if (end_pfn > max_pfn) { printk(KERN_ERR "crashkernel reservation failed - memory beyond limit of %llx\n", (unsigned long long)max_pfn << PAGE_SHIFT); return -EINVAL; } /* 设置crashkernel所在的物理页框为Reserved类型 */ for (; start_pfn < end_pfn; start_pfn++) { SetPageReserved(pfn_to_page(start_pfn)); num_poisoned_pages++; } /* * 设置crashkernel的保留区域不能被swap out,这样可以确保crashkernel的 * 内存不会被清空。 */ flags = VM_RESERVED | VM_READ | VM_WRITE | VM_PFNMAP | VM_IOREMAP; if (mmap_write_lock_killable(mm)) return -EINTR; vma = mmap(NULL, crash_size, PROT_NONE, flags, -1, 0); if (IS_ERR(vma)) { printk(KERN_ERR "crashkernel: Can't reserve %lluMB of memory at %llx\n", crash_size >> 20, start_crashkernel); ret = -ENOMEM; goto out; } vma->vm_page_prot = pgprot_writecombine(vma->vm_page_prot); vma->vm_private_data = &crash_pfn; vma->vm_ops = &crash_mmap_ops; ret = 0; out: mmap_write_unlock(mm); return ret; } /* reserve_crashkernel函数的作用是为crashkernel保留一段物理内存区域,并将该区域的物理页框设置为Reserved类型。 该函数会先判断是否已经设置了crashkernel参数,如果没有,则默认使用2个物理页的大小作为crashkernel的大小。 然后获取crashkernel所占用的物理内存的起始地址和结束地址,并将其所对应的物理页框设置为Reserved类型。 最后,设置crashkernel的保留区域不能被swap out,这样可以确保crashkernel的内存不会被清空。 */

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值