Skip to content

Commit d41993f

Browse files
author
Claudio Imbrenda
committed
KVM: s390: get rid of gmap_translate()
Add gpa_to_hva(), which uses memslots, and use it to replace all uses of gmap_translate(). Reviewed-by: Janosch Frank <frankja@linux.ibm.com> Reviewed-by: Christoph Schlameuss <schlameuss@linux.ibm.com> Link: https://lore.kernel.org/r/20250123144627.312456-9-imbrenda@linux.ibm.com Signed-off-by: Claudio Imbrenda <imbrenda@linux.ibm.com> Message-ID: <20250123144627.312456-9-imbrenda@linux.ibm.com>
1 parent 6eb84e1 commit d41993f

File tree

4 files changed

+20
-29
lines changed

4 files changed

+20
-29
lines changed

arch/s390/include/asm/gmap.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,6 @@ int gmap_map_segment(struct gmap *gmap, unsigned long from,
111111
unsigned long to, unsigned long len);
112112
int gmap_unmap_segment(struct gmap *gmap, unsigned long to, unsigned long len);
113113
unsigned long __gmap_translate(struct gmap *, unsigned long gaddr);
114-
unsigned long gmap_translate(struct gmap *, unsigned long gaddr);
115114
int __gmap_link(struct gmap *gmap, unsigned long gaddr, unsigned long vmaddr);
116115
void gmap_discard(struct gmap *, unsigned long from, unsigned long to);
117116
void __gmap_zap(struct gmap *, unsigned long gaddr);

arch/s390/kvm/interrupt.c

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2893,22 +2893,25 @@ int kvm_set_routing_entry(struct kvm *kvm,
28932893
struct kvm_kernel_irq_routing_entry *e,
28942894
const struct kvm_irq_routing_entry *ue)
28952895
{
2896-
u64 uaddr;
2896+
u64 uaddr_s, uaddr_i;
2897+
int idx;
28972898

28982899
switch (ue->type) {
28992900
/* we store the userspace addresses instead of the guest addresses */
29002901
case KVM_IRQ_ROUTING_S390_ADAPTER:
29012902
if (kvm_is_ucontrol(kvm))
29022903
return -EINVAL;
29032904
e->set = set_adapter_int;
2904-
uaddr = gmap_translate(kvm->arch.gmap, ue->u.adapter.summary_addr);
2905-
if (uaddr == -EFAULT)
2906-
return -EFAULT;
2907-
e->adapter.summary_addr = uaddr;
2908-
uaddr = gmap_translate(kvm->arch.gmap, ue->u.adapter.ind_addr);
2909-
if (uaddr == -EFAULT)
2905+
2906+
idx = srcu_read_lock(&kvm->srcu);
2907+
uaddr_s = gpa_to_hva(kvm, ue->u.adapter.summary_addr);
2908+
uaddr_i = gpa_to_hva(kvm, ue->u.adapter.ind_addr);
2909+
srcu_read_unlock(&kvm->srcu, idx);
2910+
2911+
if (kvm_is_error_hva(uaddr_s) || kvm_is_error_hva(uaddr_i))
29102912
return -EFAULT;
2911-
e->adapter.ind_addr = uaddr;
2913+
e->adapter.summary_addr = uaddr_s;
2914+
e->adapter.ind_addr = uaddr_i;
29122915
e->adapter.summary_offset = ue->u.adapter.summary_offset;
29132916
e->adapter.ind_offset = ue->u.adapter.ind_offset;
29142917
e->adapter.adapter_id = ue->u.adapter.adapter_id;

arch/s390/kvm/kvm-s390.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -281,6 +281,15 @@ static inline u32 kvm_s390_get_gisa_desc(struct kvm *kvm)
281281
return gd;
282282
}
283283

284+
static inline hva_t gpa_to_hva(struct kvm *kvm, gpa_t gpa)
285+
{
286+
hva_t hva = gfn_to_hva(kvm, gpa_to_gfn(gpa));
287+
288+
if (!kvm_is_error_hva(hva))
289+
hva |= offset_in_page(gpa);
290+
return hva;
291+
}
292+
284293
/* implemented in pv.c */
285294
int kvm_s390_pv_destroy_cpu(struct kvm_vcpu *vcpu, u16 *rc, u16 *rrc);
286295
int kvm_s390_pv_create_cpu(struct kvm_vcpu *vcpu, u16 *rc, u16 *rrc);

arch/s390/mm/gmap.c

Lines changed: 0 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -463,26 +463,6 @@ unsigned long __gmap_translate(struct gmap *gmap, unsigned long gaddr)
463463
}
464464
EXPORT_SYMBOL_GPL(__gmap_translate);
465465

466-
/**
467-
* gmap_translate - translate a guest address to a user space address
468-
* @gmap: pointer to guest mapping meta data structure
469-
* @gaddr: guest address
470-
*
471-
* Returns user space address which corresponds to the guest address or
472-
* -EFAULT if no such mapping exists.
473-
* This function does not establish potentially missing page table entries.
474-
*/
475-
unsigned long gmap_translate(struct gmap *gmap, unsigned long gaddr)
476-
{
477-
unsigned long rc;
478-
479-
mmap_read_lock(gmap->mm);
480-
rc = __gmap_translate(gmap, gaddr);
481-
mmap_read_unlock(gmap->mm);
482-
return rc;
483-
}
484-
EXPORT_SYMBOL_GPL(gmap_translate);
485-
486466
/**
487467
* gmap_unlink - disconnect a page table from the gmap shadow tables
488468
* @mm: pointer to the parent mm_struct

0 commit comments

Comments
 (0)