All of lore.kernel.org
 help / color / mirror / Atom feed
From: Thomas Huth <thuth@redhat.com>
To: David Hildenbrand <david@redhat.com>, qemu-devel@nongnu.org
Cc: "Jason J . Herne" <jjherne@linux.ibm.com>,
	Janosch Frank <frankja@linux.ibm.com>,
	Cornelia Huck <cohuck@redhat.com>,
	Richard Henderson <richard.henderson@linaro.org>,
	Halil Pasic <pasic@linux.ibm.com>,
	Christian Borntraeger <borntraeger@de.ibm.com>,
	qemu-s390x@nongnu.org, Claudio Imbrenda <imbrenda@linux.ibm.com>
Subject: Re: [PATCH v1 12/12] hw/s390x/s390-skeys: lazy storage key enablement under TCG
Date: Fri, 6 Aug 2021 15:52:48 +0200	[thread overview]
Message-ID: <0acca1d9-b340-e280-44ad-bc10fc2d4bf3@redhat.com> (raw)
In-Reply-To: <f56f6ad1-1f80-743c-482b-7dbf4cb75360@redhat.com>

On 06/08/2021 15.18, David Hildenbrand wrote:
> On 06.08.21 11:42, Thomas Huth wrote:
>> On 05/08/2021 17.28, David Hildenbrand wrote:
>>> Let's enable storage keys lazily under TCG, just as we do under KVM.
>>> Only fairly old Linux versions actually make use of storage keys, so it
>>> can be kind of wasteful to allocate quite some memory and track
>>> changes and references if nobody cares.
>>>
>>> We have to make sure to flush the TLB when enabling storage keys after
>>> the VM was already running: otherwise it might happen that we don't
>>> catch references or modifications afterwards.
>>>
>>> Add proper documentation to all callbacks.
>>>
>>> The kvm-unit-tests skey tests keeps on working with this change.
>>>
>>> Signed-off-by: David Hildenbrand <david@redhat.com>
>>> ---
>>>    hw/s390x/s390-skeys.c           | 51 +++++++++++++++++++++-----
>>>    include/hw/s390x/storage-keys.h | 63 +++++++++++++++++++++++++++++++++
>>>    target/s390x/mmu_helper.c       |  8 +++++
>>>    target/s390x/tcg/mem_helper.c   |  9 +++++
>>>    4 files changed, 123 insertions(+), 8 deletions(-)
>>>
>>> diff --git a/hw/s390x/s390-skeys.c b/hw/s390x/s390-skeys.c
>>> index 53e16f1b9c..579bdf1d8a 100644
>>> --- a/hw/s390x/s390-skeys.c
>>> +++ b/hw/s390x/s390-skeys.c
>>> @@ -190,18 +190,45 @@ out:
>>>        fclose(f);
>>>    }
>>> -static void qemu_s390_skeys_init(Object *obj)
>>> +static int qemu_s390_skeys_enabled(S390SKeysState *ss)
>>>    {
>>> -    QEMUS390SKeysState *skeys = QEMU_S390_SKEYS(obj);
>>> -    MachineState *machine = MACHINE(qdev_get_machine());
>>> +    QEMUS390SKeysState *skeys = QEMU_S390_SKEYS(ss);
>>> -    skeys->key_count = machine->ram_size / TARGET_PAGE_SIZE;
>>> -    skeys->keydata = g_malloc0(skeys->key_count);
>>> +    /* Lockless check is sufficient. */
>>> +    return !!skeys->keydata;
>>>    }
>>> -static int qemu_s390_skeys_enabled(S390SKeysState *ss)
>>> +static int qemu_s390_skeys_enable(S390SKeysState *ss)
>>
>> Could you please call this qemu_s390_skeys_activate() so that it's not so
>> easily confused with the ..._enabled() function?
> 
> Well, you enable it and you check if it's enabled ... so using different 
> terminology is more confusing, no?
> 
> I could rename _enabled to is_enabled to make the difference easiert to 
> sport here.
> 
>>
>>> diff --git a/include/hw/s390x/storage-keys.h 
>>> b/include/hw/s390x/storage-keys.h
>>> index 2888d42d0b..8b15809716 100644
>>> --- a/include/hw/s390x/storage-keys.h
>>> +++ b/include/hw/s390x/storage-keys.h
>>> @@ -28,9 +28,72 @@ struct S390SKeysState {
>>>    struct S390SKeysClass {
>>>        DeviceClass parent_class;
>>> +
>>> +    /**
>>> +     * @skeys_enabled:
>>> +     *
>>> +     * Check whether storage keys are enabled. If not enabled, they were 
>>> not
>>> +     * enabled lazily either by the guest via a storage key instruction or
>>> +     * by the host during migration.
>>> +     *
>>> +     * If disabled, everything not explicitly triggered by the guest,
>>> +     * such as outgoing migration or dirty/change tracking, should not 
>>> touch
>>> +     * storage keys and should not lazily enable it.
>>> +     *
>>> +     * @ks: the #S390SKeysState
>>> +     *
>>> +     * Returns 0 if not enabled and 1 if enabled.
>>> +     */
>>>        int (*skeys_enabled)(S390SKeysState *ks);
>>> +
>>> +    /**
>>> +     * @skeys_enable:
>>> +     *
>>> +     * Lazily enable storage keys. If this function is not implemented,
>>> +     * setting a storage key will lazily enable storage keys implicitly
>>> +     * instead. TCG guests have to make sure to flush the TLB of all CPUs
>>> +     * if storage keys were not enabled before this call.
>>> +     *
>>> +     * @ks: the #S390SKeysState
>>> +     *
>>> +     * Returns 0 if storage keys were not enabled before this call and 1 if
>>> +     * they were already enabled.
>>> +     */
>>> +    int (*skeys_enable)(S390SKeysState *ks);
>>> +
>>> +    /**
>>> +     * @get_skeys:
>>> +     *
>>> +     * Get storage keys for the given PFN range. This call will fail if
>>> +     * storage keys have not been lazily enabled yet.
>>
>> Shouldn't there be some modifications to qemu_s390_skeys_get() in that case?
>> Or does "fail" mean that it crashes?
> 
> qemu_s390_skeys_get() should simply return -EINVAL because 
> skeydev->key_count == 0. So don't think we need any modifications.
> 
> Makes sense?

Ah, right, make sense, indeed.

  Thomas



  reply	other threads:[~2021-08-06 13:53 UTC|newest]

Thread overview: 46+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-08-05 15:27 [PATCH v1 00/12] s390x: skey related fixes, cleanups, and memory device preparations David Hildenbrand
2021-08-05 15:27 ` [PATCH v1 01/12] s390x/tcg: wrap address for RRBE David Hildenbrand
2021-08-06  5:39   ` Thomas Huth
2021-08-05 15:27 ` [PATCH v1 02/12] s390x/tcg: fix ignoring bit 63 when setting the storage key in SSKE David Hildenbrand
2021-08-06  6:19   ` Thomas Huth
2021-08-06  6:25     ` Thomas Huth
2021-08-06  6:31       ` David Hildenbrand
2021-08-05 15:27 ` [PATCH v1 03/12] s390x/tcg: convert real to absolute address for RRBE, SSKE and ISKE David Hildenbrand
2021-08-06  6:50   ` Thomas Huth
2021-08-06  6:52     ` David Hildenbrand
2021-08-06  7:11       ` Thomas Huth
2021-08-06  7:17         ` David Hildenbrand
2021-08-06 11:25           ` Cornelia Huck
2021-08-06 11:32             ` David Hildenbrand
2021-08-05 15:27 ` [PATCH v1 04/12] s390x/tcg: check for addressing exceptions for " David Hildenbrand
2021-08-05 17:33   ` David Hildenbrand
2021-08-05 15:27 ` [PATCH v1 05/12] s390x/mmu_helper: no need to pass access type to mmu_translate_asce() David Hildenbrand
2021-08-06  7:30   ` Thomas Huth
2021-08-06  7:34     ` David Hildenbrand
2021-08-06  7:36       ` Thomas Huth
2021-08-06  7:36         ` David Hildenbrand
2021-08-05 15:27 ` [PATCH v1 06/12] s390x/mmu_helper: fixup mmu_translate() documentation David Hildenbrand
2021-08-06  7:32   ` Thomas Huth
2021-08-05 15:27 ` [PATCH v1 07/12] s390x/mmu_helper: move address validation into mmu_translate*() David Hildenbrand
2021-08-06  8:18   ` Thomas Huth
2021-08-06  8:20     ` David Hildenbrand
2021-08-06  8:22       ` Thomas Huth
2021-08-06  8:23         ` David Hildenbrand
2021-08-06  8:24           ` Thomas Huth
2021-08-06  8:20   ` Thomas Huth
2021-08-05 15:28 ` [PATCH v1 08/12] s390x/mmu_helper: avoid setting the storage key if nothing changed David Hildenbrand
2021-08-06  8:24   ` Thomas Huth
2021-08-05 15:28 ` [PATCH v1 09/12] hw/s390x/s390-skeys: use memory mapping to detect which storage keys to migrate David Hildenbrand
2021-08-06  8:47   ` Thomas Huth
2021-08-05 15:28 ` [PATCH v1 10/12] hw/s390x/s390-skeys: use memory mapping to detect which storage keys to dump David Hildenbrand
2021-08-06  8:51   ` Thomas Huth
2021-08-05 15:28 ` [PATCH v1 11/12] hw/s390x/s390-skeys: check if an address is valid before dumping the key David Hildenbrand
2021-08-06  8:53   ` Thomas Huth
2021-08-06  8:54     ` David Hildenbrand
2021-08-05 15:28 ` [PATCH v1 12/12] hw/s390x/s390-skeys: lazy storage key enablement under TCG David Hildenbrand
2021-08-06  9:42   ` Thomas Huth
2021-08-06 13:18     ` David Hildenbrand
2021-08-06 13:52       ` Thomas Huth [this message]
2021-08-11  8:43         ` David Hildenbrand
2021-08-06 14:13       ` Cornelia Huck
2021-08-06 14:17         ` Thomas Huth

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=0acca1d9-b340-e280-44ad-bc10fc2d4bf3@redhat.com \
    --to=thuth@redhat.com \
    --cc=borntraeger@de.ibm.com \
    --cc=cohuck@redhat.com \
    --cc=david@redhat.com \
    --cc=frankja@linux.ibm.com \
    --cc=imbrenda@linux.ibm.com \
    --cc=jjherne@linux.ibm.com \
    --cc=pasic@linux.ibm.com \
    --cc=qemu-devel@nongnu.org \
    --cc=qemu-s390x@nongnu.org \
    --cc=richard.henderson@linaro.org \
    /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.