On 22-07-25, 10:38, Bertrand Marquis wrote:
+static void virtio_msg_get(struct virtio_device *vdev, unsigned int offset,
- void *buf, unsigned int len)
+{
- struct virtio_msg_device *vmdev = to_virtio_msg_device(vdev);
- struct get_config *req_payload = virtio_msg_payload(vmdev->request);
- struct get_config_resp *res_payload = virtio_msg_payload(vmdev->response);
- BUG_ON(len > 8);
So you only allow to retrieve 64bit at a time here. Why is that ?
This was copied from mmio which accepts on 8 bytes at a time. Modified as:
diff --git a/drivers/virtio/virtio_msg.c b/drivers/virtio/virtio_msg.c index 207fa1f18bf9..8508a90551a6 100644 --- a/drivers/virtio/virtio_msg.c +++ b/drivers/virtio/virtio_msg.c @@ -170,8 +170,7 @@ static void virtio_msg_get(struct virtio_device *vdev, unsigned int offset, struct virtio_msg_device *vmdev = to_virtio_msg_device(vdev); struct get_config *req_payload = virtio_msg_payload(vmdev->request); struct get_config_resp *res_payload = virtio_msg_payload(vmdev->response); - - BUG_ON(len > 8); + u32 i = 0, max;
if (offset + len > vmdev->config_size) { dev_err(&vmdev->vdev.dev, @@ -180,16 +179,25 @@ static void virtio_msg_get(struct virtio_device *vdev, unsigned int offset, return; }
+ /* Max buffer size available in the response */ + max = vmdev->msg_size - sizeof(*vmdev->response) - sizeof(*res_payload); + transport_msg_prepare(vmdev, VIRTIO_MSG_GET_CONFIG, sizeof(*req_payload)); - req_payload->offset = cpu_to_le32(offset); - req_payload->size = cpu_to_le32(len);
- if (virtio_msg_xfer(vmdev)) - return; + while (i != len) { + u32 size = min(max, len - i); + + req_payload->offset = cpu_to_le32(offset + i); + req_payload->size = cpu_to_le32(size); + + if (virtio_msg_xfer(vmdev)) + return; + + /* Buffer holds the data in little endian */ + memcpy(buf + i, res_payload->config, size); + i += size; + }
- /* Buffer holds the data in little endian */ - if (buf) - memcpy(buf, res_payload->config, len); vmdev->generation_count = le32_to_cpu(res_payload->generation); }