提交 6929cf11 编写于 作者: A Anthony Liguori

Merge remote-tracking branch 'mst/tags/for_anthony' into staging

* mst/tags/for_anthony:
  virtio-serial-bus: let chardev know the exact number of bytes requested
  virtio: Introduce virtqueue_get_avail_bytes()
  virtio: use unsigned int for counting bytes in vq
  iov: add const annotation
  virtio-net: fix used len for tx
  virtio: don't mark unaccessed memory as dirty
...@@ -690,7 +690,7 @@ static void virtio_net_tx_complete(NetClientState *nc, ssize_t len) ...@@ -690,7 +690,7 @@ static void virtio_net_tx_complete(NetClientState *nc, ssize_t len)
{ {
VirtIONet *n = DO_UPCAST(NICState, nc, nc)->opaque; VirtIONet *n = DO_UPCAST(NICState, nc, nc)->opaque;
virtqueue_push(n->tx_vq, &n->async_tx.elem, n->async_tx.len); virtqueue_push(n->tx_vq, &n->async_tx.elem, 0);
virtio_notify(&n->vdev, n->tx_vq); virtio_notify(&n->vdev, n->tx_vq);
n->async_tx.elem.out_num = n->async_tx.len = 0; n->async_tx.elem.out_num = n->async_tx.len = 0;
...@@ -754,7 +754,7 @@ static int32_t virtio_net_flush_tx(VirtIONet *n, VirtQueue *vq) ...@@ -754,7 +754,7 @@ static int32_t virtio_net_flush_tx(VirtIONet *n, VirtQueue *vq)
len += ret; len += ret;
virtqueue_push(vq, &elem, len); virtqueue_push(vq, &elem, 0);
virtio_notify(&n->vdev, vq); virtio_notify(&n->vdev, vq);
if (++num_packets >= n->tx_burst) { if (++num_packets >= n->tx_burst) {
......
...@@ -287,6 +287,7 @@ ssize_t virtio_serial_write(VirtIOSerialPort *port, const uint8_t *buf, ...@@ -287,6 +287,7 @@ ssize_t virtio_serial_write(VirtIOSerialPort *port, const uint8_t *buf,
size_t virtio_serial_guest_ready(VirtIOSerialPort *port) size_t virtio_serial_guest_ready(VirtIOSerialPort *port)
{ {
VirtQueue *vq = port->ivq; VirtQueue *vq = port->ivq;
unsigned int bytes;
if (!virtio_queue_ready(vq) || if (!virtio_queue_ready(vq) ||
!(port->vser->vdev.status & VIRTIO_CONFIG_S_DRIVER_OK) || !(port->vser->vdev.status & VIRTIO_CONFIG_S_DRIVER_OK) ||
...@@ -296,14 +297,8 @@ size_t virtio_serial_guest_ready(VirtIOSerialPort *port) ...@@ -296,14 +297,8 @@ size_t virtio_serial_guest_ready(VirtIOSerialPort *port)
if (use_multiport(port->vser) && !port->guest_connected) { if (use_multiport(port->vser) && !port->guest_connected) {
return 0; return 0;
} }
virtqueue_get_avail_bytes(vq, &bytes, NULL);
if (virtqueue_avail_bytes(vq, 4096, 0)) { return bytes;
return 4096;
}
if (virtqueue_avail_bytes(vq, 1, 0)) {
return 1;
}
return 0;
} }
static void flush_queued_data_bh(void *opaque) static void flush_queued_data_bh(void *opaque)
......
...@@ -241,7 +241,7 @@ void virtqueue_fill(VirtQueue *vq, const VirtQueueElement *elem, ...@@ -241,7 +241,7 @@ void virtqueue_fill(VirtQueue *vq, const VirtQueueElement *elem,
elem->in_sg[i].iov_len, elem->in_sg[i].iov_len,
1, size); 1, size);
offset += elem->in_sg[i].iov_len; offset += size;
} }
for (i = 0; i < elem->out_num; i++) for (i = 0; i < elem->out_num; i++)
...@@ -335,10 +335,11 @@ static unsigned virtqueue_next_desc(target_phys_addr_t desc_pa, ...@@ -335,10 +335,11 @@ static unsigned virtqueue_next_desc(target_phys_addr_t desc_pa,
return next; return next;
} }
int virtqueue_avail_bytes(VirtQueue *vq, int in_bytes, int out_bytes) void virtqueue_get_avail_bytes(VirtQueue *vq, unsigned int *in_bytes,
unsigned int *out_bytes)
{ {
unsigned int idx; unsigned int idx;
int total_bufs, in_total, out_total; unsigned int total_bufs, in_total, out_total;
idx = vq->last_avail_idx; idx = vq->last_avail_idx;
...@@ -380,13 +381,9 @@ int virtqueue_avail_bytes(VirtQueue *vq, int in_bytes, int out_bytes) ...@@ -380,13 +381,9 @@ int virtqueue_avail_bytes(VirtQueue *vq, int in_bytes, int out_bytes)
} }
if (vring_desc_flags(desc_pa, i) & VRING_DESC_F_WRITE) { if (vring_desc_flags(desc_pa, i) & VRING_DESC_F_WRITE) {
if (in_bytes > 0 && in_total += vring_desc_len(desc_pa, i);
(in_total += vring_desc_len(desc_pa, i)) >= in_bytes)
return 1;
} else { } else {
if (out_bytes > 0 && out_total += vring_desc_len(desc_pa, i);
(out_total += vring_desc_len(desc_pa, i)) >= out_bytes)
return 1;
} }
} while ((i = virtqueue_next_desc(desc_pa, i, max)) != max); } while ((i = virtqueue_next_desc(desc_pa, i, max)) != max);
...@@ -395,7 +392,24 @@ int virtqueue_avail_bytes(VirtQueue *vq, int in_bytes, int out_bytes) ...@@ -395,7 +392,24 @@ int virtqueue_avail_bytes(VirtQueue *vq, int in_bytes, int out_bytes)
else else
total_bufs++; total_bufs++;
} }
if (in_bytes) {
*in_bytes = in_total;
}
if (out_bytes) {
*out_bytes = out_total;
}
}
int virtqueue_avail_bytes(VirtQueue *vq, unsigned int in_bytes,
unsigned int out_bytes)
{
unsigned int in_total, out_total;
virtqueue_get_avail_bytes(vq, &in_total, &out_total);
if ((in_bytes && in_bytes < in_total)
|| (out_bytes && out_bytes < out_total)) {
return 1;
}
return 0; return 0;
} }
......
...@@ -147,7 +147,10 @@ void virtqueue_fill(VirtQueue *vq, const VirtQueueElement *elem, ...@@ -147,7 +147,10 @@ void virtqueue_fill(VirtQueue *vq, const VirtQueueElement *elem,
void virtqueue_map_sg(struct iovec *sg, target_phys_addr_t *addr, void virtqueue_map_sg(struct iovec *sg, target_phys_addr_t *addr,
size_t num_sg, int is_write); size_t num_sg, int is_write);
int virtqueue_pop(VirtQueue *vq, VirtQueueElement *elem); int virtqueue_pop(VirtQueue *vq, VirtQueueElement *elem);
int virtqueue_avail_bytes(VirtQueue *vq, int in_bytes, int out_bytes); int virtqueue_avail_bytes(VirtQueue *vq, unsigned int in_bytes,
unsigned int out_bytes);
void virtqueue_get_avail_bytes(VirtQueue *vq, unsigned int *in_bytes,
unsigned int *out_bytes);
void virtio_notify(VirtIODevice *vdev, VirtQueue *vq); void virtio_notify(VirtIODevice *vdev, VirtQueue *vq);
......
...@@ -26,7 +26,7 @@ ...@@ -26,7 +26,7 @@
# include <sys/socket.h> # include <sys/socket.h>
#endif #endif
size_t iov_from_buf(struct iovec *iov, unsigned int iov_cnt, size_t iov_from_buf(const struct iovec *iov, unsigned int iov_cnt,
size_t offset, const void *buf, size_t bytes) size_t offset, const void *buf, size_t bytes)
{ {
size_t done; size_t done;
......
...@@ -36,7 +36,7 @@ size_t iov_size(const struct iovec *iov, const unsigned int iov_cnt); ...@@ -36,7 +36,7 @@ size_t iov_size(const struct iovec *iov, const unsigned int iov_cnt);
* such "large" value is -1 (sinice size_t is unsigned), * such "large" value is -1 (sinice size_t is unsigned),
* so specifying `-1' as `bytes' means 'up to the end of iovec'. * so specifying `-1' as `bytes' means 'up to the end of iovec'.
*/ */
size_t iov_from_buf(struct iovec *iov, unsigned int iov_cnt, size_t iov_from_buf(const struct iovec *iov, unsigned int iov_cnt,
size_t offset, const void *buf, size_t bytes); size_t offset, const void *buf, size_t bytes);
size_t iov_to_buf(const struct iovec *iov, const unsigned int iov_cnt, size_t iov_to_buf(const struct iovec *iov, const unsigned int iov_cnt,
size_t offset, void *buf, size_t bytes); size_t offset, void *buf, size_t bytes);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册