Message ID | 20230807014553.1168699-5-jniethe5@gmail.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | KVM: PPC: Nested APIv2 guest support | expand |
On Mon Aug 7, 2023 at 11:45 AM AEST, Jordan Niethe wrote: > 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. I don't suppose it would be worth having an lpid_t. > diff --git a/arch/powerpc/kvm/book3s_xive.c b/arch/powerpc/kvm/book3s_xive.c > index 4adff4f1896d..229f0a1ffdd4 100644 > --- a/arch/powerpc/kvm/book3s_xive.c > +++ b/arch/powerpc/kvm/book3s_xive.c > @@ -886,10 +886,10 @@ int kvmppc_xive_attach_escalation(struct kvm_vcpu *vcpu, u8 prio, > > if (single_escalation) > name = kasprintf(GFP_KERNEL, "kvm-%d-%d", > - vcpu->kvm->arch.lpid, xc->server_num); > + (unsigned int)vcpu->kvm->arch.lpid, xc->server_num); > else > name = kasprintf(GFP_KERNEL, "kvm-%d-%d-%d", > - vcpu->kvm->arch.lpid, xc->server_num, prio); > + (unsigned int)vcpu->kvm->arch.lpid, xc->server_num, prio); > if (!name) { > pr_err("Failed to allocate escalation irq name for queue %d of VCPU %d\n", > prio, xc->server_num); I would have thought you'd keep the type and change the format. Otherwise seems okay too. Thanks, Nick
From: Jordan Niethe > Sent: 07 August 2023 02:46 > > 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. Shouldn't it be changed to u64? David - Registered Address Lakeside, Bramley Road, Mount Farm, Milton Keynes, MK1 1PT, UK Registration No: 1397386 (Wales)
"Nicholas Piggin" <npiggin@gmail.com> writes: > On Mon Aug 7, 2023 at 11:45 AM AEST, Jordan Niethe wrote: >> 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. > > I don't suppose it would be worth having an lpid_t. > >> diff --git a/arch/powerpc/kvm/book3s_xive.c b/arch/powerpc/kvm/book3s_xive.c >> index 4adff4f1896d..229f0a1ffdd4 100644 >> --- a/arch/powerpc/kvm/book3s_xive.c >> +++ b/arch/powerpc/kvm/book3s_xive.c >> @@ -886,10 +886,10 @@ int kvmppc_xive_attach_escalation(struct kvm_vcpu *vcpu, u8 prio, >> >> if (single_escalation) >> name = kasprintf(GFP_KERNEL, "kvm-%d-%d", >> - vcpu->kvm->arch.lpid, xc->server_num); >> + (unsigned int)vcpu->kvm->arch.lpid, xc->server_num); >> else >> name = kasprintf(GFP_KERNEL, "kvm-%d-%d-%d", >> - vcpu->kvm->arch.lpid, xc->server_num, prio); >> + (unsigned int)vcpu->kvm->arch.lpid, xc->server_num, prio); >> if (!name) { >> pr_err("Failed to allocate escalation irq name for queue %d of VCPU %d\n", >> prio, xc->server_num); > > I would have thought you'd keep the type and change the format. Yeah. Don't we risk having ambigious names by discarding the high bits? Not sure that would be a bug per se, but it could be confusing. cheers
On 14/8/23 6:12 pm, Nicholas Piggin wrote: > On Mon Aug 7, 2023 at 11:45 AM AEST, Jordan Niethe wrote: >> 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. > > I don't suppose it would be worth having an lpid_t. I actually introduced that when I was developing for the purpose of doing the conversion, but I felt like it was unnecessary in the end, it is just a wider integer and it is simpler to treat it that way imho. > >> diff --git a/arch/powerpc/kvm/book3s_xive.c b/arch/powerpc/kvm/book3s_xive.c >> index 4adff4f1896d..229f0a1ffdd4 100644 >> --- a/arch/powerpc/kvm/book3s_xive.c >> +++ b/arch/powerpc/kvm/book3s_xive.c >> @@ -886,10 +886,10 @@ int kvmppc_xive_attach_escalation(struct kvm_vcpu *vcpu, u8 prio, >> >> if (single_escalation) >> name = kasprintf(GFP_KERNEL, "kvm-%d-%d", >> - vcpu->kvm->arch.lpid, xc->server_num); >> + (unsigned int)vcpu->kvm->arch.lpid, xc->server_num); >> else >> name = kasprintf(GFP_KERNEL, "kvm-%d-%d-%d", >> - vcpu->kvm->arch.lpid, xc->server_num, prio); >> + (unsigned int)vcpu->kvm->arch.lpid, xc->server_num, prio); >> if (!name) { >> pr_err("Failed to allocate escalation irq name for queue %d of VCPU %d\n", >> prio, xc->server_num); > > I would have thought you'd keep the type and change the format. yeah, I will do that. > > Otherwise seems okay too. Thanks. > > Thanks, > Nick >
On 14/8/23 6:15 pm, David Laight wrote: > From: Jordan Niethe >> Sent: 07 August 2023 02:46 >> >> 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. > > Shouldn't it be changed to u64? This will only be for 64-bit PPC so an unsigned long will always be 64 bits wide, but I can use a u64 instead. > > David > > > - > Registered Address Lakeside, Bramley Road, Mount Farm, Milton Keynes, MK1 1PT, UK > Registration No: 1397386 (Wales) >
On 15/8/23 8:45 pm, Michael Ellerman wrote: > "Nicholas Piggin" <npiggin@gmail.com> writes: >> On Mon Aug 7, 2023 at 11:45 AM AEST, Jordan Niethe wrote: >>> 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. >> >> I don't suppose it would be worth having an lpid_t. >> >>> diff --git a/arch/powerpc/kvm/book3s_xive.c b/arch/powerpc/kvm/book3s_xive.c >>> index 4adff4f1896d..229f0a1ffdd4 100644 >>> --- a/arch/powerpc/kvm/book3s_xive.c >>> +++ b/arch/powerpc/kvm/book3s_xive.c >>> @@ -886,10 +886,10 @@ int kvmppc_xive_attach_escalation(struct kvm_vcpu *vcpu, u8 prio, >>> >>> if (single_escalation) >>> name = kasprintf(GFP_KERNEL, "kvm-%d-%d", >>> - vcpu->kvm->arch.lpid, xc->server_num); >>> + (unsigned int)vcpu->kvm->arch.lpid, xc->server_num); >>> else >>> name = kasprintf(GFP_KERNEL, "kvm-%d-%d-%d", >>> - vcpu->kvm->arch.lpid, xc->server_num, prio); >>> + (unsigned int)vcpu->kvm->arch.lpid, xc->server_num, prio); >>> if (!name) { >>> pr_err("Failed to allocate escalation irq name for queue %d of VCPU %d\n", >>> prio, xc->server_num); >> >> I would have thought you'd keep the type and change the format. > > Yeah. Don't we risk having ambigious names by discarding the high bits? > Not sure that would be a bug per se, but it could be confusing. In this context is would always be constrained be the number of LPID bits so wouldn't be ambiguous, but I'm going to change the format. > > cheers >
Jordan Niethe <jniethe5@gmail.com> writes: > 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> > --- This needs: diff --git a/arch/powerpc/kvm/book3s_hv_uvmem.c b/arch/powerpc/kvm/book3s_hv_uvmem.c index 709ebd578394..08e32b44ee32 100644 --- a/arch/powerpc/kvm/book3s_hv_uvmem.c +++ b/arch/powerpc/kvm/book3s_hv_uvmem.c @@ -857,7 +857,7 @@ unsigned long kvmppc_h_svm_init_done(struct kvm *kvm) } kvm->arch.secure_guest |= KVMPPC_SECURE_INIT_DONE; - pr_info("LPID %d went secure\n", kvm->arch.lpid); + pr_info("LPID %lu went secure\n", kvm->arch.lpid); out: srcu_read_unlock(&kvm->srcu, srcu_idx); cheers
diff --git a/arch/powerpc/include/asm/kvm_book3s.h b/arch/powerpc/include/asm/kvm_book3s.h index 1a7e837ea2d5..98d4870ec4b3 100644 --- a/arch/powerpc/include/asm/kvm_book3s.h +++ b/arch/powerpc/include/asm/kvm_book3s.h @@ -191,14 +191,14 @@ extern int kvmppc_mmu_radix_translate_table(struct kvm_vcpu *vcpu, gva_t eaddr, extern int kvmppc_mmu_radix_xlate(struct kvm_vcpu *vcpu, gva_t eaddr, struct kvmppc_pte *gpte, bool data, bool iswrite); extern void kvmppc_radix_tlbie_page(struct kvm *kvm, unsigned long addr, - unsigned int pshift, unsigned int lpid); + unsigned int pshift, unsigned long lpid); extern void kvmppc_unmap_pte(struct kvm *kvm, pte_t *pte, unsigned long gpa, unsigned int shift, const struct kvm_memory_slot *memslot, - unsigned int lpid); + unsigned long lpid); extern bool kvmppc_hv_handle_set_rc(struct kvm *kvm, bool nested, bool writing, unsigned long gpa, - unsigned int lpid); + unsigned long lpid); extern int kvmppc_book3s_instantiate_page(struct kvm_vcpu *vcpu, unsigned long gpa, struct kvm_memory_slot *memslot, @@ -207,7 +207,7 @@ extern int kvmppc_book3s_instantiate_page(struct kvm_vcpu *vcpu, extern int kvmppc_init_vm_radix(struct kvm *kvm); extern void kvmppc_free_radix(struct kvm *kvm); extern void kvmppc_free_pgtable_radix(struct kvm *kvm, pgd_t *pgd, - unsigned int lpid); + unsigned long lpid); extern int kvmppc_radix_init(void); extern void kvmppc_radix_exit(void); extern void kvm_unmap_radix(struct kvm *kvm, struct kvm_memory_slot *memslot, @@ -300,7 +300,7 @@ void kvmhv_nested_exit(void); void kvmhv_vm_nested_init(struct kvm *kvm); long kvmhv_set_partition_table(struct kvm_vcpu *vcpu); long kvmhv_copy_tofrom_guest_nested(struct kvm_vcpu *vcpu); -void kvmhv_set_ptbl_entry(unsigned int lpid, u64 dw0, u64 dw1); +void kvmhv_set_ptbl_entry(unsigned long lpid, u64 dw0, u64 dw1); void kvmhv_release_all_nested(struct kvm *kvm); long kvmhv_enter_nested_guest(struct kvm_vcpu *vcpu); long kvmhv_do_nested_tlbie(struct kvm_vcpu *vcpu); diff --git a/arch/powerpc/include/asm/kvm_book3s_64.h b/arch/powerpc/include/asm/kvm_book3s_64.h index d49065af08e9..9fc3ad3990f7 100644 --- a/arch/powerpc/include/asm/kvm_book3s_64.h +++ b/arch/powerpc/include/asm/kvm_book3s_64.h @@ -624,7 +624,7 @@ static inline void copy_to_checkpoint(struct kvm_vcpu *vcpu) extern int kvmppc_create_pte(struct kvm *kvm, pgd_t *pgtable, pte_t pte, unsigned long gpa, unsigned int level, - unsigned long mmu_seq, unsigned int lpid, + unsigned long mmu_seq, unsigned long lpid, unsigned long *rmapp, struct rmap_nested **n_rmap); extern void kvmhv_insert_nest_rmap(struct kvm *kvm, unsigned long *rmapp, struct rmap_nested **n_rmap); diff --git a/arch/powerpc/include/asm/kvm_host.h b/arch/powerpc/include/asm/kvm_host.h index 14ee0dece853..67dd3e749cac 100644 --- a/arch/powerpc/include/asm/kvm_host.h +++ b/arch/powerpc/include/asm/kvm_host.h @@ -276,7 +276,7 @@ struct kvm_resize_hpt; #define KVMPPC_SECURE_INIT_ABORT 0x4 /* H_SVM_INIT_ABORT issued */ struct kvm_arch { - unsigned int lpid; + unsigned long lpid; unsigned int smt_mode; /* # vcpus per virtual core */ unsigned int emul_smt_mode; /* emualted SMT mode, on P9 */ #ifdef CONFIG_KVM_BOOK3S_HV_POSSIBLE diff --git a/arch/powerpc/include/asm/plpar_wrappers.h b/arch/powerpc/include/asm/plpar_wrappers.h index 8239c0af5eb2..efd9b8b7fb8f 100644 --- a/arch/powerpc/include/asm/plpar_wrappers.h +++ b/arch/powerpc/include/asm/plpar_wrappers.h @@ -354,7 +354,7 @@ static inline long plpar_get_cpu_characteristics(struct h_cpu_char_result *p) * error recovery of killing the process/guest will be eventually * needed. */ -static inline long pseries_rpt_invalidate(u32 pid, u64 target, u64 type, +static inline long pseries_rpt_invalidate(unsigned long pid, u64 target, u64 type, u64 page_sizes, u64 start, u64 end) { long rc; @@ -400,7 +400,7 @@ static inline long plpar_pte_read_4(unsigned long flags, unsigned long ptex, return 0; } -static inline long pseries_rpt_invalidate(u32 pid, u64 target, u64 type, +static inline long pseries_rpt_invalidate(unsigned long pid, u64 target, u64 type, u64 page_sizes, u64 start, u64 end) { return 0; diff --git a/arch/powerpc/kvm/book3s_64_mmu_hv.c b/arch/powerpc/kvm/book3s_64_mmu_hv.c index 738f2ecbe9b9..01ad8fe96184 100644 --- a/arch/powerpc/kvm/book3s_64_mmu_hv.c +++ b/arch/powerpc/kvm/book3s_64_mmu_hv.c @@ -121,7 +121,7 @@ void kvmppc_set_hpt(struct kvm *kvm, struct kvm_hpt_info *info) kvm->arch.sdr1 = __pa(info->virt) | (info->order - 18); pr_debug("KVM guest htab at %lx (order %ld), LPID %x\n", - info->virt, (long)info->order, kvm->arch.lpid); + info->virt, (long)info->order, (unsigned int)kvm->arch.lpid); } int kvmppc_alloc_reset_hpt(struct kvm *kvm, int order) diff --git a/arch/powerpc/kvm/book3s_64_mmu_radix.c b/arch/powerpc/kvm/book3s_64_mmu_radix.c index ab646f59afd7..0470abd0a9c1 100644 --- a/arch/powerpc/kvm/book3s_64_mmu_radix.c +++ b/arch/powerpc/kvm/book3s_64_mmu_radix.c @@ -308,7 +308,7 @@ int kvmppc_mmu_radix_xlate(struct kvm_vcpu *vcpu, gva_t eaddr, } void kvmppc_radix_tlbie_page(struct kvm *kvm, unsigned long addr, - unsigned int pshift, unsigned int lpid) + unsigned int pshift, unsigned long lpid) { unsigned long psize = PAGE_SIZE; int psi; @@ -345,7 +345,7 @@ void kvmppc_radix_tlbie_page(struct kvm *kvm, unsigned long addr, pr_err("KVM: TLB page invalidation hcall failed, rc=%ld\n", rc); } -static void kvmppc_radix_flush_pwc(struct kvm *kvm, unsigned int lpid) +static void kvmppc_radix_flush_pwc(struct kvm *kvm, unsigned long lpid) { long rc; @@ -418,7 +418,7 @@ static void kvmppc_pmd_free(pmd_t *pmdp) void kvmppc_unmap_pte(struct kvm *kvm, pte_t *pte, unsigned long gpa, unsigned int shift, const struct kvm_memory_slot *memslot, - unsigned int lpid) + unsigned long lpid) { unsigned long old; @@ -469,7 +469,7 @@ void kvmppc_unmap_pte(struct kvm *kvm, pte_t *pte, unsigned long gpa, * (or 4kB) mappings (of sub-pages of the same 2MB page). */ static void kvmppc_unmap_free_pte(struct kvm *kvm, pte_t *pte, bool full, - unsigned int lpid) + unsigned long lpid) { if (full) { 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, } static void kvmppc_unmap_free_pmd(struct kvm *kvm, pmd_t *pmd, bool full, - unsigned int lpid) + unsigned long lpid) { unsigned long im; pmd_t *p = pmd; @@ -519,7 +519,7 @@ static void kvmppc_unmap_free_pmd(struct kvm *kvm, pmd_t *pmd, bool full, } static void kvmppc_unmap_free_pud(struct kvm *kvm, pud_t *pud, - unsigned int lpid) + unsigned long lpid) { unsigned long iu; pud_t *p = pud; @@ -540,7 +540,7 @@ static void kvmppc_unmap_free_pud(struct kvm *kvm, pud_t *pud, pud_free(kvm->mm, pud); } -void kvmppc_free_pgtable_radix(struct kvm *kvm, pgd_t *pgd, unsigned int lpid) +void kvmppc_free_pgtable_radix(struct kvm *kvm, pgd_t *pgd, unsigned long lpid) { unsigned long ig; @@ -567,7 +567,7 @@ void kvmppc_free_radix(struct kvm *kvm) } static void kvmppc_unmap_free_pmd_entry_table(struct kvm *kvm, pmd_t *pmd, - unsigned long gpa, unsigned int lpid) + unsigned long gpa, unsigned long lpid) { pte_t *pte = pte_offset_kernel(pmd, 0); @@ -583,7 +583,7 @@ static void kvmppc_unmap_free_pmd_entry_table(struct kvm *kvm, pmd_t *pmd, } static void kvmppc_unmap_free_pud_entry_table(struct kvm *kvm, pud_t *pud, - unsigned long gpa, unsigned int lpid) + unsigned long gpa, unsigned long lpid) { pmd_t *pmd = pmd_offset(pud, 0); @@ -609,7 +609,7 @@ static void kvmppc_unmap_free_pud_entry_table(struct kvm *kvm, pud_t *pud, int kvmppc_create_pte(struct kvm *kvm, pgd_t *pgtable, pte_t pte, unsigned long gpa, unsigned int level, - unsigned long mmu_seq, unsigned int lpid, + unsigned long mmu_seq, unsigned long lpid, unsigned long *rmapp, struct rmap_nested **n_rmap) { pgd_t *pgd; @@ -786,7 +786,7 @@ int kvmppc_create_pte(struct kvm *kvm, pgd_t *pgtable, pte_t pte, } bool kvmppc_hv_handle_set_rc(struct kvm *kvm, bool nested, bool writing, - unsigned long gpa, unsigned int lpid) + unsigned long gpa, unsigned long lpid) { unsigned long pgflags; unsigned int shift; diff --git a/arch/powerpc/kvm/book3s_hv_nested.c b/arch/powerpc/kvm/book3s_hv_nested.c index 377d0b4a05ee..20490dd4708f 100644 --- a/arch/powerpc/kvm/book3s_hv_nested.c +++ b/arch/powerpc/kvm/book3s_hv_nested.c @@ -478,7 +478,7 @@ void kvmhv_nested_exit(void) } } -static void kvmhv_flush_lpid(unsigned int lpid) +static void kvmhv_flush_lpid(unsigned long lpid) { long rc; @@ -500,7 +500,7 @@ static void kvmhv_flush_lpid(unsigned int lpid) pr_err("KVM: TLB LPID invalidation hcall failed, rc=%ld\n", rc); } -void kvmhv_set_ptbl_entry(unsigned int lpid, u64 dw0, u64 dw1) +void kvmhv_set_ptbl_entry(unsigned long lpid, u64 dw0, u64 dw1) { if (!kvmhv_on_pseries()) { mmu_partition_table_set_entry(lpid, dw0, dw1, true); diff --git a/arch/powerpc/kvm/book3s_xive.c b/arch/powerpc/kvm/book3s_xive.c index 4adff4f1896d..229f0a1ffdd4 100644 --- a/arch/powerpc/kvm/book3s_xive.c +++ b/arch/powerpc/kvm/book3s_xive.c @@ -886,10 +886,10 @@ int kvmppc_xive_attach_escalation(struct kvm_vcpu *vcpu, u8 prio, if (single_escalation) name = kasprintf(GFP_KERNEL, "kvm-%d-%d", - vcpu->kvm->arch.lpid, xc->server_num); + (unsigned int)vcpu->kvm->arch.lpid, xc->server_num); else name = kasprintf(GFP_KERNEL, "kvm-%d-%d-%d", - vcpu->kvm->arch.lpid, xc->server_num, prio); + (unsigned int)vcpu->kvm->arch.lpid, xc->server_num, prio); if (!name) { pr_err("Failed to allocate escalation irq name for queue %d of VCPU %d\n", prio, xc->server_num);
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> --- v3: - New to series --- arch/powerpc/include/asm/kvm_book3s.h | 10 +++++----- arch/powerpc/include/asm/kvm_book3s_64.h | 2 +- arch/powerpc/include/asm/kvm_host.h | 2 +- arch/powerpc/include/asm/plpar_wrappers.h | 4 ++-- arch/powerpc/kvm/book3s_64_mmu_hv.c | 2 +- arch/powerpc/kvm/book3s_64_mmu_radix.c | 22 +++++++++++----------- arch/powerpc/kvm/book3s_hv_nested.c | 4 ++-- arch/powerpc/kvm/book3s_xive.c | 4 ++-- 8 files changed, 25 insertions(+), 25 deletions(-)