clear-pkgs-linux-iot-lts2018/0758-vhm-mark-ioreq-complet...

160 lines
5.5 KiB
Diff

From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Shuo Liu <shuo.a.liu@intel.com>
Date: Mon, 24 Sep 2018 21:58:10 +0800
Subject: [PATCH] vhm: mark ioreq completed in acrn_ioreq_complete_request
Now, we mark ioreq completed scattered in each handler. There is one
ioctl in VHM named acrn_ioreq_complete_request which do post complete
processing. It's better we move the ioreq status changing into it.
Tracked-On: PKT-1592
Tracked-On: projectacrn/acrn-hypervisor#1821
Signed-off-by: Shuo Liu <shuo.a.liu@intel.com>
Reviewed-by: Zhao, Yakui <yakui.zhao@intel.com>
Acked-by: Anthony Xu <anthony.xu@intel.com>
---
drivers/char/vhm/vhm_dev.c | 3 ++-
.../virtio/hyper_dmabuf_virtio_be_drv.c | 5 ++---
drivers/gpu/drm/i915/gvt/acrngt.c | 4 +---
drivers/vbs/vbs.c | 4 +---
drivers/vhm/vhm_ioeventfd.c | 3 +--
drivers/vhm/vhm_ioreq.c | 13 +++++++++++--
include/linux/vhm/acrn_vhm_ioreq.h | 4 +++-
7 files changed, 21 insertions(+), 15 deletions(-)
diff --git a/drivers/char/vhm/vhm_dev.c b/drivers/char/vhm/vhm_dev.c
index 6970def..33df39b 100644
--- a/drivers/char/vhm/vhm_dev.c
+++ b/drivers/char/vhm/vhm_dev.c
@@ -389,7 +389,8 @@ static long vhm_dev_ioctl(struct file *filep,
sizeof(notify)))
return -EFAULT;
- ret = acrn_ioreq_complete_request(notify.client_id, notify.vcpu);
+ ret = acrn_ioreq_complete_request(notify.client_id,
+ notify.vcpu, NULL);
if (ret < 0)
return -EFAULT;
break;
diff --git a/drivers/dma-buf/hyper_dmabuf/virtio/hyper_dmabuf_virtio_be_drv.c b/drivers/dma-buf/hyper_dmabuf/virtio/hyper_dmabuf_virtio_be_drv.c
index b308d7e..1be0218 100644
--- a/drivers/dma-buf/hyper_dmabuf/virtio/hyper_dmabuf_virtio_be_drv.c
+++ b/drivers/dma-buf/hyper_dmabuf/virtio/hyper_dmabuf_virtio_be_drv.c
@@ -186,9 +186,8 @@ static int virtio_be_handle_kick(int client_id, unsigned long *ioreqs_map)
else
val = req->reqs.pio_request.value;
- smp_mb();
- atomic_set(&req->processed, REQ_STATE_COMPLETE);
- acrn_ioreq_complete_request(fe_info->client_id, vcpu);
+ acrn_ioreq_complete_request(
+ fe_info->client_id, vcpu, req);
}
}
diff --git a/drivers/gpu/drm/i915/gvt/acrngt.c b/drivers/gpu/drm/i915/gvt/acrngt.c
index 20e3e67..7a0d138 100644
--- a/drivers/gpu/drm/i915/gvt/acrngt.c
+++ b/drivers/gpu/drm/i915/gvt/acrngt.c
@@ -267,11 +267,9 @@ static int acrngt_emulation_thread(void *priv)
if (ret)
handle_request_error(vgpu);
- smp_mb();
- atomic_set(&req->processed, REQ_STATE_COMPLETE);
/* complete request */
if (acrn_ioreq_complete_request(info->client,
- vcpu))
+ vcpu, req))
gvt_err("failed complete request\n");
}
}
diff --git a/drivers/vbs/vbs.c b/drivers/vbs/vbs.c
index 0e0516a..aaec862 100644
--- a/drivers/vbs/vbs.c
+++ b/drivers/vbs/vbs.c
@@ -200,9 +200,7 @@ int virtio_vqs_index_get(struct virtio_dev_info *dev,
vqs_index[idx++] =
req->reqs.mmio_request.value;
}
- smp_mb();
- atomic_set(&req->processed, REQ_STATE_COMPLETE);
- acrn_ioreq_complete_request(req->client, vcpu);
+ acrn_ioreq_complete_request(req->client, vcpu, req);
}
}
diff --git a/drivers/vhm/vhm_ioeventfd.c b/drivers/vhm/vhm_ioeventfd.c
index d5efb1a..845747b 100644
--- a/drivers/vhm/vhm_ioeventfd.c
+++ b/drivers/vhm/vhm_ioeventfd.c
@@ -386,8 +386,7 @@ static int acrn_ioeventfd_dispatch_ioreq(int client_id,
mutex_unlock(&info->ioeventfds_lock);
next_ioreq:
- atomic_set(&req->processed, REQ_STATE_COMPLETE);
- acrn_ioreq_complete_request(client_id, vcpu);
+ acrn_ioreq_complete_request(client_id, vcpu, req);
}
}
diff --git a/drivers/vhm/vhm_ioreq.c b/drivers/vhm/vhm_ioreq.c
index 1759fd4..9c50d94 100644
--- a/drivers/vhm/vhm_ioreq.c
+++ b/drivers/vhm/vhm_ioreq.c
@@ -269,7 +269,7 @@ void acrn_ioreq_clear_request(struct vhm_vm *vm)
client = clients[vm->ioreq_fallback_client];
while ((bit = find_next_bit(client->ioreqs_map,
0, VHM_REQUEST_MAX)) == VHM_REQUEST_MAX)
- acrn_ioreq_complete_request(client->id, bit);
+ acrn_ioreq_complete_request(client->id, bit, NULL);
}
}
@@ -876,7 +876,8 @@ int acrn_ioreq_distribute_request(struct vhm_vm *vm)
return 0;
}
-int acrn_ioreq_complete_request(int client_id, uint64_t vcpu)
+int acrn_ioreq_complete_request(int client_id, uint64_t vcpu,
+ struct vhm_request *vhm_req)
{
struct ioreq_client *client;
int ret;
@@ -892,6 +893,14 @@ int acrn_ioreq_complete_request(int client_id, uint64_t vcpu)
}
clear_bit(vcpu, client->ioreqs_map);
+ if (!vhm_req) {
+ vhm_req = acrn_ioreq_get_reqbuf(client_id);
+ vhm_req += vcpu;
+ }
+
+ smp_mb();
+ atomic_set(&vhm_req->processed, REQ_STATE_COMPLETE);
+
ret = hcall_notify_req_finish(client->vmid, vcpu);
if (ret < 0) {
pr_err("vhm-ioreq: failed to notify request finished !\n");
diff --git a/include/linux/vhm/acrn_vhm_ioreq.h b/include/linux/vhm/acrn_vhm_ioreq.h
index 5b32f15..7034922 100644
--- a/include/linux/vhm/acrn_vhm_ioreq.h
+++ b/include/linux/vhm/acrn_vhm_ioreq.h
@@ -155,10 +155,12 @@ int acrn_ioreq_distribute_request(struct vhm_vm *vm);
*
* @client_id: client id to identify ioreq client
* @vcpu: identify request submitter
+ * @vhm_req: the request for fast grab
*
* Return: 0 on success, <0 on error
*/
-int acrn_ioreq_complete_request(int client_id, uint64_t vcpu);
+int acrn_ioreq_complete_request(int client_id, uint64_t vcpu,
+ struct vhm_request *vhm_req);
/**
* acrn_ioreq_clear_request - clear all guest requests
--
https://clearlinux.org