All of lore.kernel.org
 help / color / mirror / Atom feed
From: Christian Borntraeger <borntraeger@de.ibm.com>
To: Alexander Graf <agraf@suse.de>,
	Cornelia Huck <cornelia.huck@de.ibm.com>,
	qemu-devel@nongnu.org
Cc: jfrei@linux.vnet.ibm.com, Thomas Huth <thuth@linux.vnet.ibm.com>
Subject: Re: [Qemu-devel] [PATCH 09/10] s390x/mmu: Use ioctl for reading and writing from/to guest memory
Date: Tue, 21 Apr 2015 21:48:02 +0200	[thread overview]
Message-ID: <5536A972.3070708@de.ibm.com> (raw)
In-Reply-To: <5536A6C8.5010504@suse.de>

Am 21.04.2015 um 21:36 schrieb Alexander Graf:
> On 04/21/2015 09:34 PM, Christian Borntraeger wrote:
>> Am 21.04.2015 um 21:12 schrieb Alexander Graf:
>>> On 04/20/2015 04:55 PM, Christian Borntraeger wrote:
>>>> Am 09.04.2015 um 10:51 schrieb Cornelia Huck:
>>>>> From: Thomas Huth <thuth@linux.vnet.ibm.com>
>>>>>
>>>>> Add code to make use of the new ioctl for reading from / writing to
>>>>> virtual guest memory. By using the ioctl, the memory accesses are now
>>>>> protected with the so-called ipte-lock in the kernel.
>>>>>
>>>>> Signed-off-by: Thomas Huth <thuth@linux.vnet.ibm.com>
>>>>> Signed-off-by: Cornelia Huck <cornelia.huck@de.ibm.com>
>>>> Acked-by: Christian Borntraeger <borntraeger@de.ibm.com>
>>>>
>>>>> ---
>>>>>    target-s390x/cpu.h        |  7 +++++++
>>>>>    target-s390x/kvm.c        | 35 +++++++++++++++++++++++++++++++++++
>>>>>    target-s390x/mmu_helper.c |  9 +++++++++
>>>>>    3 files changed, 51 insertions(+)
>>>>>
>>>>> diff --git a/target-s390x/cpu.h b/target-s390x/cpu.h
>>>>> index 79bc80b..9c42743 100644
>>>>> --- a/target-s390x/cpu.h
>>>>> +++ b/target-s390x/cpu.h
>>>>> @@ -401,6 +401,8 @@ void kvm_s390_vcpu_interrupt(S390CPU *cpu, struct kvm_s390_irq *irq);
>>>>>    void kvm_s390_floating_interrupt(struct kvm_s390_irq *irq);
>>>>>    int kvm_s390_inject_flic(struct kvm_s390_irq *irq);
>>>>>    void kvm_s390_access_exception(S390CPU *cpu, uint16_t code, uint64_t te_code);
>>>>> +int kvm_s390_mem_op(S390CPU *cpu, vaddr addr, void *hostbuf, int len,
>>>>> +                    bool is_write);
>>>>>    int kvm_s390_get_clock(uint8_t *tod_high, uint64_t *tod_clock);
>>>>>    int kvm_s390_set_clock(uint8_t *tod_high, uint64_t *tod_clock);
>>>>>    #else
>>>>> @@ -418,6 +420,11 @@ static inline int kvm_s390_set_clock(uint8_t *tod_high, uint64_t *tod_low)
>>>>>    {
>>>>>        return -ENOSYS;
>>>>>    }
>>>>> +static inline int kvm_s390_mem_op(S390CPU *cpu, vaddr addr, void *hostbuf,
>>>>> +                                  int len, bool is_write)
>>>>> +{
>>>>> +    return -ENOSYS;
>>>>> +}
>>>>>    static inline void kvm_s390_access_exception(S390CPU *cpu, uint16_t code,
>>>>>                                                 uint64_t te_code)
>>>>>    {
>>>>> diff --git a/target-s390x/kvm.c b/target-s390x/kvm.c
>>>>> index 619684b..e2ae2b3 100644
>>>>> --- a/target-s390x/kvm.c
>>>>> +++ b/target-s390x/kvm.c
>>>>> @@ -123,6 +123,7 @@ const KVMCapabilityInfo kvm_arch_required_capabilities[] = {
>>>>>
>>>>>    static int cap_sync_regs;
>>>>>    static int cap_async_pf;
>>>>> +static int cap_mem_op;
>>>>>
>>>>>    static void *legacy_s390_alloc(size_t size, uint64_t *align);
>>>>>
>>>>> @@ -247,6 +248,7 @@ int kvm_arch_init(MachineState *ms, KVMState *s)
>>>>>    {
>>>>>        cap_sync_regs = kvm_check_extension(s, KVM_CAP_SYNC_REGS);
>>>>>        cap_async_pf = kvm_check_extension(s, KVM_CAP_ASYNC_PF);
>>>>> +    cap_mem_op = kvm_check_extension(s, KVM_CAP_S390_MEM_OP);
>>>>>
>>>>>        kvm_s390_enable_cmma(s);
>>>>>
>>>>> @@ -550,6 +552,39 @@ int kvm_s390_set_clock(uint8_t *tod_high, uint64_t *tod_low)
>>>>>        return kvm_vm_ioctl(kvm_state, KVM_SET_DEVICE_ATTR, &attr);
>>>>>    }
>>>>>
>>>>> +/**
>>>>> + * kvm_s390_mem_op:
>>>>> + * @addr:      the logical start address in guest memory
>>>>> + * @hostbuf:   buffer in host memory. NULL = do only checks w/o copying
>>>>> + * @len:       length that should be transfered
>>>>> + * @is_write:  true = write, false = read
>>>>> + * Returns:    0 on success, non-zero if an exception or error occured
>>>>> + *
>>>>> + * Use KVM ioctl to read/write from/to guest memory. An access exception
>>>>> + * is injected into the vCPU in case of translation errors.
>>>>> + */
>>>>> +int kvm_s390_mem_op(S390CPU *cpu, vaddr addr, void *hostbuf, int len,
>>>>> +                    bool is_write)
>>>>> +{
>>>>> +    struct kvm_s390_mem_op mem_op = {
>>>>> +        .gaddr = addr,
>>>>> +        .flags = KVM_S390_MEMOP_F_INJECT_EXCEPTION,
>>>>> +        .size = len,
>>>>> +        .op = is_write ? KVM_S390_MEMOP_LOGICAL_WRITE
>>>>> +                       : KVM_S390_MEMOP_LOGICAL_READ,
>>>>> +        .buf = (uint64_t)hostbuf,
>>>>> +    };
>>>>> +
>>>>> +    if (!cap_mem_op) {
>>>>> +        return -ENOSYS;
>>>>> +    }
>>>>> +    if (!hostbuf) {
>>>>> +        mem_op.flags |= KVM_S390_MEMOP_F_CHECK_ONLY;
>>>>> +    }
>>>>> +
>>>>> +    return kvm_vcpu_ioctl(CPU(cpu), KVM_S390_MEM_OP, &mem_op);
>>>>> +}
>>>>> +
>>>>>    /*
>>>>>     * Legacy layout for s390:
>>>>>     * Older S390 KVM requires the topmost vma of the RAM to be
>>>>> diff --git a/target-s390x/mmu_helper.c b/target-s390x/mmu_helper.c
>>>>> index 9b88498..1e7412c 100644
>>>>> --- a/target-s390x/mmu_helper.c
>>>>> +++ b/target-s390x/mmu_helper.c
>>>>> @@ -450,6 +450,15 @@ int s390_cpu_virt_mem_rw(S390CPU *cpu, vaddr laddr, void *hostbuf,
>>>>>        target_ulong *pages;
>>>>>        int ret;
>>>>>
>>>>> +    if (kvm_enabled()) {
>>>>> +        ret = kvm_s390_mem_op(cpu, laddr, hostbuf, len, is_write);
>>>>> +        if (ret >= 0) {
>>>>> +            return ret;
>>>>> +        } else if (ret != -ENOSYS) {
>>>>> +            error_printf("kvm_s390_mem_op() failed: %s\n", strerror(-ret));
>>> Won't this spill the logs like crazy when running new qemu on old kernels?
>> kvm_s390_mem_op will return -ENOSYS if cap_mem_op is not set.
> 
> Oh, I see the logic now. Can you think of any way to make it more obvious to a reader what's going on?
> 
We could move the error_printf into kvm_s390_mem_op.
Well Conny has to do it as Thomas has left IBM.

  reply	other threads:[~2015-04-21 19:48 UTC|newest]

Thread overview: 25+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-04-09  8:51 [Qemu-devel] [PATCH 00/10] first pile of s390x patches for 2.4 Cornelia Huck
2015-04-09  8:51 ` [Qemu-devel] [PATCH 01/10] s390x/kvm: Remove message about "switch_amode" kernel parameter Cornelia Huck
2015-04-23 12:26   ` Christian Borntraeger
2015-04-23 12:33     ` Cornelia Huck
2015-04-09  8:51 ` [Qemu-devel] [PATCH 02/10] virtio-ccw: sort into categories Cornelia Huck
2015-04-20 14:47   ` Christian Borntraeger
2015-04-09  8:51 ` [Qemu-devel] [PATCH 03/10] s390-virtio: " Cornelia Huck
2015-04-20 14:47   ` Christian Borntraeger
2015-04-09  8:51 ` [Qemu-devel] [PATCH 04/10] sclp: " Cornelia Huck
2015-04-20 14:48   ` Christian Borntraeger
2015-04-09  8:51 ` [Qemu-devel] [PATCH 05/10] s390x/ipl: " Cornelia Huck
2015-04-20 14:48   ` Christian Borntraeger
2015-04-09  8:51 ` [Qemu-devel] [PATCH 06/10] s390x/mmu: Use access type definitions instead of magic values Cornelia Huck
2015-04-09  8:51 ` [Qemu-devel] [PATCH 07/10] linux-headers: update Cornelia Huck
2015-04-24  9:30   ` Paolo Bonzini
2015-04-24 10:23     ` Cornelia Huck
2015-04-09  8:51 ` [Qemu-devel] [PATCH 08/10] s390x/kvm: Put vm name, extended name and UUID into STSI322 SYSIB Cornelia Huck
2015-04-09  8:51 ` [Qemu-devel] [PATCH 09/10] s390x/mmu: Use ioctl for reading and writing from/to guest memory Cornelia Huck
2015-04-20 14:55   ` Christian Borntraeger
2015-04-21 19:12     ` Alexander Graf
2015-04-21 19:34       ` Christian Borntraeger
2015-04-21 19:36         ` Alexander Graf
2015-04-21 19:48           ` Christian Borntraeger [this message]
2015-04-22  8:37             ` Cornelia Huck
2015-04-09  8:51 ` [Qemu-devel] [PATCH 10/10] s390x/kvm: Support access register mode for KVM_S390_MEM_OP ioctl Cornelia Huck

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=5536A972.3070708@de.ibm.com \
    --to=borntraeger@de.ibm.com \
    --cc=agraf@suse.de \
    --cc=cornelia.huck@de.ibm.com \
    --cc=jfrei@linux.vnet.ibm.com \
    --cc=qemu-devel@nongnu.org \
    --cc=thuth@linux.vnet.ibm.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.