asi_series cluster_0 Standalone PoD fix cluster_g1 VH · Per-vCPU area and mapcache for HVM  (d02–d14) cluster_1 L4 promotion fix cluster_2 vCPU-scoped perdomain interfaces cluster_3 asi= option and per-vCPU L3 cluster_4 Per-vCPU mapcache cluster_g2 DV · Sparse directmap view  (d15–d24) cluster_5 Sparse directmap view cluster_6 Xenheap frees on the sparse view cluster_7 X1 · vCPU state window and its consumers  (d25–d31) cluster_10 X2 · Register state behind the window  (d32–d35) cluster_8 X3 · Multi-page transient maps  (d36–d38) cluster_9 X4 · FPU / XSAVE area handling  (d39–d45) cluster_13 PH1 · Rendezvous / callfunc off-stack  (d46–d54) cluster_g9 PH2 · Per-pCPU stacks for HVM  (d55–d65) cluster_14 Per-pCPU stacks cluster_15 Stack checks (droppable extras) cluster_16 flushtlb RFC cluster_g11 O · Performance optimizations  (d67–d73, d76) cluster_11 Paging-pool pages in the sparse view cluster_12 Fewer guest page walks cluster_17 Shadow pool RFC cluster_19 Flush mask RFC cluster_18 Debug · Flush counters and audit key  (d74–d75) p01 d01  ✓ map one page at a time in p2m_pod_zero_check() p14 d14  introduce per-vCPU mapcache for vCPU-PT domains p01->p14 p02 d02  refuse to promote an L4 while the domain has no per-domai... p05 d05  ✓ drop redundant create_perdomain_mapping() call p02->p05 p03 d03  ✓ purge unneeded destroy_per domain_mapping() p04 d04  ✓ prepare destroy_perdomain_ mapping() for per-vCPU perdomai... p03->p04 p09 d09  introduce per-vCPU L3 page-table p04->p09 p06 d06  ✓ prepare create_perdomain_mapping() for per-vCPU perdomain... p05->p06 p06->p09 p07 d07  introduce Address Space Isolation command line option p07->p09 p57 d57  add the cpu-stack sub- option of asi= p07->p57 p08 d08  have init_xen_l4_slots() take a vCPU in place of the domain p08->p09 p09->p14 p25 d25  introduce populate_perdoma in_mapping() p09->p25 p60 d60  map only its own CPU's stack in a cpu-stack vCPU's page-t... p09->p60 p10 d10  drop redundant is_pv_vcpu() checks p10->p14 p11 d11  prepare the mapcache for per-vCPU accounting p11->p14 p12 d12  ✓ move struct mapcache_vcpu to struct arch_vcpu p12->p14 p13 d13  ✓ don't unmap a mapcache entry that is not present p13->p14 p20 d20  clear a mapcache slot at its last unmap p13->p20 p19 d19  key the directmap fast paths on the loaded view p14->p19 p14->p20 p21 d21  run guest contexts on the sparse directmap view p14->p21 p36 d36  introduce map_domain_pages() p14->p36 g_map Transient guest mappings per-vCPU private p14->g_map p15 d15  let Xen's page-table walker operate on a given root p17 d17  add hooks for a sparse view of the directmap p15->p17 p18 d18  build and maintain a sparse view of the directmap p17->p18 p18->p19 p18->p21 p23 d23  return an emptied region after dropping the pool lock p18->p23 p24 d24  split a sparse directmap superpage with a page being freed p18->p24 p22 d22  wire the sparse directmap view into the asi= option p19->p22 p20->p22 p21->p22 p66 d66  [RFC] leave nothing of the old page-tables usable at the CR3 write p21->p66 p61 d61  allocate per-CPU stacks from the domain heap p22->p61 p67 d67  allow domain heap pages in the sparse directmap view p22->p67 p76 d76  [RFC] track the CPUs to flush for the sparse directmap view p22->p76 g_dmap Guest contexts off the full directmap p22->g_dmap p16 d16  process pending softirqs once per deflate block p16->p18 p26 d26  introduce a per-vCPU state window in the perdomain area p25->p26 p30 d30  allocate VMCBs from the domain heap behind the vCPU state... p26->p30 p31 d31  move the guest MSR load/save list off always- mapped memory p26->p31 p33 d33  move the saved register frame behind the vCPU state window p26->p33 p34 d34  move the emulator's operand caches behind the vCPU state ... p26->p34 p45 d45  move guest XSAVE areas behind the vCPU state window p26->p45 p27 d27  introduce SVM_MAP_VMCB() and SVM_UNMAP_VMCB() p27->p30 p28 d28  restore guest debug registers in svm_do_resume() p28->p30 p29 d29  drop svm_vmcb_dump()'s paddr p29->p30 g_state Guest register state not always-mapped p31->g_state p32 d32  access a vCPU's saved register frame through map/unmap he... p32->p33 p33->g_state p34->g_state p35 d35  clear the vCPU's copy of an emulated I/O request once con... p37 d37  use map_domain_pages() for cross-page emulated writes p36->p37 p38 d38  use map_domain_pages() for multi-frame emulated accesses p36->p38 p36->p45 p37->g_map p38->g_map p39 d39  Refactor FXSAVE_AREA to use wrappers p40 d40  Map/unmap xsave area in read_bndcfgu() p39->p40 p41 d41  Pass explicit xsave areas to fpu_(f)xsave() p39->p41 p42 d42  Pass explicit xsave areas to fpu_(f)xrstor() p39->p42 p40->p45 p41->p45 p42->p45 p43 d43  classify xsave-area seam accesses by failure mode p43->p45 p44 d44  restore FPU state after switching to the new page tables p44->p45 p45->g_state p46 d46  move the set_mtrr() rendezvous data off the stack p47 d47  move smp_send_stop()'s AP- stop flag off the stack p48 d48  move the calibration rendezvous data off the stack p49 d49  move the stop_machine payload off the stack p50 d50  introduce by-value payloads for call-function IPIs p51 d51  pass stack-allocated callfunc payloads by value p50->p51 p52 d52  pass error-injection callfunc payloads by value p50->p52 p53 d53  pass remaining stack- allocated callfunc payloads by value p50->p53 p54 d54  assert that by-pointer callfunc payloads are not on the s... p51->p54 p52->p54 p53->p54 p54->p60 p65 d65  crash the domain if the saved stack is not this CPU's p54->p65 p55 d55  track per-CPU stack pages alongside stack_base p55->p61 p64 d64  name the CPU whose stack a fatal page fault hit p55->p64 p56 d56  keep a per-CPU mirror of current for cross-CPU readers p56->p61 p58 d58  keep cpu-stack off while XPTI is enabled p57->p58 p59 d59  run every CPU on a per-CPU stack address p57->p59 p58->p59 p59->p60 p63 d63  assert that data handed to other CPUs is not on a CPU's s... p59->p63 p59->p64 p60->p61 p62 d62  zero stack on context switch p60->p62 g_stack Xen stacks per-CPU private and scrubbed p61->g_stack p62->g_stack p68 d68  keep the HAP pool in the sparse directmap view p67->p68 p73 d73  [RFC] keep the shadow pool in the sparse directmap view p67->p73 p75 d75  [DEBUG] add a debug key auditing the sparse directmap view p67->p75 p69 d69  batch the pool's removal from the sparse directmap view p68->p69 g_perf Performance p68->g_perf p74 d74  [DEBUG] count the sparse directmap view's flushes and view switches p69->p74 p69->g_perf p70 d70  don't look up the final frame of a linear translation twice p70->g_perf p71 d71  write a virtual-address runstate area through one transla... p72 d72  write a virtual-address time area through one translation p71->p72 p71->g_perf p72->g_perf p73->g_perf p76->g_perf

