From nobody Fri Oct 31 04:25:16 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) client-ip=192.237.175.120; envelope-from=xen-devel-bounces@lists.xenproject.org; helo=lists.xenproject.org; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org; dmarc=pass(p=quarantine dis=none) header.from=suse.com ARC-Seal: i=1; a=rsa-sha256; t=1751444499; cv=none; d=zohomail.com; s=zohoarc; b=K1WkcdZa8sTifkHwhv/QIQfXy+tv35o7XxVTgsQHTib1HPgIHwHpeeLBH4rNTAvqn44TkoGiMby4981EzZo1qrO5l9nIuz60SDvX3MzLIKt+2MbNwRxB2y+29rHpDEqaj/W2cAfafeUlFCRx8ZQwTHyIMbboZfCpwRg1X+e744Y= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1751444499; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=PqeT9QtIJE1Ok+fqszezjXe9WOy8z56eRXWRpRN0vUQ=; b=b6XiZnX8eOPQUKi8hw2j9Mbz2yzyXkSsfVaMAJ4yNXRtqZJVLn+AlMYPWiwtaWl+cIOXpGSSZagakXWFnDaYvRm8n8fzeATzqGAO5SATsNXGu2MZ1awnJxCmbL+zbUkRsg+0JQ2OzT01KZj6rCpEml/avMySxV6KUWiyA83CqJ0= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org; dmarc=pass header.from= (p=quarantine dis=none) Return-Path: Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) by mx.zohomail.com with SMTPS id 1751444499601658.4020834435037; Wed, 2 Jul 2025 01:21:39 -0700 (PDT) Received: from list by lists.xenproject.org with outflank-mailman.1030543.1404282 (Exim 4.92) (envelope-from ) id 1uWsic-00031U-AW; Wed, 02 Jul 2025 08:21:26 +0000 Received: by outflank-mailman (output) from mailman id 1030543.1404282; Wed, 02 Jul 2025 08:21:26 +0000 Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1uWsic-000318-6X; Wed, 02 Jul 2025 08:21:26 +0000 Received: by outflank-mailman (input) for mailman id 1030543; Wed, 02 Jul 2025 08:21:24 +0000 Received: from se1-gles-flk1-in.inumbo.com ([94.247.172.50] helo=se1-gles-flk1.inumbo.com) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1uWsaz-00082X-4Q for xen-devel@lists.xenproject.org; Wed, 02 Jul 2025 08:13:33 +0000 Received: from smtp-out1.suse.de (smtp-out1.suse.de [195.135.223.130]) by se1-gles-flk1.inumbo.com (Halon) with ESMTPS id 7102907b-571c-11f0-b894-0df219b8e170; Wed, 02 Jul 2025 10:13:31 +0200 (CEST) Received: from imap1.dmz-prg2.suse.org (unknown [10.150.64.97]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by smtp-out1.suse.de (Postfix) with ESMTPS id 3F6212117F; Wed, 2 Jul 2025 08:13:31 +0000 (UTC) Received: from imap1.dmz-prg2.suse.org (localhost [127.0.0.1]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by imap1.dmz-prg2.suse.org (Postfix) with ESMTPS id 135DA13A24; Wed, 2 Jul 2025 08:13:31 +0000 (UTC) Received: from dovecot-director2.suse.de ([2a07:de40:b281:106:10:150:64:167]) by imap1.dmz-prg2.suse.org with ESMTPSA id FoE4AyvqZGgfSQAAD6G6ig (envelope-from ); Wed, 02 Jul 2025 08:13:31 +0000 X-Outflank-Mailman: Message body and most headers restored to incoming version X-BeenThere: xen-devel@lists.xenproject.org List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xenproject.org Precedence: list Sender: "Xen-devel" X-Inumbo-ID: 7102907b-571c-11f0-b894-0df219b8e170 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.com; s=susede1; t=1751444011; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=PqeT9QtIJE1Ok+fqszezjXe9WOy8z56eRXWRpRN0vUQ=; b=QrGGKNYL/DWVxxTQCLDbMmIH7WiOgWMb7tx1iOXOjolTiAiQlzDJxRfPweerBktWwhi3Nj Ihh1pzYSvqqSlsaH28aA0oOTozW+Y3GOnU7FG14JRopCWE1kJJpZ9oFZD4P42d+47l0TRi AOKexml5tJYNEP1+Q06QyXLtOnirIiA= Authentication-Results: smtp-out1.suse.de; none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.com; s=susede1; t=1751444011; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=PqeT9QtIJE1Ok+fqszezjXe9WOy8z56eRXWRpRN0vUQ=; b=QrGGKNYL/DWVxxTQCLDbMmIH7WiOgWMb7tx1iOXOjolTiAiQlzDJxRfPweerBktWwhi3Nj Ihh1pzYSvqqSlsaH28aA0oOTozW+Y3GOnU7FG14JRopCWE1kJJpZ9oFZD4P42d+47l0TRi AOKexml5tJYNEP1+Q06QyXLtOnirIiA= From: Juergen Gross To: minios-devel@lists.xenproject.org, xen-devel@lists.xenproject.org Cc: samuel.thibault@ens-lyon.org, Juergen Gross Subject: [MINI-OS PATCH 06/19] mm: don't add module pages to free memory Date: Wed, 2 Jul 2025 10:12:41 +0200 Message-ID: <20250702081254.14383-7-jgross@suse.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250702081254.14383-1-jgross@suse.com> References: <20250702081254.14383-1-jgross@suse.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Spam-Flag: NO X-Spam-Score: -2.80 X-Spamd-Result: default: False [-2.80 / 50.00]; BAYES_HAM(-3.00)[100.00%]; NEURAL_HAM_LONG(-1.00)[-1.000]; MID_CONTAINS_FROM(1.00)[]; R_MISSING_CHARSET(0.50)[]; NEURAL_HAM_SHORT(-0.20)[-0.999]; MIME_GOOD(-0.10)[text/plain]; MIME_TRACE(0.00)[0:+]; TO_DN_SOME(0.00)[]; RCVD_VIA_SMTP_AUTH(0.00)[]; ARC_NA(0.00)[]; DKIM_SIGNED(0.00)[suse.com:s=susede1]; FUZZY_BLOCKED(0.00)[rspamd.com]; FROM_EQ_ENVFROM(0.00)[]; FROM_HAS_DN(0.00)[]; RCPT_COUNT_THREE(0.00)[4]; RCVD_COUNT_TWO(0.00)[2]; TO_MATCH_ENVRCPT_ALL(0.00)[]; DBL_BLOCKED_OPENRESOLVER(0.00)[suse.com:mid,suse.com:email,imap1.dmz-prg2.suse.org:helo]; RCVD_TLS_ALL(0.00)[] X-Spam-Level: X-ZohoMail-DKIM: pass (identity @suse.com) X-ZM-MESSAGEID: 1751444501445116600 Content-Type: text/plain; charset="utf-8" When initializing the memory allocator, don't add memory pages of modules and the initial boot info structure to the free memory. This is relevant only when running in PVH mode, as in PV mode only memory above the initial page tables is added to free memory, and the module and start_info pages are below the page tables. Signed-off-by: Juergen Gross --- arch/x86/mm.c | 80 +++++++++++++++++++++++++++++++++++++++++++++++++++ include/mm.h | 1 + mm.c | 21 +++++++++++++- 3 files changed, 101 insertions(+), 1 deletion(-) diff --git a/arch/x86/mm.c b/arch/x86/mm.c index 26ede6f4..7c3c83be 100644 --- a/arch/x86/mm.c +++ b/arch/x86/mm.c @@ -78,6 +78,10 @@ void arch_mm_preinit(void *p) last_free_pfn =3D si->nr_pages; balloon_set_nr_pages(last_free_pfn, last_free_pfn); } + +void check_memory_range(unsigned long *from, unsigned long *to) +{ +} #else #include user_desc gdt[NR_GDT_ENTRIES] =3D @@ -125,6 +129,78 @@ void arch_mm_preinit(void *p) last_free_pfn =3D e820_get_maxpfn(pages); balloon_set_nr_pages(pages, last_free_pfn); } + +static void check_memory_range_conflict(unsigned long *from, unsigned long= *to, + unsigned long chk, unsigned long s= z) +{ + unsigned long chk_end =3D chk + sz; + + if ( *to <=3D chk || *from >=3D chk_end ) + return; + + if ( chk <=3D *from ) + *from =3D (chk_end >=3D *to) ? *to : chk_end; + else + *to =3D chk; +} + +/* Reserved memory ranges not added to free memory. */ +#define MAX_RSV_RANGES 1 +static struct { + unsigned long start; + unsigned long size; +} reserved_range[MAX_RSV_RANGES]; + +void check_memory_range(unsigned long *from, unsigned long *to) +{ + unsigned int m; + struct hvm_modlist_entry *mod; + + for ( m =3D 0; m < MAX_RSV_RANGES && reserved_range[m].size; m++ ) + check_memory_range_conflict(from, to, reserved_range[m].start, + reserved_range[m].size); + + mod =3D (struct hvm_modlist_entry *)(unsigned long) + hvm_start_info_ptr->modlist_paddr; + for ( m =3D 0; m < hvm_start_info_ptr->nr_modules; m++ ) + check_memory_range_conflict(from, to, mod[m].paddr, mod[m].size); +} + +#define max(a, b) ((a) < (b) ? (b) : (a)) + +static void pvh_reserve_start_info(unsigned long *start_pfn) +{ + unsigned long end =3D 0; + unsigned long start =3D (unsigned long)hvm_start_info_ptr; + unsigned long end_pfn; + unsigned int m; + struct hvm_modlist_entry *mod; + char *cmdline; + + mod =3D (void *)(unsigned long)hvm_start_info_ptr->modlist_paddr; + + end =3D max(end, start + sizeof(struct hvm_start_info)); + end =3D max(end, hvm_start_info_ptr->modlist_paddr + + hvm_start_info_ptr->nr_modules * + sizeof(struct hvm_modlist_entry)); + for ( m =3D 0; m < hvm_start_info_ptr->nr_modules; m++ ) + { + cmdline =3D (char *)(unsigned long)mod[m].cmdline_paddr; + if ( cmdline ) + end =3D max(end, (unsigned long)cmdline + strlen(cmdline) + 1); + } + cmdline =3D (char *)(unsigned long)hvm_start_info_ptr->cmdline_paddr; + if ( cmdline ) + end =3D max(end, (unsigned long)cmdline + strlen(cmdline) + 1); + if ( hvm_start_info_ptr->version >=3D 1 ) + end =3D max(end, hvm_start_info_ptr->memmap_paddr + + hvm_start_info_ptr->memmap_entries * + sizeof(struct hvm_memmap_table_entry)); + + end_pfn =3D PFN_UP(end); + if ( end_pfn > *start_pfn ) + *start_pfn =3D end_pfn; +} #endif =20 static const struct { @@ -888,6 +964,10 @@ void arch_init_mm(unsigned long* start_pfn_p, unsigned= long* max_pfn_p) if ( max_pfn >=3D MAX_MEM_SIZE / PAGE_SIZE ) max_pfn =3D MAX_MEM_SIZE / PAGE_SIZE - 1; =20 +#ifndef CONFIG_PARAVIRT + pvh_reserve_start_info(&start_pfn); +#endif + printk(" start_pfn: %lx\n", start_pfn); printk(" max_pfn: %lx\n", max_pfn); =20 diff --git a/include/mm.h b/include/mm.h index 1dc89ddb..995e9862 100644 --- a/include/mm.h +++ b/include/mm.h @@ -74,6 +74,7 @@ static __inline__ int get_order(unsigned long size) =20 void arch_init_demand_mapping_area(void); void arch_init_mm(unsigned long* start_pfn_p, unsigned long* max_pfn_p); +void check_memory_range(unsigned long *from, unsigned long *to); =20 unsigned long allocate_ondemand(unsigned long n, unsigned long alignment); /* map f[i*stride]+i*increment for i in 0..n-1, aligned on alignment pages= */ diff --git a/mm.c b/mm.c index 858dc108..8c41d2f2 100644 --- a/mm.c +++ b/mm.c @@ -185,6 +185,25 @@ static void add_memory_range(unsigned long r_min, unsi= gned long r_max) } } =20 +static void consider_memory_range(unsigned long r_min, unsigned long r_max, + void (*func)(unsigned long, unsigned lon= g)) +{ + unsigned long from =3D r_min; + unsigned long to =3D r_max; + + while ( true ) + { + check_memory_range(&from, &to); + if ( from =3D=3D to ) + return; + + func(from, to); + + from =3D to; + to =3D r_max; + } +} + void iterate_memory_range(unsigned long min, unsigned long max, void (*func)(unsigned long, unsigned long)) { @@ -207,7 +226,7 @@ void iterate_memory_range(unsigned long min, unsigned l= ong max, if ( r_max > max ) r_max =3D max; =20 - func(r_min, r_max); + consider_memory_range(r_min, r_max, func); } } =20 --=20 2.43.0