diff options
author | Ingo Molnar <mingo@elte.hu> | 2009-02-12 07:31:41 -0500 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2009-02-12 09:21:16 -0500 |
commit | 4769843bc265a9c24584b98709cf39e1df5c1404 (patch) | |
tree | 7c0631b5c1a25c97a07359613187c3e6aab93463 /arch/x86 | |
parent | 3023533de43c5c01c660e1b48d3700b028eb4615 (diff) |
x86, 32-bit: clean up find_low_pfn_range()
Impact: cleanup
Split find_low_pfn_range() into two functions:
- lowmem_pfn_init()
- highmem_pfn_init()
The former gets called if all of RAM fits into lowmem,
otherwise we call highmem_pfn_init().
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'arch/x86')
-rw-r--r-- | arch/x86/mm/init_32.c | 137 |
1 files changed, 79 insertions, 58 deletions
diff --git a/arch/x86/mm/init_32.c b/arch/x86/mm/init_32.c index e77459dd38ae..9d36eb9ebd53 100644 --- a/arch/x86/mm/init_32.c +++ b/arch/x86/mm/init_32.c | |||
@@ -675,75 +675,96 @@ static int __init parse_highmem(char *arg) | |||
675 | } | 675 | } |
676 | early_param("highmem", parse_highmem); | 676 | early_param("highmem", parse_highmem); |
677 | 677 | ||
678 | #define MSG_HIGHMEM_TOO_BIG \ | ||
679 | "highmem size (%luMB) is bigger than pages available (%luMB)!\n" | ||
680 | |||
681 | #define MSG_LOWMEM_TOO_SMALL \ | ||
682 | "highmem size (%luMB) results in <64MB lowmem, ignoring it!\n" | ||
678 | /* | 683 | /* |
679 | * Determine low and high memory ranges: | 684 | * All of RAM fits into lowmem - but if user wants highmem |
685 | * artificially via the highmem=x boot parameter then create | ||
686 | * it: | ||
680 | */ | 687 | */ |
681 | void __init find_low_pfn_range(void) | 688 | void __init lowmem_pfn_init(void) |
682 | { | 689 | { |
683 | /* it could update max_pfn */ | 690 | if (highmem_pages == -1) |
684 | 691 | highmem_pages = 0; | |
685 | /* max_low_pfn is 0, we already have early_res support */ | 692 | #ifdef CONFIG_HIGHMEM |
686 | 693 | if (highmem_pages >= max_pfn) { | |
687 | max_low_pfn = max_pfn; | 694 | printk(KERN_ERR MSG_HIGHMEM_TOO_BIG, |
688 | if (max_low_pfn > MAXMEM_PFN) { | 695 | pages_to_mb(highmem_pages), pages_to_mb(max_pfn)); |
689 | if (highmem_pages == -1) | 696 | highmem_pages = 0; |
690 | highmem_pages = max_pfn - MAXMEM_PFN; | 697 | } |
691 | if (highmem_pages + MAXMEM_PFN < max_pfn) | 698 | if (highmem_pages) { |
692 | max_pfn = MAXMEM_PFN + highmem_pages; | 699 | if (max_low_pfn - highmem_pages < 64*1024*1024/PAGE_SIZE) { |
693 | if (highmem_pages + MAXMEM_PFN > max_pfn) { | 700 | printk(KERN_ERR MSG_LOWMEM_TOO_SMALL, |
694 | printk(KERN_WARNING "only %luMB highmem pages " | ||
695 | "available, ignoring highmem size of %luMB.\n", | ||
696 | pages_to_mb(max_pfn - MAXMEM_PFN), | ||
697 | pages_to_mb(highmem_pages)); | 701 | pages_to_mb(highmem_pages)); |
698 | highmem_pages = 0; | 702 | highmem_pages = 0; |
699 | } | 703 | } |
700 | max_low_pfn = MAXMEM_PFN; | 704 | max_low_pfn -= highmem_pages; |
705 | } | ||
706 | #else | ||
707 | if (highmem_pages) | ||
708 | printk(KERN_ERR "ignoring highmem size on non-highmem kernel!\n"); | ||
709 | #endif | ||
710 | } | ||
711 | |||
712 | #define MSG_HIGHMEM_TOO_SMALL \ | ||
713 | "only %luMB highmem pages available, ignoring highmem size of %luMB!\n" | ||
714 | |||
715 | #define MSG_HIGHMEM_TRIMMED \ | ||
716 | "Warning: only 4GB will be used. Use a HIGHMEM64G enabled kernel!\n" | ||
717 | /* | ||
718 | * We have more RAM than fits into lowmem - we try to put it into | ||
719 | * highmem, also taking the highmem=x boot parameter into account: | ||
720 | */ | ||
721 | void __init highmem_pfn_init(void) | ||
722 | { | ||
723 | if (highmem_pages == -1) | ||
724 | highmem_pages = max_pfn - MAXMEM_PFN; | ||
725 | |||
726 | if (highmem_pages + MAXMEM_PFN < max_pfn) | ||
727 | max_pfn = MAXMEM_PFN + highmem_pages; | ||
728 | |||
729 | if (highmem_pages + MAXMEM_PFN > max_pfn) { | ||
730 | printk(KERN_WARNING MSG_HIGHMEM_TOO_SMALL, | ||
731 | pages_to_mb(max_pfn - MAXMEM_PFN), | ||
732 | pages_to_mb(highmem_pages)); | ||
733 | highmem_pages = 0; | ||
734 | } | ||
735 | max_low_pfn = MAXMEM_PFN; | ||
701 | #ifndef CONFIG_HIGHMEM | 736 | #ifndef CONFIG_HIGHMEM |
702 | /* Maximum memory usable is what is directly addressable */ | 737 | /* Maximum memory usable is what is directly addressable */ |
703 | printk(KERN_WARNING "Warning only %ldMB will be used.\n", | 738 | printk(KERN_WARNING "Warning only %ldMB will be used.\n", MAXMEM>>20); |
704 | MAXMEM>>20); | 739 | if (max_pfn > MAX_NONPAE_PFN) |
705 | if (max_pfn > MAX_NONPAE_PFN) | 740 | printk(KERN_WARNING "Use a HIGHMEM64G enabled kernel.\n"); |
706 | printk(KERN_WARNING | 741 | else |
707 | "Use a HIGHMEM64G enabled kernel.\n"); | 742 | printk(KERN_WARNING "Use a HIGHMEM enabled kernel.\n"); |
708 | else | 743 | max_pfn = MAXMEM_PFN; |
709 | printk(KERN_WARNING "Use a HIGHMEM enabled kernel.\n"); | ||
710 | max_pfn = MAXMEM_PFN; | ||
711 | #else /* !CONFIG_HIGHMEM */ | 744 | #else /* !CONFIG_HIGHMEM */ |
712 | #ifndef CONFIG_HIGHMEM64G | 745 | #ifndef CONFIG_HIGHMEM64G |
713 | if (max_pfn > MAX_NONPAE_PFN) { | 746 | if (max_pfn > MAX_NONPAE_PFN) { |
714 | max_pfn = MAX_NONPAE_PFN; | 747 | max_pfn = MAX_NONPAE_PFN; |
715 | printk(KERN_WARNING "Warning only 4GB will be used." | 748 | printk(KERN_WARNING MSG_HIGHMEM_TRIMMED); |
716 | "Use a HIGHMEM64G enabled kernel.\n"); | 749 | } |
717 | } | ||
718 | #endif /* !CONFIG_HIGHMEM64G */ | 750 | #endif /* !CONFIG_HIGHMEM64G */ |
719 | #endif /* !CONFIG_HIGHMEM */ | 751 | #endif /* !CONFIG_HIGHMEM */ |
720 | } else { | 752 | } |
721 | if (highmem_pages == -1) | 753 | |
722 | highmem_pages = 0; | 754 | /* |
723 | #ifdef CONFIG_HIGHMEM | 755 | * Determine low and high memory ranges: |
724 | if (highmem_pages >= max_pfn) { | 756 | */ |
725 | printk(KERN_ERR "highmem size specified (%luMB) is " | 757 | void __init find_low_pfn_range(void) |
726 | "bigger than pages available (%luMB)!.\n", | 758 | { |
727 | pages_to_mb(highmem_pages), | 759 | /* it could update max_pfn */ |
728 | pages_to_mb(max_pfn)); | 760 | |
729 | highmem_pages = 0; | 761 | /* max_low_pfn is 0, we already have early_res support */ |
730 | } | 762 | max_low_pfn = max_pfn; |
731 | if (highmem_pages) { | 763 | |
732 | if (max_low_pfn - highmem_pages < | 764 | if (max_low_pfn > MAXMEM_PFN) |
733 | 64*1024*1024/PAGE_SIZE){ | 765 | highmem_pfn_init(); |
734 | printk(KERN_ERR "highmem size %luMB results in " | 766 | else |
735 | "smaller than 64MB lowmem, ignoring it.\n" | 767 | lowmem_pfn_init(); |
736 | , pages_to_mb(highmem_pages)); | ||
737 | highmem_pages = 0; | ||
738 | } | ||
739 | max_low_pfn -= highmem_pages; | ||
740 | } | ||
741 | #else | ||
742 | if (highmem_pages) | ||
743 | printk(KERN_ERR "ignoring highmem size on non-highmem" | ||
744 | " kernel!\n"); | ||
745 | #endif | ||
746 | } | ||
747 | } | 768 | } |
748 | 769 | ||
749 | #ifndef CONFIG_NEED_MULTIPLE_NODES | 770 | #ifndef CONFIG_NEED_MULTIPLE_NODES |