From: Pasha Tatashin <pasha.tatashin@soleen.com>
To: linux-kernel@vger.kernel.org, kexec@lists.infradead.org,
kvm@vger.kernel.org, linux-mm@kvack.org, kvmarm@lists.linux.dev
Cc: pasha.tatashin@soleen.com, rppt@kernel.org, graf@amazon.com,
pratyush@kernel.org, pbonzini@redhat.com, seanjc@google.com,
maz@kernel.org, oupton@kernel.org, dwmw2@infradead.org,
alex.williamson@redhat.com, kevin.tian@intel.com,
rientjes@google.com, Tycho.Andersen@amd.com,
anthony.yznaga@oracle.com, baolu.lu@linux.intel.com,
david@kernel.org, dmatlack@google.com, mheyne@amazon.de,
jgowans@amazon.com, jgg@nvidia.com, pankaj.gupta.linux@gmail.com,
kpraveen.lkml@gmail.com, vipinsh@google.com,
vannapurve@google.com, corbet@lwn.net,
loeser@linux.microsoft.com, tglx@kernel.org, mingo@redhat.com,
bp@alien8.de, dave.hansen@linux.intel.com, x86@kernel.org,
hpa@zytor.com, roman.gushchin@linux.dev,
akpm@linux-foundation.org, pjt@google.com
Subject: [RFC] proposal: KVM: Orphaned VMs: The Caretaker approach for Live Update
Date: Tue, 28 Apr 2026 22:29:40 +0000 [thread overview]
Message-ID: <afEwWZksU0Fw61oT@plex> (raw)
Hi all,
TL;DR: Below is a proposal for the next step in Live Update
functionality: maintaining vCPU execution during a host kernel reboot
via a "Caretaker" for orphaned VMs.
As cloud infrastructure continues to push toward zero-downtime host
maintenance, extending the capabilities of kexec-based Live Update to
minimize guest disruption is becoming increasingly critical.
I would greatly appreciate your thoughts on the overall architecture,
the proposed ABI, and any security or hardware-specific edge cases we
might have missed.
Background
==========
Currently, Live Update allows us to preserve hardware resources across a
kexec boundary, enabling VMs to be re-attached and resumed on the new
kernel. This resource preservation is orchestrated from the kernel side
by the LUO (https://docs.kernel.org/core-api/liveupdate.html). This
proposal outlines how we can extend this foundation to keep the VMs
running rather than just suspended during the transition, significantly
reducing the effective blackout experienced by the virtual machines.
Orphaned VMs
============
Definition: An Orphaned VM is a virtual machine actively executing guest
instructions on isolated physical hardware, completely decoupled from a
Host Operating System or a userspace Virtual Machine Monitor (VMM).
Historically, a VM's lifecycle has been strictly tied to a userspace VMM
process. The Orphaned VM strategy breaks this dependency by separating
resource ownership from active execution.
Before the old kernel shuts down, it uses the Live Update Orchestrator
to maintain ownership of the guest's underlying resources. The LUO
preserves the vmfd and vcpufd structures, guest memory, secondary page
tables, and other critical KVM metadata required to successfully restore
the VM state in the new kernel.
During the transition, the active execution of the VM is not managed by
the host kernel. Instead, execution is handed off to a specialized
bare-metal component: The Caretaker.
While the VM is "orphaned," it operates entirely outside of standard
userspace and kernel space. The physical CPU (pCPU) hosting the VM is
completely isolated from the Host OS. The vCPUs continue to execute
guest instructions uninterrupted, and any VM Exits are trapped and
handled exclusively by the Caretaker. This isolated execution continues
while the host kernel reboots on separate management cores (or while
the VMM restarts, if the Live Update is limited to a userspace
component).
The Caretaker
=============
The Caretaker is a specialized, identity-mapped bare-metal executable
attached to each vCPU. While it is installed during the initial VM setup
and remains permanently enabled as an interpose layer between the Guest
and KVM, it is the key architectural feature required for a VM to be
orphaned. By providing an execution environment independent of the host
OS, the Caretaker enables the guest workload to safely survive the host
lifecycle transition.
During normal VM operation, the Caretaker acts as a fast-path shim: it
forwards standard VM Exits down to the backing KVM kernel module and
handles certain exits autonomously. However, during the "Management Gap"
(when no host OS is active and standard KVM handlers are offline), the
Caretaker enters a standalone mode to ensure continuous guest execution
without host intervention.
While this proposal focuses on its critical role in minimally disruptive
Live Update, the Caretaker is fundamentally designed as an extensible
primitive. Its architecture allows it to be leveraged for a variety of
other advanced virtualization use cases, such as running custom
lightweight hypervisors or completely offloading virtualization duties
to an accelerator card.
Constraints
-----------
The Caretaker is a bare-metal executable. It does not have a backing
kernel, it makes zero syscalls, and it lacks access to underlying
hardware devices or complex I/O components.
Hardware Setup & ABI Interface
==============================
To interpose the Caretaker between the guest and the host OS, the
initialization sequence must load the bare-metal payload, rewire the
physical CPU's virtualization structures, and establish a syscall-free
communication channel.
API Design & Caretaker Installation
-----------------------------------
The Caretaker is installed early in the VM's lifecycle (e.g., shortly
after KVM_CREATE_VM). To manage this, we introduce a new KVM ioctl
(KVM_SET_CARETAKER) that configures the shim on the vcpufd
(alternatively on vmfd). Userspace provides the Caretaker payload
compiled as an ELF binary.
Using an ELF binary allows the Caretaker to be separated into distinct
memory sections:
* .text: The executable bare-metal instructions. This section is
mapped as read-execute (RX).
* .data / .rodata: The static data and variables. This includes the
pre-populated per-vCPU metadata (such as CPUID topology responses)
generated by the VMM.
* .ccb: A dedicated section specifically reserved for the Caretaker
Control Block.
During installation, the userspace VMM opens the ELF file and passes a
file descriptor to the KVM_SET_CARETAKER ioctl. By utilizing a
structured ELF payload, the Caretaker's logic remains highly flexible,
and allows the architecture to be utilized for broader features, such
as injecting a custom lightweight hypervisor, or unconditionally
forwarding VM exits to an accelerator card.
Hardware Interposition
----------------------
During the execution of the KVM_SET_CARETAKER ioctl, instead of
pointing the hardware's return path to standard KVM entry points (e.g.,
vmx_vmexit or svm_vcpu_run), KVM reprograms the host-state return area
of the CPU's hardware virtualization control structures (e.g., Intel
VMCS, AMD VMCB, or ARM equivalent) to point directly into the
bare-metal Caretaker environment.
Specifically, the following critical host-state fields (using x86
terminology for illustration) are updated:
* HOST_RIP: Set to point to the e_entry (entry point) of the provided
ELF .text segment. Whenever the guest triggers a VM Exit, the CPU
hardware will unconditionally jump to this address.
* HOST_RSP: Programmed to point to a specialized, pre-allocated
bare-metal stack dedicated strictly to this vCPU's Caretaker. This
allows it to execute completely independently of the host kernel's
normal thread stacks.
* HOST_SSP and HOST_INTR_SSP_TABLE: KVM pre-allocates a Shadow Stack
for the Caretaker. These VMCS fields are programmed during
initialization to ensure that RET and IRET instructions executed by
the Caretaker do not trigger fatal #CP faults when the host kernel
is detached.
* HOST_GS_BASE: Programmed to point to the CCB/Shared Metadata for
this vCPU.
* HOST_CR3: Configured to point to the Caretaker's isolated,
identity-mapped page tables, ensuring memory fetch safety when the
host kernel's page tables are torn down.
Note on Optimization vs. Security: Constantly switching the page table
(CR3) on every VM Exit can be expensive due to TLB flushing. To
optimize performance, the Caretaker can share the host kernel's page
tables while the kernel is still around, and dynamically replace
HOST_CR3 with the dedicated, isolated page tables only when the vCPU is
orphaned (during the detachment phase). On the other hand, maintaining
a permanently isolated CR3 for the Caretaker adds a strong security
boundary, achieving hardware-enforced separation similar to KVM Address
Space Isolation (ASI).
KVM-Caretaker ABI
=================
The Caretaker requires a defined ABI to communicate with the host KVM
subsystem. This ABI is implemented via the shared, identity-mapped .ccb
section of the ELF payload, acting as the Caretaker Control Block
(CCB).
The CCB acts as the source of truth for the Caretaker's execution loop
and contains three primary elements:
* Attachment State Flag: An atomic variable indicating the current
relationship with the host KVM subsystem (e.g., KVM_ATTACHED or
KVM_DETACHED).
* KVM Routing Pointers: The physical function pointers that the
Caretaker uses to safely jump into the host KVM's standard VM Exit
handlers when operating in normal mode.
* Shared Configuration Metadata: A physical pointer to dedicated
memory pages used by the kernel to share dynamic vCPU configuration
data with the Caretaker. Because every guest is configured
differently, KVM populates these pages with the specific parameters
negotiated during VM initialization (such as CPUID feature masks,
APIC routing, and timer states). These pages also include a
pre-allocated Telemetry Buffer for the Caretaker to log VM Exits
and spin-wait durations. These dedicated pages are explicitly
preserved across the host reboot via KHO, ensuring the Caretaker
maintains continuous access to the exact context required to
accurately emulate trivial exits during the gap.
Caretaker VM Exit Flow
======================
Upon vmexit, the Caretaker's execution flow follows a routing hierarchy:
The Fast Path
-------------
The Caretaker first evaluates the VM Exit reason. If the exit belongs to
a category that the Caretaker is programmed to resolve natively, it
handles it internally. For example, profiling of guests has identified
the following exit categories for potential local resolution:
* Guest Idle Exits (e.g., HLT): When the guest OS goes idle, it
triggers idle exits. The Caretaker intercepts these and halts the
physical core until the next guest-bound interrupt fires, preserving
host power.
* Timer and APIC Exits: Even an idle guest frequently writes to
interrupt controllers and system registers to configure internal
timers. The Caretaker handles these trivial writes directly,
acknowledging the timer updates.
* CPUID and System Registers: Exits like CPUID or safe system register
accesses are resolved by reading pre-computed responses from the
shared metadata pages to accurately service the guest dynamically.
Host Routing
------------
If the VM Exit requires KVM/VMM intervention (e.g., a Page Fault or
emulated device I/O), the Caretaker cannot resolve it locally. It must
check the CCB attachment state flag to determine where to route the
exit:
* If KVM_ATTACHED: The host kernel is actively managing the system.
The Caretaker acts as a fast-path trampoline, setting up the
standard host registers and transferring execution to the KVM
Routing Pointers.
* If KVM_DETACHED: The host kernel is offline for Live Update. The
Caretaker places the specific vCPU into a safe "spin-wait" polling
loop, continuously checking the CCB flag for a change.
Preservation of the vCPU
========================
For this orchestration to work across a host OS replacement, the file
descriptor associated with the vCPU must outlive the userspace process
that created it, leveraging the LUO:
* Creation: The VMM initially creates the vcpufd via the standard
KVM_CREATE_VCPU ioctl on the VM-wide kvmfd. Immediately after
creation, the VMM issues the KVM_SET_CARETAKER ioctl on the newly
created vcpufd. This installs the Caretaker as an interpose layer,
allocating the CCB and rewiring the hardware virtualization control
structures (e.g., HOST_RIP) for this specific vCPU. A dedicated
userspace thread then takes ownership of this file descriptor to
drive the KVM_RUN loop.
* LUO Registration & Isolation: In preparation for minimally
disruptive Live Update, the VMM acquires a session from the
userspace luo-agent and registers the vcpufd using
LIVEUPDATE_SESSION_PRESERVE_FD. KVM's LUO .preserve() handler is
invoked. Prior to this step, the VMM must pause emulated devices;
the guest relies on VFIO pass-through for primary I/O to survive
the gap without triggering VMM-bound exits. Crucially, the
.preserve() phase is the moment when the pCPU is isolated from the
host OS. The kernel finalizes the state, offlines the core (from
the OS perspective), transitions the vCPU fully into the Caretaker,
and preserves the required KVM data to KHO.
* The Gap: When the VMM process exits prior to the kexec transition,
open file descriptors are normally destroyed. However, because the
vcpufd is registered with LUO, the kernel holds a reference to the
underlying struct file to ensure it survives the reboot. While the
VMM has exited, the isolated pCPU appears completely offline to the
host OS. During the boot of the Next Kernel, the core smp_init()
routine parses the LUO FLB data and explicitly skips initializing
these preserved pCPUs. This shields the dedicated cores from reset
signals, allowing the guest workload to continue uninterrupted.
* Reclamation: The Next Kernel boots and LUO deserializes the
session. When the new VMM process spawns, it retrieves the
preserved session and issues LIVEUPDATE_SESSION_RETRIEVE_FD using
its token. LUO invokes KVM's .retrieve() callback to map the
preserved vcpufd back into the new VMM's file descriptor table. As
part of this retrieval process, the host formally brings the
isolated pCPU back online, and the new VMM userspace thread is
attached back to the active VM thread running on the vCPU. Finally,
KVM populates the new KVM Routing Pointers in the CCB and
atomically flips the Host State Flag back to KVM_ATTACHED. This
breaks the Caretaker's spin-wait loop (if it is in this state),
allowing standard KVM operation to resume.
Gap Observability and Telemetry
===============================
During the host transition standard host-level observability tools
(e.g., ftrace, perf, eBPF) are completely offline. To ensure production
readiness, site reliability, and precise latency accounting, the
Caretaker must act as a standalone micro-profiler while the host is
detached.
The architecture includes a pre-allocated, identity-mapped Telemetry
Buffer, passed to the Caretaker via the Shared Configuration Metadata
during installation. During the gap, the Caretaker writes to this
memory region to record execution data:
* Exit Counters: The Caretaker increments hardware-specific counters
for every VM Exit reason it encounters. This provides a precise
tally of natively handled events (e.g., HLT, CPUID, or APIC writes)
that occurred while the host was offline.
* Spin-Wait Profiling: If a complex exit forces the Caretaker to
block, it reads the hardware time stamp counter (e.g., RDTSC on
x86, CNTVCT_EL0 on ARM64) immediately before entering the spin-wait
loop. It reads the counter again the exact moment the CCB flag
flips back to KVM_ATTACHED. The Caretaker records the specific exit
reason that caused the block and the total accumulated stall time.
* Post-Gap Ingestion: Upon successful reattachment, the newly booted
host KVM subsystem parses this Telemetry Buffer. The recorded data
is exported via debugfs (e.g., /sys/kernel/debug/kvm/).
Challenges During Gap
=====================
While the Caretaker manages standard VM Exits, completely offlining a
physical CPU introduces critical edge cases regarding asynchronous
hardware interrupts. Below are the primary architectural challenges and
their proposed mitigations.
VFIO Interrupt Routing
----------------------
* The Problem: The design relies on VFIO pass-through for primary
I/O to survive the gap. However, when a physical device (e.g., an
NVMe drive) completes a read, it sends a hardware interrupt
(MSI/MSI-X) back to the CPU. By default, external hardware
interrupts cause a VM Exit. Because the Caretaker natively lacks
Linux IRQ routing tables, it has no immediate mechanism to inject
that specific device interrupt into the guest's virtual APIC or
GIC. The guest would stall indefinitely waiting for the I/O
completion.
* Proposed Solution: The deployment may utilize hardware-accelerated
interrupt routing, such as Posted Interrupts (Intel PI), Advanced
Virtual Interrupt Controller (AMD AVIC), or GICv4 Direct Virtual
Interrupt Injection (ARM64). This hardware feature allows the
IOMMU/SMMU to route physical device interrupts directly into the
guest's virtual interrupt controller without causing a VM Exit.
Alternatively, KVM could share its IRQ routing tables with the
Caretaker via the Shared Configuration Metadata during setup. This
would allow the Caretaker to intercept the hardware interrupt and
manually inject the virtual interrupt into the guest in software.
Guest-to-Guest IPIs
-------------------
* The Problem: If the guest OS attempts to wake up a sleeping thread,
one orphaned vCPU will send an Inter-Processor Interrupt (IPI) to
another orphaned vCPU. In standard virtualization without hardware
assistance, writing to the APIC ICR (or sending an ARM SGI) causes
a VM Exit so the host KVM can emulate the message delivery. During
the gap, KVM is unavailable to route this message.
* Proposed Solution: The architecture may leverage hardware virtualized
interrupts (Intel APICv, AMD AVIC, or ARM GICv4.1 virtual SGIs).
This allows the hardware silicon to handle IPI delivery between the
isolated pCPUs natively, eliminating the VM Exit. Alternatively,
the Caretaker can be programmed to emulate the IPI delivery. By
utilizing the shared memory metadata, the Caretaker can determine
the target vCPU and directly update its pending interrupt state.
Stray Hardware Interrupts
-------------------------
* The Problem: What happens if a Non-Maskable Interrupt (NMI), a
hardware timer tick, or a Machine Check Exception / System Error
(MCE / ARM SError) arrives while the CPU is actively executing
Caretaker code in KVM_DETACHED mode?
* Proposed Solution: To safely handle these asynchronous events, the
Caretaker payload should establish and load its own minimal,
self-contained Interrupt Descriptor Table (IDT on x86) or Exception
Vector Table (via VBAR_EL2 on ARM64) during initialization. This
ensures that if a stray hardware event or NMI arrives while
executing Caretaker instructions in host mode, the CPU can catch
the fault and park the core in a known state rather than triggering
a catastrophic host reboot.
On x86, when transitioning into the gap, KVM explicitly programs
HOST_IDTR and HOST_GDTR to these self-contained tables. If an NMI
or stray hardware event arrives, the CPU catches the fault using
the Caretaker's native handlers, parking the core or logging the
event rather than attempting host recovery. KVM also programs
HOST_INTR_SSP_TABLE within the Caretaker's isolated environment so
that if the exception handlers execute an IRET, the hardware's CET
shadow stack unroll succeeds without triggering a #CP exception.
Timekeeping Drift
-----------------
* The Problem: While the guest is orphaned, it continues executing
and reading time via the physical CPU's hardware Time Stamp Counter
(TSC or ARM generic timer). Because the host kernel is offline,
software-based paravirtualized clocks (such as kvmclock) are no
longer being updated by host background threads. Furthermore, when
the Next Kernel boots, its calculation of host CLOCK_MONOTONIC or
wall-time might drift from the old kernel. If the new KVM
subsystem resets the VM's TSC offsets or updates the PV clock
structures with standard initialization values upon adoption, the
guest could experience a time jump.
* Proposed Solution: During the gap, the guest relies entirely on the
physical CPU's Invariant TSC (which the hardware automatically
offsets natively via the VMCS/VMCB) for continuous timekeeping. To
ensure safe reattachment, KVM must serialize the exact state of the
guest's PV clocks, TSC offsets, and the old kernel's base reference
times into KHO memory during the LUO .preserve() phase. Upon
adoption, the new KVM subsystem must synchronize its internal
tracking with this preserved data, ensuring that any subsequent
updates to the guest's PV clock memory guarantee a strictly
monotonic and smooth time progression.
Nested Page Table Updates
-------------------------
* The Problem: As the guest executes, it may attempt to access memory
that has not yet been mapped by the hypervisor, or it may interact
with MMIO regions. Normally, this triggers an EPT Violation (Intel)
or NPT Page Fault (AMD), prompting KVM to allocate host pages and
update the secondary page tables. How are these updates handled
when the host KVM subsystem is offline during the gap?
* Proposed Solution: During the "Management Gap," there are absolutely
no updates made to the NPT/EPT. The existing secondary page tables
are fully preserved in memory via LUO kvmfd preservation prior to
detachment, allowing the guest to seamlessly access all previously
mapped memory. If the guest triggers a new page fault (requiring an
NPT/EPT update) during the gap, the Caretaker simply categorizes it
as a Blocking Exit.
Compromised Caretaker
---------------------
* The Problem: The Caretaker runs in Host Mode. If left unprotected,
this could allow a lightly privileged userspace process (e.g., QEMU
or crosvm) to inject arbitrary executable code directly into the
CPU's most privileged hardware state (VMX Root / Ring 0 / EL2).
* Proposed Solution: To mitigate this risk, the KVM_SET_CARETAKER
ioctl may adopt the security model used by the kexec_file_load()
syscall. Rather than trusting userspace to pass physical addresses,
the kernel must take full ownership of payload validation:
- In-Kernel ELF Parsing: Instead of passing raw segment addresses
(which is vulnerable to manipulation), the VMM passes a file
descriptor for the Caretaker binary. The host KVM subsystem then
performs the ELF parsing entirely in-kernel. This guarantees that
the kernel controls exactly where the .text, .data, and .ccb
sections are mapped, preventing userspace from tricking the
kernel into overwriting sensitive host memory.
- Signature Verification & Secure Boot: If the host is running with
Secure Boot or Kernel Lockdown enabled, KVM mandates that the
Caretaker ELF binary be cryptographically signed. The kernel
verifies the signature against the system's trusted keyring
(e.g., .builtin_trusted_keys) before loading it. An unsigned or
modified payload is outright rejected.
- IMA (Integrity Measurement Architecture) Integration: The loading
of the Caretaker is hooked directly into the kernel's IMA
subsystem. The binary is measured (hashed and extended into the
hardware TPM) for remote attestation and appraised against local
security policies before execution is permitted.
Caretaker Update
----------------
* The Problem: Given that the Caretaker is permanently installed
during VM setup, how does it get updated on long-running VMs?
* Proposed Solution: To update the Caretaker, we can only perform the
update when vCPUs are not isolated (i.e., not during the live
update gap):
- vCPU Quiescence: The userspace VMM issues the KVM_SET_CARETAKER
ioctl. KVM then sends kvm_vcpu_kick to force the target vCPU to
exit the guest and return to the host kernel.
- KVM parses the new ELF. It allocates fresh memory pages for the
new .text and .data segments.
- The kernel populates the new .ccb with the existing VM context.
- After the new environment is fully staged, KVM updates the
physical CPU's virtualization control structures.
- When the vCPU thread resumes and re-enters the guest, the next
VM Exit will trigger the hardware to jump into the new Caretaker
payload. The old memory segments are then safely freed.
next reply other threads:[~2026-04-28 22:29 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-04-28 22:29 Pasha Tatashin [this message]
2026-04-29 8:13 ` [RFC] proposal: KVM: Orphaned VMs: The Caretaker approach for Live Update Alexander Graf
2026-04-29 8:40 ` David Woodhouse
2026-04-29 16:13 ` Pasha Tatashin
2026-04-29 16:02 ` Pasha Tatashin
2026-04-30 13:28 ` Paolo Bonzini
2026-04-30 15:27 ` David Woodhouse
2026-05-01 3:32 ` Paolo Bonzini
2026-05-01 8:56 ` David Woodhouse
2026-05-01 22:07 ` Pasha Tatashin
2026-05-01 21:48 ` Pasha Tatashin
2026-05-03 16:57 ` Paolo Bonzini
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=afEwWZksU0Fw61oT@plex \
--to=pasha.tatashin@soleen.com \
--cc=Tycho.Andersen@amd.com \
--cc=akpm@linux-foundation.org \
--cc=alex.williamson@redhat.com \
--cc=anthony.yznaga@oracle.com \
--cc=baolu.lu@linux.intel.com \
--cc=bp@alien8.de \
--cc=corbet@lwn.net \
--cc=dave.hansen@linux.intel.com \
--cc=david@kernel.org \
--cc=dmatlack@google.com \
--cc=dwmw2@infradead.org \
--cc=graf@amazon.com \
--cc=hpa@zytor.com \
--cc=jgg@nvidia.com \
--cc=jgowans@amazon.com \
--cc=kevin.tian@intel.com \
--cc=kexec@lists.infradead.org \
--cc=kpraveen.lkml@gmail.com \
--cc=kvm@vger.kernel.org \
--cc=kvmarm@lists.linux.dev \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=loeser@linux.microsoft.com \
--cc=maz@kernel.org \
--cc=mheyne@amazon.de \
--cc=mingo@redhat.com \
--cc=oupton@kernel.org \
--cc=pankaj.gupta.linux@gmail.com \
--cc=pbonzini@redhat.com \
--cc=pjt@google.com \
--cc=pratyush@kernel.org \
--cc=rientjes@google.com \
--cc=roman.gushchin@linux.dev \
--cc=rppt@kernel.org \
--cc=seanjc@google.com \
--cc=tglx@kernel.org \
--cc=vannapurve@google.com \
--cc=vipinsh@google.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