diff --git a/overlay/tun.go b/overlay/tun.go index fdf8a55..e5b1fd7 100644 --- a/overlay/tun.go +++ b/overlay/tun.go @@ -8,7 +8,6 @@ import ( "github.com/sirupsen/logrus" "github.com/slackhq/nebula/config" - "github.com/slackhq/nebula/overlay/virtqueue" "github.com/slackhq/nebula/packet" "github.com/slackhq/nebula/util" ) @@ -19,7 +18,6 @@ type TunDev interface { io.WriteCloser ReadMany([]*packet.VirtIOPacket) (int, error) WriteMany([][]byte) (int, error) - GetQueues() []*virtqueue.SplitQueue } // TODO: We may be able to remove routines diff --git a/overlay/tun_linux.go b/overlay/tun_linux.go index ad6c4f8..1283f23 100644 --- a/overlay/tun_linux.go +++ b/overlay/tun_linux.go @@ -18,7 +18,6 @@ import ( "github.com/sirupsen/logrus" "github.com/slackhq/nebula/config" "github.com/slackhq/nebula/overlay/vhostnet" - "github.com/slackhq/nebula/overlay/virtqueue" "github.com/slackhq/nebula/packet" "github.com/slackhq/nebula/routing" "github.com/slackhq/nebula/util" @@ -52,10 +51,6 @@ func (t *tun) Networks() []netip.Prefix { return t.vpnNetworks } -func (t *tun) GetQueues() []*virtqueue.SplitQueue { - return []*virtqueue.SplitQueue{t.vdev.ReceiveQueue, t.vdev.TransmitQueue} -} - type ifReq struct { Name [16]byte Flags uint16 diff --git a/overlay/vhostnet/device.go b/overlay/vhostnet/device.go index 8a9489a..6dda434 100644 --- a/overlay/vhostnet/device.go +++ b/overlay/vhostnet/device.go @@ -252,7 +252,7 @@ func (dev *Device) TransmitPackets(vnethdr virtio.NetHdr, packets [][]byte) erro //todo surely there's something better to do here for { - txedChains, err := dev.TransmitQueue.BlockAndGetHeads(context.TODO()) + txedChains, err := dev.TransmitQueue.BlockAndGetHeadsCapped(context.TODO(), len(chainIndexes)) if err != nil { return err } else if len(txedChains) == 0 { @@ -358,8 +358,6 @@ func (dev *Device) ReceivePackets(out []*packet.VirtIOPacket) (int, error) { chainsIdx := 0 for numPackets = 0; chainsIdx < len(chains); numPackets++ { if numPackets >= len(out) { - //dev.extraRx = chains[chainsIdx:] - //return numPackets, nil return numPackets, fmt.Errorf("dropping %d packets, no room", len(chains)-numPackets) } numChains, err := dev.processChains(out[numPackets], chains[chainsIdx:]) @@ -370,15 +368,9 @@ func (dev *Device) ReceivePackets(out []*packet.VirtIOPacket) (int, error) { } // Now that we have copied all buffers, we can recycle the used descriptor chains - if err := dev.ReceiveQueue.RecycleDescriptorChains(chains); err != nil { + if err = dev.ReceiveQueue.RecycleDescriptorChains(chains); err != nil { return 0, err } - //if we don't churn chains, maybe we don't need this? - // It's advised to always keep the rx queue fully populated with available buffers which the device can write new packets into. - //if err := dev.refillReceiveQueue(); err != nil { - // return 0, virtio.NetHdr{}, fmt.Errorf("refill receive queue: %w", err) - //} - return numPackets, nil } diff --git a/overlay/virtqueue/split_virtqueue.go b/overlay/virtqueue/split_virtqueue.go index 6bb9d10..0e79705 100644 --- a/overlay/virtqueue/split_virtqueue.go +++ b/overlay/virtqueue/split_virtqueue.go @@ -215,23 +215,24 @@ func (sq *SplitQueue) BlockAndGetHeadsCapped(ctx context.Context, maxToTake int) if sq.more > 0 { stillNeedToTake, out := sq.usedRing.take(maxToTake) sq.more = stillNeedToTake - if stillNeedToTake == 0 { - _ = sq.epoll.Clear() //??? - } - return out, nil } + //look inside the fridge + stillNeedToTake, out := sq.usedRing.take(maxToTake) + if len(out) > 0 { + sq.more = stillNeedToTake + return out, nil + } + //fridge is empty I guess // Wait for a signal from the device. if n, err = sq.epoll.Block(); err != nil { return nil, fmt.Errorf("wait: %w", err) } if n > 0 { - stillNeedToTake, out := sq.usedRing.take(maxToTake) + _ = sq.epoll.Clear() //??? + stillNeedToTake, out = sq.usedRing.take(maxToTake) sq.more = stillNeedToTake - if stillNeedToTake == 0 { - _ = sq.epoll.Clear() //??? - } return out, nil } }