refactor: avoid unnecessary lock/unlock on rxtx map
The handling of FFA_RXTX_MAP ABI was doing an unnecessary
lock/unlock to the lock guarding the caller vm.
Having a look it seems these locks/unlock calls would be
useful when the caller is from NWd into the SPMC.
This patch does some small refactoring to avoid the
unnecessary lock acquisition.
Change-Id: I609b67830b588e095653803f79f6a5329ba5f4fc
Signed-off-by: J-Alves <joao.alves@arm.com>
diff --git a/src/api.c b/src/api.c
index b3eea83..2454a40 100644
--- a/src/api.c
+++ b/src/api.c
@@ -1282,7 +1282,7 @@
return ret;
}
-static void api_get_rxtx_description(struct vm_locked vm_locked, ipaddr_t *send,
+static void api_get_rxtx_description(struct vm *current_vm, ipaddr_t *send,
ipaddr_t *recv, uint32_t *page_count,
ffa_vm_id_t *owner_vm_id)
{
@@ -1290,11 +1290,12 @@
* If the message has been forwarded the effective addresses are in
* hypervisor's TX buffer.
*/
- bool forwarded = (vm_locked.vm->id == HF_OTHER_WORLD_ID) &&
+ bool forwarded = (current_vm->id == HF_OTHER_WORLD_ID) &&
(ipa_addr(*send) == 0) && (ipa_addr(*recv) == 0) &&
(*page_count == 0);
if (forwarded) {
+ struct vm_locked vm_locked = vm_lock(current_vm);
struct ffa_endpoint_rx_tx_descriptor *endpoint_desc =
(struct ffa_endpoint_rx_tx_descriptor *)
vm_locked.vm->mailbox.send;
@@ -1307,8 +1308,10 @@
*recv = ipa_init(rx_region->constituents[0].address);
*send = ipa_init(tx_region->constituents[0].address);
*page_count = rx_region->constituents[0].page_count;
+
+ vm_unlock(&vm_locked);
} else {
- *owner_vm_id = vm_locked.vm->id;
+ *owner_vm_id = current_vm->id;
}
}
/**
@@ -1330,22 +1333,18 @@
struct ffa_value api_ffa_rxtx_map(ipaddr_t send, ipaddr_t recv,
uint32_t page_count, struct vcpu *current)
{
- struct vm *vm = current->vm;
struct ffa_value ret;
- struct vm_locked vm_locked;
struct vm_locked owner_vm_locked;
struct mm_stage1_locked mm_stage1_locked;
struct mpool local_page_pool;
ffa_vm_id_t owner_vm_id;
- vm_locked = vm_lock(vm);
/*
* Get the original buffer addresses and VM ID in case of forwarded
* message.
*/
- api_get_rxtx_description(vm_locked, &send, &recv, &page_count,
+ api_get_rxtx_description(current->vm, &send, &recv, &page_count,
&owner_vm_id);
- vm_unlock(&vm_locked);
owner_vm_locked = plat_ffa_vm_find_locked_create(owner_vm_id);
if (owner_vm_locked.vm == NULL) {