|
@@ -135,9 +135,6 @@ struct device {
|
|
|
/* Is it operational */
|
|
|
bool running;
|
|
|
|
|
|
- /* Does Guest want an intrrupt on empty? */
|
|
|
- bool irq_on_empty;
|
|
|
-
|
|
|
/* Device-specific data. */
|
|
|
void *priv;
|
|
|
};
|
|
@@ -637,10 +634,7 @@ static void trigger_irq(struct virtqueue *vq)
|
|
|
|
|
|
/* If they don't want an interrupt, don't send one... */
|
|
|
if (vq->vring.avail->flags & VRING_AVAIL_F_NO_INTERRUPT) {
|
|
|
- /* ... unless they've asked us to force one on empty. */
|
|
|
- if (!vq->dev->irq_on_empty
|
|
|
- || lg_last_avail(vq) != vq->vring.avail->idx)
|
|
|
- return;
|
|
|
+ return;
|
|
|
}
|
|
|
|
|
|
/* Send the Guest an interrupt tell them we used something up. */
|
|
@@ -1057,15 +1051,6 @@ static void create_thread(struct virtqueue *vq)
|
|
|
close(vq->eventfd);
|
|
|
}
|
|
|
|
|
|
-static bool accepted_feature(struct device *dev, unsigned int bit)
|
|
|
-{
|
|
|
- const u8 *features = get_feature_bits(dev) + dev->feature_len;
|
|
|
-
|
|
|
- if (dev->feature_len < bit / CHAR_BIT)
|
|
|
- return false;
|
|
|
- return features[bit / CHAR_BIT] & (1 << (bit % CHAR_BIT));
|
|
|
-}
|
|
|
-
|
|
|
static void start_device(struct device *dev)
|
|
|
{
|
|
|
unsigned int i;
|
|
@@ -1079,8 +1064,6 @@ static void start_device(struct device *dev)
|
|
|
verbose(" %02x", get_feature_bits(dev)
|
|
|
[dev->feature_len+i]);
|
|
|
|
|
|
- dev->irq_on_empty = accepted_feature(dev, VIRTIO_F_NOTIFY_ON_EMPTY);
|
|
|
-
|
|
|
for (vq = dev->vq; vq; vq = vq->next) {
|
|
|
if (vq->service)
|
|
|
create_thread(vq);
|
|
@@ -1564,7 +1547,6 @@ static void setup_tun_net(char *arg)
|
|
|
/* Set up the tun device. */
|
|
|
configure_device(ipfd, tapif, ip);
|
|
|
|
|
|
- add_feature(dev, VIRTIO_F_NOTIFY_ON_EMPTY);
|
|
|
/* Expect Guest to handle everything except UFO */
|
|
|
add_feature(dev, VIRTIO_NET_F_CSUM);
|
|
|
add_feature(dev, VIRTIO_NET_F_GUEST_CSUM);
|