* [PATCH 1/2] KVM: arm64: Clean out the odd handling of completer_addr
2022-10-28 8:34 [PATCH 0/2] KVM: arm64: pKVM memory transitions cleanup Oliver Upton
@ 2022-10-28 8:34 ` Oliver Upton
2022-11-10 10:42 ` Will Deacon
2022-10-28 8:34 ` [PATCH 2/2] KVM: arm64: Redefine pKVM memory transitions in terms of source/target Oliver Upton
1 sibling, 1 reply; 7+ messages in thread
From: Oliver Upton @ 2022-10-28 8:34 UTC (permalink / raw)
To: Marc Zyngier, James Morse, Alexandru Elisei
Cc: linux-arm-kernel, kvmarm, kvm, Quentin Perret, kvmarm,
Will Deacon, Fuad Tabba, Vincent Donnefort, Oliver Upton
The layout of struct pkvm_mem_transition is a bit weird; the destination
address for the transition is actually stashed in the initiator address
context. Even weirder so, that address is thrown inside a union and
return from helpers by use of an out pointer.
Rip out the whole mess and move the destination address into the
destination context sub-struct. No functional change intended.
Signed-off-by: Oliver Upton <oliver.upton@linux.dev>
---
arch/arm64/kvm/hyp/nvhe/mem_protect.c | 70 ++++++++++-----------------
1 file changed, 25 insertions(+), 45 deletions(-)
diff --git a/arch/arm64/kvm/hyp/nvhe/mem_protect.c b/arch/arm64/kvm/hyp/nvhe/mem_protect.c
index 1e78acf9662e..3636a24e1b34 100644
--- a/arch/arm64/kvm/hyp/nvhe/mem_protect.c
+++ b/arch/arm64/kvm/hyp/nvhe/mem_protect.c
@@ -393,17 +393,12 @@ struct pkvm_mem_transition {
enum pkvm_component_id id;
/* Address in the initiator's address space */
u64 addr;
-
- union {
- struct {
- /* Address in the completer's address space */
- u64 completer_addr;
- } host;
- };
} initiator;
struct {
enum pkvm_component_id id;
+ /* Address in the completer's address space */
+ u64 addr;
} completer;
};
@@ -471,43 +466,35 @@ static int __host_set_page_state_range(u64 addr, u64 size,
return host_stage2_idmap_locked(addr, size, prot);
}
-static int host_request_owned_transition(u64 *completer_addr,
- const struct pkvm_mem_transition *tx)
+static int host_request_owned_transition(const struct pkvm_mem_transition *tx)
{
u64 size = tx->nr_pages * PAGE_SIZE;
u64 addr = tx->initiator.addr;
- *completer_addr = tx->initiator.host.completer_addr;
return __host_check_page_state_range(addr, size, PKVM_PAGE_OWNED);
}
-static int host_request_unshare(u64 *completer_addr,
- const struct pkvm_mem_transition *tx)
+static int host_request_unshare(const struct pkvm_mem_transition *tx)
{
u64 size = tx->nr_pages * PAGE_SIZE;
u64 addr = tx->initiator.addr;
- *completer_addr = tx->initiator.host.completer_addr;
return __host_check_page_state_range(addr, size, PKVM_PAGE_SHARED_OWNED);
}
-static int host_initiate_share(u64 *completer_addr,
- const struct pkvm_mem_transition *tx)
+static int host_initiate_share(const struct pkvm_mem_transition *tx)
{
u64 size = tx->nr_pages * PAGE_SIZE;
u64 addr = tx->initiator.addr;
- *completer_addr = tx->initiator.host.completer_addr;
return __host_set_page_state_range(addr, size, PKVM_PAGE_SHARED_OWNED);
}
-static int host_initiate_unshare(u64 *completer_addr,
- const struct pkvm_mem_transition *tx)
+static int host_initiate_unshare(const struct pkvm_mem_transition *tx)
{
u64 size = tx->nr_pages * PAGE_SIZE;
u64 addr = tx->initiator.addr;
- *completer_addr = tx->initiator.host.completer_addr;
return __host_set_page_state_range(addr, size, PKVM_PAGE_OWNED);
}
@@ -537,7 +524,7 @@ static bool __hyp_ack_skip_pgtable_check(const struct pkvm_mem_transition *tx)
tx->initiator.id != PKVM_ID_HOST);
}
-static int hyp_ack_share(u64 addr, const struct pkvm_mem_transition *tx,
+static int hyp_ack_share(const struct pkvm_mem_transition *tx,
enum kvm_pgtable_prot perms)
{
u64 size = tx->nr_pages * PAGE_SIZE;
@@ -548,34 +535,35 @@ static int hyp_ack_share(u64 addr, const struct pkvm_mem_transition *tx,
if (__hyp_ack_skip_pgtable_check(tx))
return 0;
- return __hyp_check_page_state_range(addr, size, PKVM_NOPAGE);
+ return __hyp_check_page_state_range(tx->completer.addr, size, PKVM_NOPAGE);
}
-static int hyp_ack_unshare(u64 addr, const struct pkvm_mem_transition *tx)
+static int hyp_ack_unshare(const struct pkvm_mem_transition *tx)
{
u64 size = tx->nr_pages * PAGE_SIZE;
if (__hyp_ack_skip_pgtable_check(tx))
return 0;
- return __hyp_check_page_state_range(addr, size,
+ return __hyp_check_page_state_range(tx->completer.addr, size,
PKVM_PAGE_SHARED_BORROWED);
}
-static int hyp_complete_share(u64 addr, const struct pkvm_mem_transition *tx,
+static int hyp_complete_share(const struct pkvm_mem_transition *tx,
enum kvm_pgtable_prot perms)
{
- void *start = (void *)addr, *end = start + (tx->nr_pages * PAGE_SIZE);
+ void *start = (void *)tx->completer.addr;
+ void *end = start + (tx->nr_pages * PAGE_SIZE);
enum kvm_pgtable_prot prot;
prot = pkvm_mkstate(perms, PKVM_PAGE_SHARED_BORROWED);
return pkvm_create_mappings_locked(start, end, prot);
}
-static int hyp_complete_unshare(u64 addr, const struct pkvm_mem_transition *tx)
+static int hyp_complete_unshare(const struct pkvm_mem_transition *tx)
{
u64 size = tx->nr_pages * PAGE_SIZE;
- int ret = kvm_pgtable_hyp_unmap(&pkvm_pgtable, addr, size);
+ int ret = kvm_pgtable_hyp_unmap(&pkvm_pgtable, tx->completer.addr, size);
return (ret != size) ? -EFAULT : 0;
}
@@ -583,12 +571,11 @@ static int hyp_complete_unshare(u64 addr, const struct pkvm_mem_transition *tx)
static int check_share(struct pkvm_mem_share *share)
{
const struct pkvm_mem_transition *tx = &share->tx;
- u64 completer_addr;
int ret;
switch (tx->initiator.id) {
case PKVM_ID_HOST:
- ret = host_request_owned_transition(&completer_addr, tx);
+ ret = host_request_owned_transition(tx);
break;
default:
ret = -EINVAL;
@@ -599,7 +586,7 @@ static int check_share(struct pkvm_mem_share *share)
switch (tx->completer.id) {
case PKVM_ID_HYP:
- ret = hyp_ack_share(completer_addr, tx, share->completer_prot);
+ ret = hyp_ack_share(tx, share->completer_prot);
break;
default:
ret = -EINVAL;
@@ -611,12 +598,11 @@ static int check_share(struct pkvm_mem_share *share)
static int __do_share(struct pkvm_mem_share *share)
{
const struct pkvm_mem_transition *tx = &share->tx;
- u64 completer_addr;
int ret;
switch (tx->initiator.id) {
case PKVM_ID_HOST:
- ret = host_initiate_share(&completer_addr, tx);
+ ret = host_initiate_share(tx);
break;
default:
ret = -EINVAL;
@@ -627,7 +613,7 @@ static int __do_share(struct pkvm_mem_share *share)
switch (tx->completer.id) {
case PKVM_ID_HYP:
- ret = hyp_complete_share(completer_addr, tx, share->completer_prot);
+ ret = hyp_complete_share(tx, share->completer_prot);
break;
default:
ret = -EINVAL;
@@ -659,12 +645,11 @@ static int do_share(struct pkvm_mem_share *share)
static int check_unshare(struct pkvm_mem_share *share)
{
const struct pkvm_mem_transition *tx = &share->tx;
- u64 completer_addr;
int ret;
switch (tx->initiator.id) {
case PKVM_ID_HOST:
- ret = host_request_unshare(&completer_addr, tx);
+ ret = host_request_unshare(tx);
break;
default:
ret = -EINVAL;
@@ -675,7 +660,7 @@ static int check_unshare(struct pkvm_mem_share *share)
switch (tx->completer.id) {
case PKVM_ID_HYP:
- ret = hyp_ack_unshare(completer_addr, tx);
+ ret = hyp_ack_unshare(tx);
break;
default:
ret = -EINVAL;
@@ -687,12 +672,11 @@ static int check_unshare(struct pkvm_mem_share *share)
static int __do_unshare(struct pkvm_mem_share *share)
{
const struct pkvm_mem_transition *tx = &share->tx;
- u64 completer_addr;
int ret;
switch (tx->initiator.id) {
case PKVM_ID_HOST:
- ret = host_initiate_unshare(&completer_addr, tx);
+ ret = host_initiate_unshare(tx);
break;
default:
ret = -EINVAL;
@@ -703,7 +687,7 @@ static int __do_unshare(struct pkvm_mem_share *share)
switch (tx->completer.id) {
case PKVM_ID_HYP:
- ret = hyp_complete_unshare(completer_addr, tx);
+ ret = hyp_complete_unshare(tx);
break;
default:
ret = -EINVAL;
@@ -743,12 +727,10 @@ int __pkvm_host_share_hyp(u64 pfn)
.initiator = {
.id = PKVM_ID_HOST,
.addr = host_addr,
- .host = {
- .completer_addr = hyp_addr,
- },
},
.completer = {
.id = PKVM_ID_HYP,
+ .addr = hyp_addr,
},
},
.completer_prot = PAGE_HYP,
@@ -776,12 +758,10 @@ int __pkvm_host_unshare_hyp(u64 pfn)
.initiator = {
.id = PKVM_ID_HOST,
.addr = host_addr,
- .host = {
- .completer_addr = hyp_addr,
- },
},
.completer = {
.id = PKVM_ID_HYP,
+ .addr = hyp_addr,
},
},
.completer_prot = PAGE_HYP,
--
2.38.1.273.g43a17bfeac-goog
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
^ permalink raw reply related [flat|nested] 7+ messages in thread* [PATCH 2/2] KVM: arm64: Redefine pKVM memory transitions in terms of source/target
2022-10-28 8:34 [PATCH 0/2] KVM: arm64: pKVM memory transitions cleanup Oliver Upton
2022-10-28 8:34 ` [PATCH 1/2] KVM: arm64: Clean out the odd handling of completer_addr Oliver Upton
@ 2022-10-28 8:34 ` Oliver Upton
2022-10-28 9:57 ` Quentin Perret
1 sibling, 1 reply; 7+ messages in thread
From: Oliver Upton @ 2022-10-28 8:34 UTC (permalink / raw)
To: Marc Zyngier, James Morse, Alexandru Elisei
Cc: linux-arm-kernel, kvmarm, kvm, Quentin Perret, kvmarm,
Will Deacon, Fuad Tabba, Vincent Donnefort, Oliver Upton
Perhaps it is just me, but the 'initiator' and 'completer' terms are
slightly confusing descriptors for the addresses involved in a memory
transition. Apply a rename to instead describe memory transitions in
terms of a source and target address.
No functional change intended.
Signed-off-by: Oliver Upton <oliver.upton@linux.dev>
---
arch/arm64/kvm/hyp/nvhe/mem_protect.c | 68 +++++++++++++--------------
1 file changed, 34 insertions(+), 34 deletions(-)
diff --git a/arch/arm64/kvm/hyp/nvhe/mem_protect.c b/arch/arm64/kvm/hyp/nvhe/mem_protect.c
index 3636a24e1b34..3ea389a8166f 100644
--- a/arch/arm64/kvm/hyp/nvhe/mem_protect.c
+++ b/arch/arm64/kvm/hyp/nvhe/mem_protect.c
@@ -391,20 +391,20 @@ struct pkvm_mem_transition {
struct {
enum pkvm_component_id id;
- /* Address in the initiator's address space */
+ /* Address in the source's address space */
u64 addr;
- } initiator;
+ } source;
struct {
enum pkvm_component_id id;
- /* Address in the completer's address space */
+ /* Address in the target's address space */
u64 addr;
- } completer;
+ } target;
};
struct pkvm_mem_share {
const struct pkvm_mem_transition tx;
- const enum kvm_pgtable_prot completer_prot;
+ const enum kvm_pgtable_prot target_prot;
};
struct check_walk_data {
@@ -469,7 +469,7 @@ static int __host_set_page_state_range(u64 addr, u64 size,
static int host_request_owned_transition(const struct pkvm_mem_transition *tx)
{
u64 size = tx->nr_pages * PAGE_SIZE;
- u64 addr = tx->initiator.addr;
+ u64 addr = tx->source.addr;
return __host_check_page_state_range(addr, size, PKVM_PAGE_OWNED);
}
@@ -477,7 +477,7 @@ static int host_request_owned_transition(const struct pkvm_mem_transition *tx)
static int host_request_unshare(const struct pkvm_mem_transition *tx)
{
u64 size = tx->nr_pages * PAGE_SIZE;
- u64 addr = tx->initiator.addr;
+ u64 addr = tx->source.addr;
return __host_check_page_state_range(addr, size, PKVM_PAGE_SHARED_OWNED);
}
@@ -485,7 +485,7 @@ static int host_request_unshare(const struct pkvm_mem_transition *tx)
static int host_initiate_share(const struct pkvm_mem_transition *tx)
{
u64 size = tx->nr_pages * PAGE_SIZE;
- u64 addr = tx->initiator.addr;
+ u64 addr = tx->source.addr;
return __host_set_page_state_range(addr, size, PKVM_PAGE_SHARED_OWNED);
}
@@ -493,7 +493,7 @@ static int host_initiate_share(const struct pkvm_mem_transition *tx)
static int host_initiate_unshare(const struct pkvm_mem_transition *tx)
{
u64 size = tx->nr_pages * PAGE_SIZE;
- u64 addr = tx->initiator.addr;
+ u64 addr = tx->source.addr;
return __host_set_page_state_range(addr, size, PKVM_PAGE_OWNED);
}
@@ -521,7 +521,7 @@ static int __hyp_check_page_state_range(u64 addr, u64 size,
static bool __hyp_ack_skip_pgtable_check(const struct pkvm_mem_transition *tx)
{
return !(IS_ENABLED(CONFIG_NVHE_EL2_DEBUG) ||
- tx->initiator.id != PKVM_ID_HOST);
+ tx->source.id != PKVM_ID_HOST);
}
static int hyp_ack_share(const struct pkvm_mem_transition *tx,
@@ -535,7 +535,7 @@ static int hyp_ack_share(const struct pkvm_mem_transition *tx,
if (__hyp_ack_skip_pgtable_check(tx))
return 0;
- return __hyp_check_page_state_range(tx->completer.addr, size, PKVM_NOPAGE);
+ return __hyp_check_page_state_range(tx->target.addr, size, PKVM_NOPAGE);
}
static int hyp_ack_unshare(const struct pkvm_mem_transition *tx)
@@ -545,14 +545,14 @@ static int hyp_ack_unshare(const struct pkvm_mem_transition *tx)
if (__hyp_ack_skip_pgtable_check(tx))
return 0;
- return __hyp_check_page_state_range(tx->completer.addr, size,
+ return __hyp_check_page_state_range(tx->target.addr, size,
PKVM_PAGE_SHARED_BORROWED);
}
static int hyp_complete_share(const struct pkvm_mem_transition *tx,
enum kvm_pgtable_prot perms)
{
- void *start = (void *)tx->completer.addr;
+ void *start = (void *)tx->target.addr;
void *end = start + (tx->nr_pages * PAGE_SIZE);
enum kvm_pgtable_prot prot;
@@ -563,7 +563,7 @@ static int hyp_complete_share(const struct pkvm_mem_transition *tx,
static int hyp_complete_unshare(const struct pkvm_mem_transition *tx)
{
u64 size = tx->nr_pages * PAGE_SIZE;
- int ret = kvm_pgtable_hyp_unmap(&pkvm_pgtable, tx->completer.addr, size);
+ int ret = kvm_pgtable_hyp_unmap(&pkvm_pgtable, tx->target.addr, size);
return (ret != size) ? -EFAULT : 0;
}
@@ -573,7 +573,7 @@ static int check_share(struct pkvm_mem_share *share)
const struct pkvm_mem_transition *tx = &share->tx;
int ret;
- switch (tx->initiator.id) {
+ switch (tx->source.id) {
case PKVM_ID_HOST:
ret = host_request_owned_transition(tx);
break;
@@ -584,9 +584,9 @@ static int check_share(struct pkvm_mem_share *share)
if (ret)
return ret;
- switch (tx->completer.id) {
+ switch (tx->target.id) {
case PKVM_ID_HYP:
- ret = hyp_ack_share(tx, share->completer_prot);
+ ret = hyp_ack_share(tx, share->target_prot);
break;
default:
ret = -EINVAL;
@@ -600,7 +600,7 @@ static int __do_share(struct pkvm_mem_share *share)
const struct pkvm_mem_transition *tx = &share->tx;
int ret;
- switch (tx->initiator.id) {
+ switch (tx->source.id) {
case PKVM_ID_HOST:
ret = host_initiate_share(tx);
break;
@@ -611,9 +611,9 @@ static int __do_share(struct pkvm_mem_share *share)
if (ret)
return ret;
- switch (tx->completer.id) {
+ switch (tx->target.id) {
case PKVM_ID_HYP:
- ret = hyp_complete_share(tx, share->completer_prot);
+ ret = hyp_complete_share(tx, share->target_prot);
break;
default:
ret = -EINVAL;
@@ -628,8 +628,8 @@ static int __do_share(struct pkvm_mem_share *share)
* The page owner grants access to another component with a given set
* of permissions.
*
- * Initiator: OWNED => SHARED_OWNED
- * Completer: NOPAGE => SHARED_BORROWED
+ * Source: OWNED => SHARED_OWNED
+ * Target: NOPAGE => SHARED_BORROWED
*/
static int do_share(struct pkvm_mem_share *share)
{
@@ -647,7 +647,7 @@ static int check_unshare(struct pkvm_mem_share *share)
const struct pkvm_mem_transition *tx = &share->tx;
int ret;
- switch (tx->initiator.id) {
+ switch (tx->source.id) {
case PKVM_ID_HOST:
ret = host_request_unshare(tx);
break;
@@ -658,7 +658,7 @@ static int check_unshare(struct pkvm_mem_share *share)
if (ret)
return ret;
- switch (tx->completer.id) {
+ switch (tx->target.id) {
case PKVM_ID_HYP:
ret = hyp_ack_unshare(tx);
break;
@@ -674,7 +674,7 @@ static int __do_unshare(struct pkvm_mem_share *share)
const struct pkvm_mem_transition *tx = &share->tx;
int ret;
- switch (tx->initiator.id) {
+ switch (tx->source.id) {
case PKVM_ID_HOST:
ret = host_initiate_unshare(tx);
break;
@@ -685,7 +685,7 @@ static int __do_unshare(struct pkvm_mem_share *share)
if (ret)
return ret;
- switch (tx->completer.id) {
+ switch (tx->target.id) {
case PKVM_ID_HYP:
ret = hyp_complete_unshare(tx);
break;
@@ -702,8 +702,8 @@ static int __do_unshare(struct pkvm_mem_share *share)
* The page owner revokes access from another component for a range of
* pages which were previously shared using do_share().
*
- * Initiator: SHARED_OWNED => OWNED
- * Completer: SHARED_BORROWED => NOPAGE
+ * Source: SHARED_OWNED => OWNED
+ * Target: SHARED_BORROWED => NOPAGE
*/
static int do_unshare(struct pkvm_mem_share *share)
{
@@ -724,16 +724,16 @@ int __pkvm_host_share_hyp(u64 pfn)
struct pkvm_mem_share share = {
.tx = {
.nr_pages = 1,
- .initiator = {
+ .source = {
.id = PKVM_ID_HOST,
.addr = host_addr,
},
- .completer = {
+ .target = {
.id = PKVM_ID_HYP,
.addr = hyp_addr,
},
},
- .completer_prot = PAGE_HYP,
+ .target_prot = PAGE_HYP,
};
host_lock_component();
@@ -755,16 +755,16 @@ int __pkvm_host_unshare_hyp(u64 pfn)
struct pkvm_mem_share share = {
.tx = {
.nr_pages = 1,
- .initiator = {
+ .source = {
.id = PKVM_ID_HOST,
.addr = host_addr,
},
- .completer = {
+ .target = {
.id = PKVM_ID_HYP,
.addr = hyp_addr,
},
},
- .completer_prot = PAGE_HYP,
+ .target_prot = PAGE_HYP,
};
host_lock_component();
--
2.38.1.273.g43a17bfeac-goog
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
^ permalink raw reply related [flat|nested] 7+ messages in thread