Skip to content

Commit dfcaacc

Browse files
iamjpnmpe
authored andcommitted
KVM: PPC: Book3s HV: Hold LPIDs in an unsigned long
The LPID register is 32 bits long. The host keeps the lpids for each guest in an unsigned word struct kvm_arch. Currently, LPIDs are already limited by mmu_lpid_bits and KVM_MAX_NESTED_GUESTS_SHIFT. The nestedv2 API returns a 64 bit "Guest ID" to be used be the L1 host for each L2 guest. This value is used as an lpid, e.g. it is the parameter used by H_RPT_INVALIDATE. To minimize needless special casing it makes sense to keep this "Guest ID" in struct kvm_arch::lpid. This means that struct kvm_arch::lpid is too small so prepare for this and make it an unsigned long. This is not a problem for the KVM-HV and nestedv1 cases as their lpid values are already limited to valid ranges so in those contexts the lpid can be used as an unsigned word safely as needed. In the PAPR, the H_RPT_INVALIDATE pid/lpid parameter is already specified as an unsigned long so change pseries_rpt_invalidate() to match that. Update the callers of pseries_rpt_invalidate() to also take an unsigned long if they take an lpid value. Signed-off-by: Jordan Niethe <jniethe5@gmail.com> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au> Link: https://msgid.link/20230914030600.16993-10-jniethe5@gmail.com
1 parent 6ccbbc3 commit dfcaacc

File tree

9 files changed

+26
-26
lines changed

9 files changed

+26
-26
lines changed

