Skip to content

Commit 34c0d5a

Browse files
author
Marc Zyngier
committed
Merge branch kvm-arm64/host_data into kvmarm-master/next
* kvm-arm64/host_data: : . : Rationalise the host-specific data to live as part of the per-CPU state. : : From the cover letter: : : "It appears that over the years, we have accumulated a lot of cruft in : the kvm_vcpu_arch structure. Part of the gunk is data that is strictly : host CPU specific, and this result in two main problems: : : - the structure itself is stupidly large, over 8kB. With the : arch-agnostic kvm_vcpu, we're above 10kB, which is insane. This has : some ripple effects, as we need physically contiguous allocation to : be able to map it at EL2 for !VHE. There is more to it though, as : some data structures, although per-vcpu, could be allocated : separately. : : - We lose track of the life-cycle of this data, because we're : guaranteed that it will be around forever and we start relying on : wrong assumptions. This is becoming a maintenance burden. : : This series rectifies some of these things, starting with the two main : offenders: debug and FP, a lot of which gets pushed out to the per-CPU : host structure. Indeed, their lifetime really isn't that of the vcpu, : but tied to the physical CPU the vpcu runs on. : : This results in a small reduction of the vcpu size, but mainly a much : clearer understanding of the life-cycle of these structures." : . KVM: arm64: Move management of __hyp_running_vcpu to load/put on VHE KVM: arm64: Exclude FP ownership from kvm_vcpu_arch KVM: arm64: Exclude host_fpsimd_state pointer from kvm_vcpu_arch KVM: arm64: Exclude mdcr_el2_host from kvm_vcpu_arch KVM: arm64: Exclude host_debug_data from vcpu_arch KVM: arm64: Add accessor for per-CPU state Signed-off-by: Marc Zyngier <[email protected]>
2 parents fec50db + 9a39359 commit 34c0d5a

File tree

14 files changed

+106
-75
lines changed

14 files changed

+106
-75
lines changed

arch/arm64/include/asm/kvm_emulate.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -588,15 +588,15 @@ static __always_inline u64 kvm_get_reset_cptr_el2(struct kvm_vcpu *vcpu)
588588
val = (CPACR_EL1_FPEN_EL0EN | CPACR_EL1_FPEN_EL1EN);
589589

590590
if (!vcpu_has_sve(vcpu) ||
591-
(vcpu->arch.fp_state != FP_STATE_GUEST_OWNED))
591+
(*host_data_ptr(fp_owner) != FP_STATE_GUEST_OWNED))
592592
val |= CPACR_EL1_ZEN_EL1EN | CPACR_EL1_ZEN_EL0EN;
593593
if (cpus_have_final_cap(ARM64_SME))
594594
val |= CPACR_EL1_SMEN_EL1EN | CPACR_EL1_SMEN_EL0EN;
595595
} else {
596596
val = CPTR_NVHE_EL2_RES1;
597597

598598
if (vcpu_has_sve(vcpu) &&
599-
(vcpu->arch.fp_state == FP_STATE_GUEST_OWNED))
599+
(*host_data_ptr(fp_owner) == FP_STATE_GUEST_OWNED))
600600
val |= CPTR_EL2_TZ;
601601
if (cpus_have_final_cap(ARM64_SME))
602602
val &= ~CPTR_EL2_TSM;

arch/arm64/include/asm/kvm_host.h

Lines changed: 64 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -530,8 +530,42 @@ struct kvm_cpu_context {
530530
u64 *vncr_array;
531531
};
532532