Xen ASI series — 76 patches

Selected patch

Click a patch. Blue outline = what it needs (ancestors); vermilion = what needs it (descendants). Click again or press Clear to reset.

Legend

verified dependency
inferred (verify during group review)
dotted purple arrow, hollow head: no regression — the later patch works without the earlier one, but without it would degrade another feature (named on hover), so the earlier one goes first
gold arrow: completes an end goal (hexagons). Each goal is drawn beside the group that achieves it; together the end goals constitute the ASI end state (guest-owned data not reachable from other contexts). The gold octagon, Performance, is what group O achieves; it is not part of the ASI end state.
green node border: vetted so far (status shown on selection)
double border: posted to xen-devel (thread link on selection)
blue border and ✓ in the label: carries a Reviewed-by (tags shown on selection)
Dependencies already implied by a drawn path are recorded but not drawn; the click-cone includes them.

Groups

VH = per-vCPU area and mapcache for HVM domains, DV = a sparse view of the directmap, alongside the full one, chosen per domain at creation, X = key per-vCPU structures off the xenheap, into a per-vCPU state window in the per-domain area, in four groups: X1 the window and its first consumers, the SVM VMCBs and the VMX guest MSR lists; X2 every guest vCPU's saved register frame and the HVM emulator's operand caches; X3 map_domain_pages(), which maps several pages in the calling vCPU's per-domain area, used in place of vmap() by two emulation paths; X4 the guest XSAVE areas, with the FPU changes ahead of them, PH = per-pCPU stacks for HVM domains, in two groups: PH1 the preparation, rendezvous data and call-function IPI payloads off the stack; PH2 the stacks themselves: each pCPU's stack at a per-CPU address in the per-domain area, a cpu-stack vCPU's page-tables mapping only its own pCPU's, the stacks allocated from the domain heap and zeroed on context switch, and three stack checks that could be dropped, O = performance optimizations: paging-pool pages kept in the sparse view (the HAP pool; the shadow pool as an [RFC]), their removal batched; fewer guest page walks and p2m lookups for HVM guests; and, as an [RFC], the sparse view's flushes sent only to the CPUs that may hold its translations; the two [RFC]s are at the end of the series, Debug = aids for testing: [DEBUG] patches, not for committing, that count the sparse view's flushes and audit it with a debug key. Numbered in series order within a letter; the series runs VH DV X1 X2 X3 X4 PH1 PH2 O Debug. Ranges are positions in this revision of the page.

Postings

Open items

Source of truth: gen-depgraph.py (same directory); positions read live from stg series; regenerate with python3 gen-depgraph.py.