arch/powerpc/include/asm/kvm_book3s.h

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -191,14 +191,14 @@ extern int kvmppc_mmu_radix_translate_table(struct kvm_vcpu *vcpu, gva_t eaddr,
191191
extern int kvmppc_mmu_radix_xlate(struct kvm_vcpu *vcpu, gva_t eaddr,
192192
struct kvmppc_pte *gpte, bool data, bool iswrite);
193193
extern void kvmppc_radix_tlbie_page(struct kvm *kvm, unsigned long addr,
194-
unsigned int pshift, unsigned int lpid);
194+
unsigned int pshift, u64 lpid);
195195
extern void kvmppc_unmap_pte(struct kvm *kvm, pte_t *pte, unsigned long gpa,
196196
unsigned int shift,
197197
const struct kvm_memory_slot *memslot,
198-
unsigned int lpid);
198+
u64 lpid);
199199
extern bool kvmppc_hv_handle_set_rc(struct kvm *kvm, bool nested,
200200
bool writing, unsigned long gpa,
201-
unsigned int lpid);
201+
u64 lpid);
202202
extern int kvmppc_book3s_instantiate_page(struct kvm_vcpu *vcpu,
203203
unsigned long gpa,
204204
struct kvm_memory_slot *memslot,
@@ -207,7 +207,7 @@ extern int kvmppc_book3s_instantiate_page(struct kvm_vcpu *vcpu,
207207
extern int kvmppc_init_vm_radix(struct kvm *kvm);
208208
extern void kvmppc_free_radix(struct kvm *kvm);
209209
extern void kvmppc_free_pgtable_radix(struct kvm *kvm, pgd_t *pgd,
210-
unsigned int lpid);
210+
u64 lpid);
211211
extern int kvmppc_radix_init(void);
212212
extern void kvmppc_radix_exit(void);
213213
extern void kvm_unmap_radix(struct kvm *kvm, struct kvm_memory_slot *memslot,
@@ -300,7 +300,7 @@ void kvmhv_nested_exit(void);
300300
void kvmhv_vm_nested_init(struct kvm *kvm);
301301
long kvmhv_set_partition_table(struct kvm_vcpu *vcpu);
302302
long kvmhv_copy_tofrom_guest_nested(struct kvm_vcpu *vcpu);
303-
void kvmhv_set_ptbl_entry(unsigned int lpid, u64 dw0, u64 dw1);
303+
void kvmhv_set_ptbl_entry(u64 lpid, u64 dw0, u64 dw1);
304304
void kvmhv_release_all_nested(struct kvm *kvm);
305305
long kvmhv_enter_nested_guest(struct kvm_vcpu *vcpu);
306306
long kvmhv_do_nested_tlbie(struct kvm_vcpu *vcpu);

arch/powerpc/include/asm/kvm_book3s_64.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -624,7 +624,7 @@ static inline void copy_to_checkpoint(struct kvm_vcpu *vcpu)
624624

625625
extern int kvmppc_create_pte(struct kvm *kvm, pgd_t *pgtable, pte_t pte,
626626
unsigned long gpa, unsigned int level,
627-
unsigned long mmu_seq, unsigned int lpid,
627+
unsigned long mmu_seq, u64 lpid,
628628
unsigned long *rmapp, struct rmap_nested **n_rmap);
629629
extern void kvmhv_insert_nest_rmap(struct kvm *kvm, unsigned long *rmapp,
630630
struct rmap_nested **n_rmap);

arch/powerpc/include/asm/kvm_host.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -276,7 +276,7 @@ struct kvm_resize_hpt;
276276
#define KVMPPC_SECURE_INIT_ABORT 0x4 /* H_SVM_INIT_ABORT issued */
277277

278278
struct kvm_arch {
279-
unsigned int lpid;
279+
u64 lpid;
280280
unsigned int smt_mode; /* # vcpus per virtual core */
281281
unsigned int emul_smt_mode; /* emualted SMT mode, on P9 */
282282
#ifdef CONFIG_KVM_BOOK3S_HV_POSSIBLE

arch/powerpc/include/asm/plpar_wrappers.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -355,7 +355,7 @@ static inline long plpar_get_cpu_characteristics(struct h_cpu_char_result *p)
355355
* error recovery of killing the process/guest will be eventually
356356
* needed.
357357
*/
358-
static inline long pseries_rpt_invalidate(u32 pid, u64 target, u64 type,
358+
static inline long pseries_rpt_invalidate(u64 pid, u64 target, u64 type,
359359
u64 page_sizes, u64 start, u64 end)
360360
{
361361
long rc;
@@ -401,7 +401,7 @@ static inline long plpar_pte_read_4(unsigned long flags, unsigned long ptex,
401401
return 0;
402402
}
403403

404-
static inline long pseries_rpt_invalidate(u32 pid, u64 target, u64 type,
404+
static inline long pseries_rpt_invalidate(u64 pid, u64 target, u64 type,
405405
u64 page_sizes, u64 start, u64 end)
406406
{
407407
return 0;

arch/powerpc/kvm/book3s_64_mmu_hv.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ void kvmppc_set_hpt(struct kvm *kvm, struct kvm_hpt_info *info)
121121
kvm->arch.hpt = *info;
122122
kvm->arch.sdr1 = __pa(info->virt) | (info->order - 18);
123123

124-
pr_debug("KVM guest htab at %lx (order %ld), LPID %x\n",
124+
pr_debug("KVM guest htab at %lx (order %ld), LPID %llx\n",
125125
info->virt, (long)info->order, kvm->arch.lpid);
126126
}
127127

arch/powerpc/kvm/book3s_64_mmu_radix.c

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -308,7 +308,7 @@ int kvmppc_mmu_radix_xlate(struct kvm_vcpu *vcpu, gva_t eaddr,
308308
}
309309

310310
void kvmppc_radix_tlbie_page(struct kvm *kvm, unsigned long addr,
311-
unsigned int pshift, unsigned int lpid)
311+
unsigned int pshift, u64 lpid)
312312
{
313313
unsigned long psize = PAGE_SIZE;
314314
int psi;
@@ -345,7 +345,7 @@ void kvmppc_radix_tlbie_page(struct kvm *kvm, unsigned long addr,
345345
pr_err("KVM: TLB page invalidation hcall failed, rc=%ld\n", rc);
346346
}
347347

348-
static void kvmppc_radix_flush_pwc(struct kvm *kvm, unsigned int lpid)
348+
static void kvmppc_radix_flush_pwc(struct kvm *kvm, u64 lpid)
349349
{
350350
long rc;
351351

@@ -418,7 +418,7 @@ static void kvmppc_pmd_free(pmd_t *pmdp)
418418
void kvmppc_unmap_pte(struct kvm *kvm, pte_t *pte, unsigned long gpa,
419419
unsigned int shift,
420420
const struct kvm_memory_slot *memslot,
421-
unsigned int lpid)
421+
u64 lpid)
422422

423423
{
424424
unsigned long old;
@@ -469,7 +469,7 @@ void kvmppc_unmap_pte(struct kvm *kvm, pte_t *pte, unsigned long gpa,
469469
* (or 4kB) mappings (of sub-pages of the same 2MB page).
470470
*/
471471
static void kvmppc_unmap_free_pte(struct kvm *kvm, pte_t *pte, bool full,
472-
unsigned int lpid)
472+
u64 lpid)
473473
{
474474
if (full) {
475475
memset(pte, 0, sizeof(long) << RADIX_PTE_INDEX_SIZE);
@@ -490,7 +490,7 @@ static void kvmppc_unmap_free_pte(struct kvm *kvm, pte_t *pte, bool full,
490490
}
491491

492492
static void kvmppc_unmap_free_pmd(struct kvm *kvm, pmd_t *pmd, bool full,
493-
unsigned int lpid)
493+
u64 lpid)
494494
{
495495
unsigned long im;
496496
pmd_t *p = pmd;
@@ -519,7 +519,7 @@ static void kvmppc_unmap_free_pmd(struct kvm *kvm, pmd_t *pmd, bool full,
519519
}
520520

521521
static void kvmppc_unmap_free_pud(struct kvm *kvm, pud_t *pud,
522-
unsigned int lpid)
522+
u64 lpid)
523523
{
524524
unsigned long iu;
525525
pud_t *p = pud;
@@ -540,7 +540,7 @@ static void kvmppc_unmap_free_pud(struct kvm *kvm, pud_t *pud,
540540
pud_free(kvm->mm, pud);
541541
}
542542

543-
void kvmppc_free_pgtable_radix(struct kvm *kvm, pgd_t *pgd, unsigned int lpid)
543+
void kvmppc_free_pgtable_radix(struct kvm *kvm, pgd_t *pgd, u64 lpid)
544544
{
545545
unsigned long ig;
546546

@@ -567,7 +567,7 @@ void kvmppc_free_radix(struct kvm *kvm)
567567
}
568568

569569
static void kvmppc_unmap_free_pmd_entry_table(struct kvm *kvm, pmd_t *pmd,
570-
unsigned long gpa, unsigned int lpid)
570+
unsigned long gpa, u64 lpid)
571571
{
572572
pte_t *pte = pte_offset_kernel(pmd, 0);
573573

@@ -583,7 +583,7 @@ static void kvmppc_unmap_free_pmd_entry_table(struct kvm *kvm, pmd_t *pmd,
583583
}
584584

585585
static void kvmppc_unmap_free_pud_entry_table(struct kvm *kvm, pud_t *pud,
586-
unsigned long gpa, unsigned int lpid)
586+
unsigned long gpa, u64 lpid)
587587
{
588588
pmd_t *pmd = pmd_offset(pud, 0);
589589

@@ -609,7 +609,7 @@ static void kvmppc_unmap_free_pud_entry_table(struct kvm *kvm, pud_t *pud,
609609

610610
int kvmppc_create_pte(struct kvm *kvm, pgd_t *pgtable, pte_t pte,
611611
unsigned long gpa, unsigned int level,
612-
unsigned long mmu_seq, unsigned int lpid,
612+
unsigned long mmu_seq, u64 lpid,
613613
unsigned long *rmapp, struct rmap_nested **n_rmap)
614614
{
615615
pgd_t *pgd;
@@ -786,7 +786,7 @@ int kvmppc_create_pte(struct kvm *kvm, pgd_t *pgtable, pte_t pte,
786786
}
787787

788788
bool kvmppc_hv_handle_set_rc(struct kvm *kvm, bool nested, bool writing,
789-
unsigned long gpa, unsigned int lpid)
789+
unsigned long gpa, u64 lpid)
790790
{
791791
unsigned long pgflags;
792792
unsigned int shift;

arch/powerpc/kvm/book3s_hv_nested.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -478,7 +478,7 @@ void kvmhv_nested_exit(void)
478478
}
479479
}
480480

481-
static void kvmhv_flush_lpid(unsigned int lpid)
481+
static void kvmhv_flush_lpid(u64 lpid)
482482
{
483483
long rc;
484484

@@ -500,7 +500,7 @@ static void kvmhv_flush_lpid(unsigned int lpid)
500500
pr_err("KVM: TLB LPID invalidation hcall failed, rc=%ld\n", rc);
501501
}
502502

503-
void kvmhv_set_ptbl_entry(unsigned int lpid, u64 dw0, u64 dw1)
503+
void kvmhv_set_ptbl_entry(u64 lpid, u64 dw0, u64 dw1)
504504
{
505505
if (!kvmhv_on_pseries()) {
506506
mmu_partition_table_set_entry(lpid, dw0, dw1, true);

arch/powerpc/kvm/book3s_hv_uvmem.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -858,7 +858,7 @@ unsigned long kvmppc_h_svm_init_done(struct kvm *kvm)
858858
}
859859

860860
kvm->arch.secure_guest |= KVMPPC_SECURE_INIT_DONE;
861-
pr_info("LPID %d went secure\n", kvm->arch.lpid);
861+
pr_info("LPID %lld went secure\n", kvm->arch.lpid);
862862

863863
out:
864864
srcu_read_unlock(&kvm->srcu, srcu_idx);

arch/powerpc/kvm/book3s_xive.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -884,10 +884,10 @@ int kvmppc_xive_attach_escalation(struct kvm_vcpu *vcpu, u8 prio,
884884
}
885885

886886
if (single_escalation)
887-
name = kasprintf(GFP_KERNEL, "kvm-%d-%d",
887+
name = kasprintf(GFP_KERNEL, "kvm-%lld-%d",
888888
vcpu->kvm->arch.lpid, xc->server_num);
889889
else
890-
name = kasprintf(GFP_KERNEL, "kvm-%d-%d-%d",
890+
name = kasprintf(GFP_KERNEL, "kvm-%lld-%d-%d",
891891
vcpu->kvm->arch.lpid, xc->server_num, prio);
892892
if (!name) {
893893
pr_err("Failed to allocate escalation irq name for queue %d of VCPU %d\n",

0 commit comments

Comments
 (0)