svn commit: r247871 - head/usr.sbin/bhyve
Peter Grehan
grehan at FreeBSD.org
Wed Mar 6 07:28:21 UTC 2013
Author: grehan
Date: Wed Mar 6 07:28:20 2013
New Revision: 247871
URL: http://svnweb.freebsd.org/changeset/base/247871
Log:
Simplify virtio ring num-available calculation.
Submitted by: Chris Torek, torek at torek dot net
Modified:
head/usr.sbin/bhyve/pci_virtio_block.c
head/usr.sbin/bhyve/pci_virtio_net.c
Modified: head/usr.sbin/bhyve/pci_virtio_block.c
==============================================================================
--- head/usr.sbin/bhyve/pci_virtio_block.c Wed Mar 6 07:17:53 2013 (r247870)
+++ head/usr.sbin/bhyve/pci_virtio_block.c Wed Mar 6 07:28:20 2013 (r247871)
@@ -164,14 +164,19 @@ pci_vtblk_iosize(struct pci_devinst *pi)
static int
hq_num_avail(struct vring_hqueue *hq)
{
- int ndesc;
+ uint16_t ndesc;
- if (*hq->hq_avail_idx >= hq->hq_cur_aidx)
- ndesc = *hq->hq_avail_idx - hq->hq_cur_aidx;
- else
- ndesc = UINT16_MAX - hq->hq_cur_aidx + *hq->hq_avail_idx + 1;
+ /*
+ * We're just computing (a-b) in GF(216).
+ *
+ * The only glitch here is that in standard C,
+ * uint16_t promotes to (signed) int when int has
+ * more than 16 bits (pretty much always now), so
+ * we have to force it back to unsigned.
+ */
+ ndesc = (unsigned)*hq->hq_avail_idx - (unsigned)hq->hq_cur_aidx;
- assert(ndesc >= 0 && ndesc <= hq->hq_size);
+ assert(ndesc <= hq->hq_size);
return (ndesc);
}
Modified: head/usr.sbin/bhyve/pci_virtio_net.c
==============================================================================
--- head/usr.sbin/bhyve/pci_virtio_net.c Wed Mar 6 07:17:53 2013 (r247870)
+++ head/usr.sbin/bhyve/pci_virtio_net.c Wed Mar 6 07:28:20 2013 (r247871)
@@ -172,12 +172,17 @@ hq_num_avail(struct vring_hqueue *hq)
{
int ndesc;
- if (*hq->hq_avail_idx >= hq->hq_cur_aidx)
- ndesc = *hq->hq_avail_idx - hq->hq_cur_aidx;
- else
- ndesc = UINT16_MAX - hq->hq_cur_aidx + *hq->hq_avail_idx + 1;
+ /*
+ * We're just computing (a-b) in GF(216).
+ *
+ * The only glitch here is that in standard C,
+ * uint16_t promotes to (signed) int when int has
+ * more than 16 bits (pretty much always now), so
+ * we have to force it back to unsigned.
+ */
+ ndesc = (unsigned)*hq->hq_avail_idx - (unsigned)hq->hq_cur_aidx;
- assert(ndesc >= 0 && ndesc <= hq->hq_size);
+ assert(ndesc <= hq->hq_size);
return (ndesc);
}
More information about the svn-src-head
mailing list