533+
/*
534+
* This structure is instantiated on a per-CPU basis, and contains
535+
* data that is:
536+
*
537+
* - tied to a single physical CPU, and
538+
* - either have a lifetime that does not extend past vcpu_put()
539+
* - or is an invariant for the lifetime of the system
540+
*
541+
* Use host_data_ptr(field) as a way to access a pointer to such a
542+
* field.
543+
*/
533544
struct kvm_host_data {
534545
struct kvm_cpu_context host_ctxt;
546+
struct user_fpsimd_state *fpsimd_state; /* hyp VA */
547+
548+
/* Ownership of the FP regs */
549+
enum {
550+
FP_STATE_FREE,
551+
FP_STATE_HOST_OWNED,
552+
FP_STATE_GUEST_OWNED,
553+
} fp_owner;
554+
555+
/*
556+
* host_debug_state contains the host registers which are
557+
* saved and restored during world switches.
558+
*/
559+
struct {
560+
/* {Break,watch}point registers */
561+
struct kvm_guest_debug_arch regs;
562+
/* Statistical profiling extension */
563+
u64 pmscr_el1;
564+
/* Self-hosted trace */
565+
u64 trfcr_el1;
566+
/* Values of trap registers for the host before guest entry. */
567+
u64 mdcr_el2;
568+
} host_debug_state;
535569
};
536570

537571
struct kvm_host_psci_config {
@@ -592,19 +626,9 @@ struct kvm_vcpu_arch {
592626
u64 mdcr_el2;
593627
u64 cptr_el2;
594628

595-
/* Values of trap registers for the host before guest entry. */
596-
u64 mdcr_el2_host;
597-
598629
/* Exception Information */
599630
struct kvm_vcpu_fault_info fault;
600631

601-
/* Ownership of the FP regs */
602-
enum {
603-
FP_STATE_FREE,
604-
FP_STATE_HOST_OWNED,
605-
FP_STATE_GUEST_OWNED,
606-
} fp_state;
607-
608632
/* Configuration flags, set once and for all before the vcpu can run */
609633
u8 cflags;
610634

@@ -627,11 +651,10 @@ struct kvm_vcpu_arch {
627651
* We maintain more than a single set of debug registers to support
628652
* debugging the guest from the host and to maintain separate host and
629653
* guest state during world switches. vcpu_debug_state are the debug
630-
* registers of the vcpu as the guest sees them. host_debug_state are
631-
* the host registers which are saved and restored during
632-
* world switches. external_debug_state contains the debug
633-
* values we want to debug the guest. This is set via the
634-
* KVM_SET_GUEST_DEBUG ioctl.
654+
* registers of the vcpu as the guest sees them.
655+
*
656+
* external_debug_state contains the debug values we want to debug the
657+
* guest. This is set via the KVM_SET_GUEST_DEBUG ioctl.
635658
*
636659
* debug_ptr points to the set of debug registers that should be loaded
637660
* onto the hardware when running the guest.
@@ -640,18 +663,8 @@ struct kvm_vcpu_arch {
640663
struct kvm_guest_debug_arch vcpu_debug_state;
641664
struct kvm_guest_debug_arch external_debug_state;
642665

643-
struct user_fpsimd_state *host_fpsimd_state; /* hyp VA */
644666
struct task_struct *parent_task;
645667

646-
struct {
647-
/* {Break,watch}point registers */
648-
struct kvm_guest_debug_arch regs;
649-
/* Statistical profiling extension */
650-
u64 pmscr_el1;
651-
/* Self-hosted trace */
652-
u64 trfcr_el1;
653-
} host_debug_state;
654-
655668
/* VGIC state */
656669
struct vgic_cpu vgic_cpu;
657670
struct arch_timer_cpu timer_cpu;
@@ -1168,6 +1181,32 @@ struct kvm_vcpu *kvm_mpidr_to_vcpu(struct kvm *kvm, unsigned long mpidr);
11681181

11691182
DECLARE_KVM_HYP_PER_CPU(struct kvm_host_data, kvm_host_data);
11701183

1184+
/*
1185+
* How we access per-CPU host data depends on the where we access it from,
1186+
* and the mode we're in:
1187+
*
1188+
* - VHE and nVHE hypervisor bits use their locally defined instance
1189+
*
1190+
* - the rest of the kernel use either the VHE or nVHE one, depending on
1191+
* the mode we're running in.
1192+
*
1193+
* Unless we're in protected mode, fully deprivileged, and the nVHE
1194+
* per-CPU stuff is exclusively accessible to the protected EL2 code.
1195+
* In this case, the EL1 code uses the *VHE* data as its private state
1196+
* (which makes sense in a way as there shouldn't be any shared state
1197+
* between the host and the hypervisor).
1198+
*
1199+
* Yes, this is all totally trivial. Shoot me now.
1200+
*/
1201+
#if defined(__KVM_NVHE_HYPERVISOR__) || defined(__KVM_VHE_HYPERVISOR__)
1202+
#define host_data_ptr(f) (&this_cpu_ptr(&kvm_host_data)->f)
1203+
#else
1204+
#define host_data_ptr(f) \
1205+
(static_branch_unlikely(&kvm_protected_mode_initialized) ? \
1206+
&this_cpu_ptr(&kvm_host_data)->f : \
1207+
&this_cpu_ptr_hyp_sym(kvm_host_data)->f)
1208+
#endif
1209+
11711210
static inline void kvm_init_host_cpu_context(struct kvm_cpu_context *cpu_ctxt)
11721211
{
11731212
/* The host's MPIDR is immutable, so let's set it up at boot time */

arch/arm64/kvm/arm.c

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -378,12 +378,6 @@ int kvm_arch_vcpu_create(struct kvm_vcpu *vcpu)
378378

379379
vcpu->arch.mmu_page_cache.gfp_zero = __GFP_ZERO;
380380

381-
/*
382-
* Default value for the FP state, will be overloaded at load
383-
* time if we support FP (pretty likely)
384-
*/
385-
vcpu->arch.fp_state = FP_STATE_FREE;
386-
387381
/* Set up the timer */
388382
kvm_timer_vcpu_init(vcpu);
389383

@@ -1971,7 +1965,7 @@ static void cpu_set_hyp_vector(void)
19711965

19721966
static void cpu_hyp_init_context(void)
19731967
{
1974-
kvm_init_host_cpu_context(&this_cpu_ptr_hyp_sym(kvm_host_data)->host_ctxt);
1968+
kvm_init_host_cpu_context(host_data_ptr(host_ctxt));
19751969

19761970
if (!is_kernel_in_hyp_mode())
19771971
cpu_init_hyp_mode();

arch/arm64/kvm/fpsimd.c

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,6 @@ int kvm_arch_vcpu_run_map_fp(struct kvm_vcpu *vcpu)
4949
if (ret)
5050
return ret;
5151

52-
vcpu->arch.host_fpsimd_state = kern_hyp_va(fpsimd);
53-
5452
/*
5553
* We need to keep current's task_struct pinned until its data has been
5654
* unshared with the hypervisor to make sure it is not re-used by the
@@ -86,7 +84,8 @@ void kvm_arch_vcpu_load_fp(struct kvm_vcpu *vcpu)
8684
* guest in kvm_arch_vcpu_ctxflush_fp() and override this to
8785
* FP_STATE_FREE if the flag set.
8886
*/
89-
vcpu->arch.fp_state = FP_STATE_HOST_OWNED;
87+
*host_data_ptr(fp_owner) = FP_STATE_HOST_OWNED;
88+
*host_data_ptr(fpsimd_state) = kern_hyp_va(&current->thread.uw.fpsimd_state);
9089

9190
vcpu_clear_flag(vcpu, HOST_SVE_ENABLED);
9291
if (read_sysreg(cpacr_el1) & CPACR_EL1_ZEN_EL0EN)
@@ -110,7 +109,7 @@ void kvm_arch_vcpu_load_fp(struct kvm_vcpu *vcpu)
110109
* been saved, this is very unlikely to happen.
111110
*/
112111
if (read_sysreg_s(SYS_SVCR) & (SVCR_SM_MASK | SVCR_ZA_MASK)) {
113-
vcpu->arch.fp_state = FP_STATE_FREE;
112+
*host_data_ptr(fp_owner) = FP_STATE_FREE;
114113
fpsimd_save_and_flush_cpu_state();
115114
}
116115
}
@@ -126,7 +125,7 @@ void kvm_arch_vcpu_load_fp(struct kvm_vcpu *vcpu)
126125
void kvm_arch_vcpu_ctxflush_fp(struct kvm_vcpu *vcpu)
127126
{
128127
if (test_thread_flag(TIF_FOREIGN_FPSTATE))
129-
vcpu->arch.fp_state = FP_STATE_FREE;
128+
*host_data_ptr(fp_owner) = FP_STATE_FREE;
130129
}
131130

132131
/*
@@ -142,7 +141,7 @@ void kvm_arch_vcpu_ctxsync_fp(struct kvm_vcpu *vcpu)
142141

143142
WARN_ON_ONCE(!irqs_disabled());
144143

145-
if (vcpu->arch.fp_state == FP_STATE_GUEST_OWNED) {
144+
if (*host_data_ptr(fp_owner) == FP_STATE_GUEST_OWNED) {
146145

147146
/*
148147
* Currently we do not support SME guests so SVCR is
@@ -196,7 +195,7 @@ void kvm_arch_vcpu_put_fp(struct kvm_vcpu *vcpu)
196195
isb();
197196
}
198197

199-
if (vcpu->arch.fp_state == FP_STATE_GUEST_OWNED) {
198+
if (*host_data_ptr(fp_owner) == FP_STATE_GUEST_OWNED) {
200199
if (vcpu_has_sve(vcpu)) {
201200
__vcpu_sys_reg(vcpu, ZCR_EL1) = read_sysreg_el1(SYS_ZCR);
202201

arch/arm64/kvm/hyp/include/hyp/debug-sr.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -135,9 +135,9 @@ static inline void __debug_switch_to_guest_common(struct kvm_vcpu *vcpu)
135135
if (!vcpu_get_flag(vcpu, DEBUG_DIRTY))
136136
return;
137137

138-
host_ctxt = &this_cpu_ptr(&kvm_host_data)->host_ctxt;
138+
host_ctxt = host_data_ptr(host_ctxt);
139139
guest_ctxt = &vcpu->arch.ctxt;
140-
host_dbg = &vcpu->arch.host_debug_state.regs;
140+
host_dbg = host_data_ptr(host_debug_state.regs);
141141
guest_dbg = kern_hyp_va(vcpu->arch.debug_ptr);
142142

143143
__debug_save_state(host_dbg, host_ctxt);
@@ -154,9 +154,9 @@ static inline void __debug_switch_to_host_common(struct kvm_vcpu *vcpu)
154154
if (!vcpu_get_flag(vcpu, DEBUG_DIRTY))
155155
return;
156156

157-
host_ctxt = &this_cpu_ptr(&kvm_host_data)->host_ctxt;
157+
host_ctxt = host_data_ptr(host_ctxt);
158158
guest_ctxt = &vcpu->arch.ctxt;
159-
host_dbg = &vcpu->arch.host_debug_state.regs;
159+
host_dbg = host_data_ptr(host_debug_state.regs);
160160
guest_dbg = kern_hyp_va(vcpu->arch.debug_ptr);
161161

162162
__debug_save_state(guest_dbg, guest_ctxt);

arch/arm64/kvm/hyp/include/hyp/switch.h

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ extern struct kvm_exception_table_entry __stop___kvm_ex_table;
4242
/* Check whether the FP regs are owned by the guest */
4343
static inline bool guest_owns_fp_regs(struct kvm_vcpu *vcpu)
4444
{
45-
return vcpu->arch.fp_state == FP_STATE_GUEST_OWNED;
45+
return *host_data_ptr(fp_owner) == FP_STATE_GUEST_OWNED;
4646
}
4747

4848
/* Save the 32-bit only FPSIMD system register state */
@@ -155,7 +155,7 @@ static inline bool cpu_has_amu(void)
155155

156156
static inline void __activate_traps_hfgxtr(struct kvm_vcpu *vcpu)
157157
{
158-
struct kvm_cpu_context *hctxt = &this_cpu_ptr(&kvm_host_data)->host_ctxt;
158+
struct kvm_cpu_context *hctxt = host_data_ptr(host_ctxt);
159159
struct kvm *kvm = kern_hyp_va(vcpu->kvm);
160160

161161
CHECK_FGT_MASKS(HFGRTR_EL2);
@@ -191,7 +191,7 @@ static inline void __activate_traps_hfgxtr(struct kvm_vcpu *vcpu)
191191

192192
static inline void __deactivate_traps_hfgxtr(struct kvm_vcpu *vcpu)
193193
{
194-
struct kvm_cpu_context *hctxt = &this_cpu_ptr(&kvm_host_data)->host_ctxt;
194+
struct kvm_cpu_context *hctxt = host_data_ptr(host_ctxt);
195195
struct kvm *kvm = kern_hyp_va(vcpu->kvm);
196196

197197
if (!cpus_have_final_cap(ARM64_HAS_FGT))
@@ -226,13 +226,13 @@ static inline void __activate_traps_common(struct kvm_vcpu *vcpu)
226226

227227
write_sysreg(0, pmselr_el0);
228228

229-
hctxt = &this_cpu_ptr(&kvm_host_data)->host_ctxt;
229+
hctxt = host_data_ptr(host_ctxt);
230230
ctxt_sys_reg(hctxt, PMUSERENR_EL0) = read_sysreg(pmuserenr_el0);
231231
write_sysreg(ARMV8_PMU_USERENR_MASK, pmuserenr_el0);
232232
vcpu_set_flag(vcpu, PMUSERENR_ON_CPU);
233233
}
234234

235-
vcpu->arch.mdcr_el2_host = read_sysreg(mdcr_el2);
235+
*host_data_ptr(host_debug_state.mdcr_el2) = read_sysreg(mdcr_el2);
236236
write_sysreg(vcpu->arch.mdcr_el2, mdcr_el2);
237237

238238
if (cpus_have_final_cap(ARM64_HAS_HCX)) {
@@ -254,13 +254,13 @@ static inline void __activate_traps_common(struct kvm_vcpu *vcpu)
254254

255255
static inline void __deactivate_traps_common(struct kvm_vcpu *vcpu)
256256
{
257-
write_sysreg(vcpu->arch.mdcr_el2_host, mdcr_el2);
257+
write_sysreg(*host_data_ptr(host_debug_state.mdcr_el2), mdcr_el2);
258258

259259
write_sysreg(0, hstr_el2);
260260
if (kvm_arm_support_pmu_v3()) {
261261
struct kvm_cpu_context *hctxt;
262262

263-
hctxt = &this_cpu_ptr(&kvm_host_data)->host_ctxt;
263+
hctxt = host_data_ptr(host_ctxt);
264264
write_sysreg(ctxt_sys_reg(hctxt, PMUSERENR_EL0), pmuserenr_el0);
265265
vcpu_clear_flag(vcpu, PMUSERENR_ON_CPU);
266266
}
@@ -376,8 +376,8 @@ static bool kvm_hyp_handle_fpsimd(struct kvm_vcpu *vcpu, u64 *exit_code)
376376
isb();
377377

378378
/* Write out the host state if it's in the registers */
379-
if (vcpu->arch.fp_state == FP_STATE_HOST_OWNED)
380-
__fpsimd_save_state(vcpu->arch.host_fpsimd_state);
379+
if (*host_data_ptr(fp_owner) == FP_STATE_HOST_OWNED)
380+
__fpsimd_save_state(*host_data_ptr(fpsimd_state));
381381

382382
/* Restore the guest state */
383383
if (sve_guest)
@@ -389,7 +389,7 @@ static bool kvm_hyp_handle_fpsimd(struct kvm_vcpu *vcpu, u64 *exit_code)
389389
if (!(read_sysreg(hcr_el2) & HCR_RW))
390390
write_sysreg(__vcpu_sys_reg(vcpu, FPEXC32_EL2), fpexc32_el2);
391391

392-
vcpu->arch.fp_state = FP_STATE_GUEST_OWNED;
392+
*host_data_ptr(fp_owner) = FP_STATE_GUEST_OWNED;
393393

394394
return true;
395395
}

arch/arm64/kvm/hyp/nvhe/debug-sr.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -83,10 +83,10 @@ void __debug_save_host_buffers_nvhe(struct kvm_vcpu *vcpu)
8383
{
8484
/* Disable and flush SPE data generation */
8585
if (vcpu_get_flag(vcpu, DEBUG_STATE_SAVE_SPE))
86-
__debug_save_spe(&vcpu->arch.host_debug_state.pmscr_el1);
86+
__debug_save_spe(host_data_ptr(host_debug_state.pmscr_el1));
8787
/* Disable and flush Self-Hosted Trace generation */
8888
if (vcpu_get_flag(vcpu, DEBUG_STATE_SAVE_TRBE))
89-
__debug_save_trace(&vcpu->arch.host_debug_state.trfcr_el1);
89+
__debug_save_trace(host_data_ptr(host_debug_state.trfcr_el1));
9090
}
9191

9292
void __debug_switch_to_guest(struct kvm_vcpu *vcpu)
@@ -97,9 +97,9 @@ void __debug_switch_to_guest(struct kvm_vcpu *vcpu)
9797
void __debug_restore_host_buffers_nvhe(struct kvm_vcpu *vcpu)
9898
{
9999
if (vcpu_get_flag(vcpu, DEBUG_STATE_SAVE_SPE))
100-
__debug_restore_spe(vcpu->arch.host_debug_state.pmscr_el1);
100+
__debug_restore_spe(*host_data_ptr(host_debug_state.pmscr_el1));
101101
if (vcpu_get_flag(vcpu, DEBUG_STATE_SAVE_TRBE))
102-
__debug_restore_trace(vcpu->arch.host_debug_state.trfcr_el1);
102+
__debug_restore_trace(*host_data_ptr(host_debug_state.trfcr_el1));
103103
}
104104

105105
void __debug_switch_to_host(struct kvm_vcpu *vcpu)

arch/arm64/kvm/hyp/nvhe/hyp-main.c

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,10 +39,8 @@ static void flush_hyp_vcpu(struct pkvm_hyp_vcpu *hyp_vcpu)
3939
hyp_vcpu->vcpu.arch.cptr_el2 = host_vcpu->arch.cptr_el2;
4040

4141
hyp_vcpu->vcpu.arch.iflags = host_vcpu->arch.iflags;
42-
hyp_vcpu->vcpu.arch.fp_state = host_vcpu->arch.fp_state;
4342

4443
hyp_vcpu->vcpu.arch.debug_ptr = kern_hyp_va(host_vcpu->arch.debug_ptr);
45-
hyp_vcpu->vcpu.arch.host_fpsimd_state = host_vcpu->arch.host_fpsimd_state;
4644

4745
hyp_vcpu->vcpu.arch.vsesr_el2 = host_vcpu->arch.vsesr_el2;
4846

@@ -64,7 +62,6 @@ static void sync_hyp_vcpu(struct pkvm_hyp_vcpu *hyp_vcpu)
6462
host_vcpu->arch.fault = hyp_vcpu->vcpu.arch.fault;
6563

6664
host_vcpu->arch.iflags = hyp_vcpu->vcpu.arch.iflags;
67-
host_vcpu->arch.fp_state = hyp_vcpu->vcpu.arch.fp_state;
6865

6966
host_cpu_if->vgic_hcr = hyp_cpu_if->vgic_hcr;
7067
for (i = 0; i < hyp_cpu_if->used_lrs; ++i)

arch/arm64/kvm/hyp/nvhe/psci-relay.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -205,7 +205,7 @@ asmlinkage void __noreturn __kvm_host_psci_cpu_entry(bool is_cpu_on)
205205
struct psci_boot_args *boot_args;
206206
struct kvm_cpu_context *host_ctxt;
207207

208-
host_ctxt = &this_cpu_ptr(&kvm_host_data)->host_ctxt;
208+
host_ctxt = host_data_ptr(host_ctxt);
209209

210210
if (is_cpu_on)
211211
boot_args = this_cpu_ptr(&cpu_on_args);

arch/arm64/kvm/hyp/nvhe/setup.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -257,8 +257,7 @@ static int fix_hyp_pgtable_refcnt(void)
257257

258258
void __noreturn __pkvm_init_finalise(void)
259259
{
260-
struct kvm_host_data *host_data = this_cpu_ptr(&kvm_host_data);
261-
struct kvm_cpu_context *host_ctxt = &host_data->host_ctxt;
260+
struct kvm_cpu_context *host_ctxt = host_data_ptr(host_ctxt);
262261
unsigned long nr_pages, reserved_pages, pfn;
263262
int ret;
264263

0 commit comments

Comments
 (0)