|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Minios-devel] [PATCH v2 15/18] mini-os: remap p2m list in case of ballooning
Juergen Gross, on Fri 05 Aug 2016 19:35:59 +0200, wrote:
> In case of enabled ballooning we must be prepared for a growing p2m
> list. If the maximum memory size of the domain can't be covered by the
> actual p2m list remap it to the kernel virtual mapping area and leave
> enough space at the end.
>
> Signed-off-by: Juergen Gross <jgross@xxxxxxxx>
Reviewed-by: Samuel Thibault <samuel.thibault@xxxxxxxxxxxx>
> ---
> arch/arm/balloon.c | 2 ++
> arch/x86/balloon.c | 24 ++++++++++++++++++++++++
> arch/x86/mm.c | 3 +++
> include/balloon.h | 3 +++
> include/x86/arch_mm.h | 4 ++++
> 5 files changed, 36 insertions(+)
>
> diff --git a/arch/arm/balloon.c b/arch/arm/balloon.c
> index dc6270d..a76db3b 100644
> --- a/arch/arm/balloon.c
> +++ b/arch/arm/balloon.c
> @@ -25,4 +25,6 @@
>
> #ifdef CONFIG_BALLOON
>
> +unsigned long virt_kernel_area_end; /* TODO: find a virtual area */
> +
> #endif
> diff --git a/arch/x86/balloon.c b/arch/x86/balloon.c
> index dc6270d..db37e8f 100644
> --- a/arch/x86/balloon.c
> +++ b/arch/x86/balloon.c
> @@ -21,8 +21,32 @@
> * DEALINGS IN THE SOFTWARE.
> */
>
> +#include <mini-os/os.h>
> #include <mini-os/balloon.h>
> +#include <mini-os/lib.h>
> +#include <mini-os/mm.h>
>
> #ifdef CONFIG_BALLOON
>
> +unsigned long virt_kernel_area_end = VIRT_KERNEL_AREA;
> +
> +void arch_remap_p2m(unsigned long max_pfn)
> +{
> + unsigned long pfn;
> +
> + if ( p2m_pages(nr_max_pages) <= p2m_pages(max_pfn) )
> + return;
> +
> + for ( pfn = 0; pfn < max_pfn; pfn += P2M_ENTRIES )
> + {
> + map_frame_rw(virt_kernel_area_end + PAGE_SIZE * (pfn / P2M_ENTRIES),
> + virt_to_mfn(phys_to_machine_mapping + pfn));
> + }
> +
> + phys_to_machine_mapping = (unsigned long *)virt_kernel_area_end;
> + printk("remapped p2m list to %p\n", phys_to_machine_mapping);
> +
> + virt_kernel_area_end += PAGE_SIZE * p2m_pages(nr_max_pages);
> +}
> +
> #endif
> diff --git a/arch/x86/mm.c b/arch/x86/mm.c
> index a5c8959..8fa3b4c 100644
> --- a/arch/x86/mm.c
> +++ b/arch/x86/mm.c
> @@ -37,6 +37,7 @@
> #include <mini-os/errno.h>
> #include <mini-os/os.h>
> #include <mini-os/hypervisor.h>
> +#include <mini-os/balloon.h>
> #include <mini-os/mm.h>
> #include <mini-os/types.h>
> #include <mini-os/lib.h>
> @@ -626,6 +627,8 @@ void arch_init_p2m(unsigned long max_pfn)
> HYPERVISOR_shared_info->arch.pfn_to_mfn_frame_list_list =
> virt_to_mfn(l3_list);
> HYPERVISOR_shared_info->arch.max_pfn = max_pfn;
> +
> + arch_remap_p2m(max_pfn);
> }
>
> void arch_init_mm(unsigned long* start_pfn_p, unsigned long* max_pfn_p)
> diff --git a/include/balloon.h b/include/balloon.h
> index e7219f8..b8d9335 100644
> --- a/include/balloon.h
> +++ b/include/balloon.h
> @@ -27,12 +27,15 @@
> #ifdef CONFIG_BALLOON
>
> extern unsigned long nr_max_pages;
> +extern unsigned long virt_kernel_area_end;
>
> void get_max_pages(void);
> +void arch_remap_p2m(unsigned long max_pfn);
>
> #else /* CONFIG_BALLOON */
>
> static inline void get_max_pages(void) { }
> +static inline void arch_remap_p2m(unsigned long max_pfn) { }
>
> #endif /* CONFIG_BALLOON */
> #endif /* _BALLOON_H_ */
> diff --git a/include/x86/arch_mm.h b/include/x86/arch_mm.h
> index 7283f64..e5d9c57 100644
> --- a/include/x86/arch_mm.h
> +++ b/include/x86/arch_mm.h
> @@ -198,6 +198,10 @@ static inline void p2m_chk_pfn(unsigned long pfn)
> do_exit();
> }
> }
> +static inline unsigned long p2m_pages(unsigned long pages)
> +{
> + return (pages + P2M_ENTRIES - 1) >> L1_P2M_SHIFT;
> +}
>
> #include "arch_limits.h"
> #define PAGE_SIZE __PAGE_SIZE
> --
> 2.6.6
>
--
Samuel
<r> make
<r> oops
<m> make clean
_______________________________________________
Minios-devel mailing list
Minios-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/cgi-bin/mailman/listinfo/minios-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |