From: Janosch Frank <frankja@linux.vnet.ibm.com>
To: David Hildenbrand <david@redhat.com>, kvm@vger.kernel.org
Cc: schwidefsky@de.ibm.com, borntraeger@de.ibm.com,
dominik.dingel@gmail.com, linux-s390@vger.kernel.org
Subject: Re: [RFC/PATCH v2 01/22] s390/mm: make gmap_protect_range more modular
Date: Mon, 22 Jan 2018 13:31:17 +0100 [thread overview]
Message-ID: <2a4094a9-aee5-adad-f543-3bfe1ca9d440@linux.vnet.ibm.com> (raw)
In-Reply-To: <f8fe917b-a95f-406c-fa6b-b12b2dae6e61@redhat.com>
[-- Attachment #1.1: Type: text/plain, Size: 4782 bytes --]
On 22.01.2018 12:33, David Hildenbrand wrote:
> On 13.12.2017 13:53, Janosch Frank wrote:
>> This patch reworks the gmap_protect_range logic and extracts the pte
>> handling into an own function. Also we do now walk to the pmd and make
>> it accessible in the function for later use. This way we can add huge
>> page handling logic more easily.
>>
>> Signed-off-by: Janosch Frank <frankja@linux.vnet.ibm.com>
>> Reviewed-by: Christian Borntraeger <borntraeger@de.ibm.com>
>> Reviewed-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
>> ---
>> arch/s390/mm/gmap.c | 102 ++++++++++++++++++++++++++++++++++++++++++++++------
>> 1 file changed, 92 insertions(+), 10 deletions(-)
>>
>> diff --git a/arch/s390/mm/gmap.c b/arch/s390/mm/gmap.c
>> index 05d459b..8de8bf9 100644
>> --- a/arch/s390/mm/gmap.c
>> +++ b/arch/s390/mm/gmap.c
>> @@ -874,7 +874,88 @@ static int gmap_pte_op_fixup(struct gmap *gmap, unsigned long gaddr,
>> */
>> static void gmap_pte_op_end(spinlock_t *ptl)
>> {
>> - spin_unlock(ptl);
>> + if (ptl)
>> + spin_unlock(ptl);
>> +}
>> +
>> +/**
>> + * gmap_pmd_op_walk - walk the gmap tables, get the guest table lock
>> + * and return the pmd pointer
>> + * @gmap: pointer to guest mapping meta data structure
>> + * @gaddr: virtual address in the guest address space
>> + *
>> + * Returns a pointer to the pmd for a guest address, or NULL
>> + */
>> +static inline pmd_t *gmap_pmd_op_walk(struct gmap *gmap, unsigned long gaddr)
>> +{
>> + pmd_t *pmdp;
>> +
>> + spin_lock(&gmap->guest_table_lock);
>> + pmdp = (pmd_t *) gmap_table_walk(gmap, gaddr, 1);
>> +
>> + /*
>> + * Empty pmds can become large after we give up the
>> + * guest_table_lock, so we have to check for pmd_none
>> + * here.
>> + */
>
> Don't understand that comment. We give up the lock after we're done with
> the pmd either way. So I think this comment can go.
TBH I'm currently not able to recall the reason for this comment.
>
>> + if (!pmdp || pmd_none(*pmdp)) {
>> + spin_unlock(&gmap->guest_table_lock);
>> + return NULL;
>> + }
>> + /*
>> + * For plain 4k guests that do not run under the vsie it
>> + * suffices to take the pte lock later on. Thus we can unlock
>> + * the guest_table_lock here.
>> + */
>
> As discussed, the gmap_is_shadow() check is not needed. The comment
> should be something like
IFF we'll never use this function to walk shadow tables, then you are
right. We can make it a policy and throw in a BUG_ON.
[...]
>> +static int gmap_protect_pte(struct gmap *gmap, unsigned long gaddr,
>> + pmd_t *pmdp, int prot, unsigned long bits)
>> +{
>> + int rc;
>> + pte_t *ptep;
>> + spinlock_t *ptl = NULL;
>> +
>> + /* We have no upper segment, let's go back and fix this up. */
>> + if (pmd_val(*pmdp) & _SEGMENT_ENTRY_INVALID)
>> + return -EAGAIN;
>
> This is essentially pmd_none(*pmdp), which you already verified in
> gmap_pmd_op_walk().
Well, not really pmd_none is entry == ENTRY_EMPTY (only I bit set) not
entry & I.
Is there a path where we have an I bit on a pmd entry which has a valid pto?
>
> I suggest requiring for this function that the entry is valid (which is
> always the case) and getting rid of the -EAGAIN return code. Makes this
> function simpler.
>
>> +
>> + ptep = pte_alloc_map_lock(gmap->mm, pmdp, gaddr, &ptl);
>> + if (!ptep)
>> + return -ENOMEM;
>> +
>> + /* Protect and unlock. */
>> + rc = ptep_force_prot(gmap->mm, gaddr, ptep, prot, bits);
>> + gmap_pte_op_end(ptl);
>> + return rc;
>> }
>>
>> /*
>> @@ -896,16 +977,20 @@ static int gmap_protect_range(struct gmap *gmap, unsigned long gaddr,
>> unsigned long len, int prot, unsigned long bits)
>> {
>> unsigned long vmaddr;
>> - spinlock_t *ptl;
>> - pte_t *ptep;
>> + pmd_t *pmdp;
>> int rc;
>>
>> while (len) {
>> rc = -EAGAIN;
>> - ptep = gmap_pte_op_walk(gmap, gaddr, &ptl);
>> - if (ptep) {
>> - rc = ptep_force_prot(gmap->mm, gaddr, ptep, prot, bits);
>> - gmap_pte_op_end(ptl);
>> + pmdp = gmap_pmd_op_walk(gmap, gaddr);
>> + if (pmdp) {
>> + rc = gmap_protect_pte(gmap, gaddr, pmdp, prot,
>> + bits);
>> + if (!rc) {
>> + len -= PAGE_SIZE;
>> + gaddr += PAGE_SIZE;
>> + }
>> + gmap_pmd_op_end(gmap, pmdp);
>
> This change looks good to me.
Great :)
>
>> }
>> if (rc) {
>> vmaddr = __gmap_translate(gmap, gaddr);
>> @@ -914,10 +999,7 @@ static int gmap_protect_range(struct gmap *gmap, unsigned long gaddr,
>> rc = gmap_pte_op_fixup(gmap, gaddr, vmaddr, prot);
>> if (rc)
>> return rc;
>> - continue;
>> }
>> - gaddr += PAGE_SIZE;
>> - len -= PAGE_SIZE;
>> }
>> return 0;
>> }
>>
>
>
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 819 bytes --]
next prev parent reply other threads:[~2018-01-22 12:31 UTC|newest]
Thread overview: 67+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-12-13 12:53 [RFC/PATCH v2 00/22] KVM/s390: Hugetlbfs enablement Janosch Frank
2017-12-13 12:53 ` [RFC/PATCH v2 01/22] s390/mm: make gmap_protect_range more modular Janosch Frank
2018-01-22 11:33 ` David Hildenbrand
2018-01-22 12:31 ` Janosch Frank [this message]
2018-01-22 12:50 ` David Hildenbrand
2018-01-22 13:02 ` Janosch Frank
2017-12-13 12:53 ` [RFC/PATCH v2 02/22] s390/mm: Abstract gmap notify bit setting Janosch Frank
2018-01-22 11:34 ` David Hildenbrand
2017-12-13 12:53 ` [RFC/PATCH v2 03/22] s390/mm: add gmap PMD invalidation notification Janosch Frank
2017-12-21 9:24 ` Janosch Frank
2018-01-22 11:46 ` David Hildenbrand
2018-01-22 13:13 ` Janosch Frank
2018-01-22 13:29 ` David Hildenbrand
2018-01-22 14:04 ` Janosch Frank
2018-01-22 11:56 ` David Hildenbrand
2018-01-22 12:09 ` Janosch Frank
2018-01-22 12:12 ` David Hildenbrand
2017-12-13 12:53 ` [RFC/PATCH v2 04/22] s390/mm: Add gmap pmd invalidation and clearing Janosch Frank
2017-12-13 12:53 ` [RFC/PATCH v2 05/22] s390/mm: hugetlb pages within a gmap can not be freed Janosch Frank
2018-01-24 13:45 ` David Hildenbrand
2018-01-24 13:56 ` Janosch Frank
2017-12-13 12:53 ` [RFC/PATCH v2 06/22] s390/mm: Introduce gmap_pmdp_xchg Janosch Frank
2017-12-13 12:53 ` [RFC/PATCH v2 07/22] RFC: s390/mm: Transfer guest pmd protection to host Janosch Frank
2017-12-13 12:53 ` [RFC/PATCH v2 08/22] s390/mm: Add huge page dirty sync support Janosch Frank
2017-12-13 12:53 ` [RFC/PATCH v2 09/22] s390/mm: clear huge page storage keys on enable_skey Janosch Frank
2017-12-13 12:53 ` [RFC/PATCH v2 10/22] s390/mm: Add huge pmd storage key handling Janosch Frank
2017-12-13 12:53 ` [RFC/PATCH v2 11/22] s390/mm: Remove superfluous parameter Janosch Frank
2017-12-21 9:22 ` Janosch Frank
2018-01-16 12:39 ` Janosch Frank
2018-01-16 13:11 ` David Hildenbrand
2018-01-22 13:14 ` Christian Borntraeger
2018-01-22 13:24 ` Martin Schwidefsky
2017-12-13 12:53 ` [RFC/PATCH v2 12/22] s390/mm: Add gmap_protect_large read protection support Janosch Frank
2017-12-13 12:53 ` [RFC/PATCH v2 13/22] s390/mm: Make gmap_read_table EDAT1 compatible Janosch Frank
2017-12-13 12:53 ` [RFC/PATCH v2 14/22] s390/mm: Make protect_rmap " Janosch Frank
2017-12-13 12:53 ` [RFC/PATCH v2 15/22] s390/mm: GMAP read table extensions Janosch Frank
2017-12-13 12:53 ` [RFC/PATCH v2 16/22] s390/mm: Add shadow segment code Janosch Frank
2017-12-13 12:53 ` [RFC/PATCH v2 17/22] s390/mm: Add VSIE reverse fake case Janosch Frank
2017-12-13 12:53 ` [RFC/PATCH v2 18/22] s390/mm: Remove gmap_pte_op_walk Janosch Frank
2017-12-13 12:53 ` [RFC/PATCH v2 19/22] s390/mm: Split huge pages if granular protection is needed Janosch Frank
2018-01-25 7:16 ` Janosch Frank
2018-01-25 14:39 ` David Hildenbrand
2018-01-25 14:55 ` Janosch Frank
2017-12-13 12:53 ` [RFC/PATCH v2 20/22] s390/mm: Enable gmap huge pmd support Janosch Frank
2017-12-13 12:53 ` [RFC/PATCH v2 21/22] KVM: s390: Add KVM HPAGE capability Janosch Frank
2017-12-20 13:02 ` Cornelia Huck
2017-12-20 13:17 ` Janosch Frank
2017-12-20 13:21 ` Cornelia Huck
2017-12-13 12:53 ` [RFC/PATCH v2 22/22] RFC: s390/mm: Add gmap lock classes Janosch Frank
2017-12-20 12:24 ` Christian Borntraeger
2017-12-20 12:36 ` Janosch Frank
2017-12-20 12:23 ` [RFC/PATCH v2 00/22] KVM/s390: Hugetlbfs enablement Christian Borntraeger
2017-12-21 12:00 ` David Hildenbrand
2017-12-22 9:08 ` Christian Borntraeger
2018-01-02 0:02 ` Janosch Frank
2018-01-22 11:23 ` David Hildenbrand
2018-01-22 11:56 ` Christian Borntraeger
2018-01-23 21:15 ` David Hildenbrand
2018-01-24 9:01 ` Janosch Frank
2018-01-24 9:14 ` David Hildenbrand
2018-01-25 15:33 ` [PATCH 0/2] Huge page pte protection Janosch Frank
2018-01-25 15:33 ` [PATCH 1/2] mm: s390: Only notify on 4k pages Janosch Frank
2018-01-25 16:04 ` David Hildenbrand
2018-01-26 10:31 ` Janosch Frank
2018-01-25 15:33 ` [PATCH 2/2] mm: s390: Rename gmap_pte_op_fixup Janosch Frank
2018-01-26 10:34 ` [PATCH v2] mm: s390: Only notify on 4k pages Janosch Frank
2018-01-30 10:19 ` David Hildenbrand
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=2a4094a9-aee5-adad-f543-3bfe1ca9d440@linux.vnet.ibm.com \
--to=frankja@linux.vnet.ibm.com \
--cc=borntraeger@de.ibm.com \
--cc=david@redhat.com \
--cc=dominik.dingel@gmail.com \
--cc=kvm@vger.kernel.org \
--cc=linux-s390@vger.kernel.org \
--cc=schwidefsky@de.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.