From: Dave Hansen <dave.hansen@intel.com>
To: "Kirill A. Shutemov" <kirill.shutemov@linux.intel.com>,
Thomas Gleixner <tglx@linutronix.de>,
Ingo Molnar <mingo@redhat.com>, Borislav Petkov <bp@alien8.de>,
Dave Hansen <dave.hansen@linux.intel.com>,
x86@kernel.org
Cc: "Rafael J. Wysocki" <rafael@kernel.org>,
Peter Zijlstra <peterz@infradead.org>,
Adrian Hunter <adrian.hunter@intel.com>,
Kuppuswamy Sathyanarayanan
<sathyanarayanan.kuppuswamy@linux.intel.com>,
Elena Reshetova <elena.reshetova@intel.com>,
Jun Nakajima <jun.nakajima@intel.com>,
Rick Edgecombe <rick.p.edgecombe@intel.com>,
Tom Lendacky <thomas.lendacky@amd.com>,
"Kalra, Ashish" <ashish.kalra@amd.com>,
Sean Christopherson <seanjc@google.com>,
"Huang, Kai" <kai.huang@intel.com>, Baoquan He <bhe@redhat.com>,
kexec@lists.infradead.org, linux-coco@lists.linux.dev,
linux-kernel@vger.kernel.org
Subject: Re: [PATCHv7 08/16] x86/tdx: Account shared memory
Date: Fri, 23 Feb 2024 11:08:18 -0800 [thread overview]
Message-ID: <a69a3d67-7352-4bf4-8766-a55ce97e46bd@intel.com> (raw)
In-Reply-To: <20240212104448.2589568-9-kirill.shutemov@linux.intel.com>
On 2/12/24 02:44, Kirill A. Shutemov wrote:
> The kernel will convert all shared memory back to private during kexec.
> The direct mapping page tables will provide information on which memory
> is shared.
>
> It is extremely important to convert all shared memory. If a page is
> missed, it will cause the second kernel to crash when it accesses it.
>
> Keep track of the number of shared pages. This will allow for
> cross-checking against the shared information in the direct mapping and
> reporting if the shared bit is lost.
>
> Include a debugfs interface that allows for the check to be performed at
> any point.
When I read this, I thought you were going to do some automatic
checking. Could you make it more clear here that it's 100% up to the
user to figure out if the numbers in debugfs match and whether there's a
problem? This would also be a great place to mention that the whole
thing is racy.
> +static atomic_long_t nr_shared;
> +
> +static inline bool pte_decrypted(pte_t pte)
> +{
> + return cc_mkdec(pte_val(pte)) == pte_val(pte);
> +}
Name this pte_is_decrypted(), please.
> /* Called from __tdx_hypercall() for unrecoverable failure */
> noinstr void __noreturn __tdx_hypercall_failed(void)
> {
> @@ -821,6 +829,11 @@ static int tdx_enc_status_change_finish(unsigned long vaddr, int numpages,
> if (!enc && !tdx_enc_status_changed(vaddr, numpages, enc))
> return -EIO;
>
> + if (enc)
> + atomic_long_sub(numpages, &nr_shared);
> + else
> + atomic_long_add(numpages, &nr_shared);
> +
> return 0;
> }
>
> @@ -896,3 +909,59 @@ void __init tdx_early_init(void)
>
> pr_info("Guest detected\n");
> }
> +
> +#ifdef CONFIG_DEBUG_FS
> +static int tdx_shared_memory_show(struct seq_file *m, void *p)
> +{
> + unsigned long addr, end;
> + unsigned long found = 0;
> +
> + addr = PAGE_OFFSET;
> + end = PAGE_OFFSET + get_max_mapped();
> +
> + while (addr < end) {
> + unsigned long size;
> + unsigned int level;
> + pte_t *pte;
> +
> + pte = lookup_address(addr, &level);
> + size = page_level_size(level);
> +
> + if (pte && pte_decrypted(*pte))
> + found += size / PAGE_SIZE;
> +
> + addr += size;
> +
> + cond_resched();
> + }
This is totally racy, right? Nothing prevents the PTE from
flip-flopping all over the place.
> + seq_printf(m, "Number of shared pages in kernel page tables: %16lu\n",
> + found);
> + seq_printf(m, "Number of pages accounted as shared: %16ld\n",
> + atomic_long_read(&nr_shared));
> + return 0;
> +}
Ditto with 'nr_shared'. There's nothing to say that the page table walk
has anything to do with 'nr_shared' by the time we get down here.
That's not _fatal_ for a debug interface, but the pitfalls need to at
least be discussed. Better yet would be to make sure this and the cpa
code don't stomp on each other.
next prev parent reply other threads:[~2024-02-23 19:08 UTC|newest]
Thread overview: 56+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-02-12 10:44 [PATCHv7 00/16] x86/tdx: Add kexec support Kirill A. Shutemov
2024-02-12 10:44 ` [PATCHv7 01/16] x86/acpi: Extract ACPI MADT wakeup code into a separate file Kirill A. Shutemov
2024-02-19 4:45 ` Baoquan He
2024-02-19 10:08 ` Kirill A. Shutemov
2024-02-19 11:36 ` Baoquan He
2024-02-23 10:32 ` Thomas Gleixner
2024-02-12 10:44 ` [PATCHv7 02/16] x86/apic: Mark acpi_mp_wake_* variables as __ro_after_init Kirill A. Shutemov
2024-02-19 4:46 ` Baoquan He
2024-02-23 10:31 ` Thomas Gleixner
2024-02-12 10:44 ` [PATCHv7 03/16] cpu/hotplug: Add support for declaring CPU offlining not supported Kirill A. Shutemov
2024-02-12 10:44 ` [PATCHv7 04/16] cpu/hotplug, x86/acpi: Disable CPU offlining for ACPI MADT wakeup Kirill A. Shutemov
2024-02-12 10:44 ` [PATCHv7 05/16] x86/kexec: Keep CR4.MCE set during kexec for TDX guest Kirill A. Shutemov
2024-02-22 22:04 ` Thomas Gleixner
2024-02-12 10:44 ` [PATCHv7 06/16] x86/mm: Make x86_platform.guest.enc_status_change_*() return errno Kirill A. Shutemov
2024-02-23 18:26 ` Dave Hansen
2024-02-12 10:44 ` [PATCHv7 07/16] x86/mm: Return correct level from lookup_address() if pte is none Kirill A. Shutemov
2024-02-19 5:12 ` Baoquan He
2024-02-19 13:52 ` Kirill A. Shutemov
2024-02-20 10:25 ` Baoquan He
2024-02-20 12:36 ` Kirill A. Shutemov
2024-02-21 2:37 ` Baoquan He
2024-02-21 14:15 ` Kirill A. Shutemov
2024-02-22 11:01 ` Baoquan He
2024-02-22 14:04 ` Kirill A. Shutemov
2024-02-22 15:37 ` Baoquan He
2024-02-23 18:45 ` Dave Hansen
2024-02-23 18:58 ` Dave Hansen
2024-02-12 10:44 ` [PATCHv7 08/16] x86/tdx: Account shared memory Kirill A. Shutemov
2024-02-23 19:08 ` Dave Hansen [this message]
2024-02-25 15:54 ` Kirill A. Shutemov
2024-02-25 17:34 ` Dave Hansen
2024-02-12 10:44 ` [PATCHv7 09/16] x86/mm: Adding callbacks to prepare encrypted memory for kexec Kirill A. Shutemov
2024-02-12 10:44 ` [PATCHv7 10/16] x86/tdx: Convert shared memory back to private on kexec Kirill A. Shutemov
2024-02-23 19:39 ` Dave Hansen
2024-02-25 14:58 ` Kirill A. Shutemov
2024-02-26 13:10 ` Kirill A. Shutemov
2024-02-26 13:58 ` Dave Hansen
2024-02-12 10:44 ` [PATCHv7 11/16] x86/mm: Make e820_end_ram_pfn() cover E820_TYPE_ACPI ranges Kirill A. Shutemov
2024-02-23 19:41 ` Dave Hansen
2024-02-12 10:44 ` [PATCHv7 12/16] x86/acpi: Rename fields in acpi_madt_multiproc_wakeup structure Kirill A. Shutemov
2024-02-23 10:27 ` Thomas Gleixner
2024-02-12 10:44 ` [PATCHv7 13/16] x86/acpi: Do not attempt to bring up secondary CPUs in kexec case Kirill A. Shutemov
2024-02-23 10:28 ` Thomas Gleixner
2024-02-12 10:44 ` [PATCHv7 14/16] x86/smp: Add smp_ops.stop_this_cpu() callback Kirill A. Shutemov
2024-02-23 10:26 ` Thomas Gleixner
2024-02-12 10:44 ` [PATCHv7 15/16] x86/mm: Introduce kernel_ident_mapping_free() Kirill A. Shutemov
2024-02-12 10:44 ` [PATCHv7 16/16] x86/acpi: Add support for CPU offlining for ACPI MADT wakeup method Kirill A. Shutemov
2024-02-23 10:31 ` Thomas Gleixner
2024-02-20 1:18 ` [PATCH 0/2] x86/snp: Add kexec support Ashish Kalra
2024-02-20 1:18 ` [PATCH 1/2] x86/mm: Do not zap PMD entry mapping unaccepted memory table during kdump Ashish Kalra
2024-02-20 12:42 ` Kirill A. Shutemov
2024-02-20 19:09 ` Kalra, Ashish
2024-02-20 1:18 ` [PATCH 2/2] x86/snp: Convert shared memory back to private on kexec Ashish Kalra
2024-02-21 20:35 ` Tom Lendacky
2024-02-22 10:50 ` Kirill A. Shutemov
2024-02-22 13:58 ` Tom Lendacky
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=a69a3d67-7352-4bf4-8766-a55ce97e46bd@intel.com \
--to=dave.hansen@intel.com \
--cc=adrian.hunter@intel.com \
--cc=ashish.kalra@amd.com \
--cc=bhe@redhat.com \
--cc=bp@alien8.de \
--cc=dave.hansen@linux.intel.com \
--cc=elena.reshetova@intel.com \
--cc=jun.nakajima@intel.com \
--cc=kai.huang@intel.com \
--cc=kexec@lists.infradead.org \
--cc=kirill.shutemov@linux.intel.com \
--cc=linux-coco@lists.linux.dev \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@redhat.com \
--cc=peterz@infradead.org \
--cc=rafael@kernel.org \
--cc=rick.p.edgecombe@intel.com \
--cc=sathyanarayanan.kuppuswamy@linux.intel.com \
--cc=seanjc@google.com \
--cc=tglx@linutronix.de \
--cc=thomas.lendacky@amd.com \
--cc=x86@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).