On 2 March 2017 at 02:43, Mike Belopuhov <m...@belopuhov.com> wrote: > On 2 March 2017 at 01:35, David Gwynne <da...@gwynne.id.au> wrote: >> On Wed, Mar 01, 2017 at 10:03:42PM +0100, Mike Belopuhov wrote: >>> Priority queueing is the default policy in OpenBSD and it >>> distributes outgoing packets in 8 lists by priority (0-7) with >>> an aggregate queue depth set by the interface: pseudo interfaces >>> use IFQ_MAXLEN defined equal to 256, hardware device drivers >>> normally size it by their TX ring minus 1 (therefore 127, 255, >>> 511 are common values). >>> >>> Unless a producer generating packets with altered priority is >>> used (such as "set prio" pf directive, PPPoE management frames, >>> ping -T lowdelay, VLAN priority, and so on) all outgoing traffic >>> is sent with a priority of 3 hitting the same list. >>> >>> The drop policy used here is called tail drop because it drops >>> the packet that we're trying to enqueue when there's no more >>> space left on the queue. The obvious downside is that if our >>> queue is full of packets representing low priority traffic, >>> trying to enqueue a packet with a higher priority will still >>> result in a drop. In my opinion, this defeats the purpose of >>> priority queueing. >>> >>> The diff below changes the policy to a head drop from the queue >>> with the lowest priority than the packet we're trying to >>> enqueue. If there's no such queue (e.g. the default case where >>> all traffic has priority of 3) only then the packet is dropped. >>> This ensures that high priority traffic will almost always find >>> the place on the queue and low priority bulk traffic gets a >>> better chance at regulating its throughput. By performing a >>> head drop instead a tail drop we also drop the oldest packet on >>> the queue. This technique is akin to Active Queue Management >>> algorithms. >> >> i agree we should do this. >> > > good! > >> >> the current code has been very careful not to free an mbuf while >> holding the ifq mutex. i would prefer to keep it that way. >> > > i agree. > >> the least worst way to do that would be to return the mbuf to be >> dropped for ifq_enqueue to free. this is complicated because of the >> semantics that ifq_enqueue_try provides, but nothing uses that so >> we can get rid of it to support this. >> >> the diff below makes the ifq enq op return an mbuf to be freed, and >> gets rid of ifq_enqueue_try. that in turn should let you return >> this mbuf here rather than free it directly. >> > > makes sense, but could you please adjust this so that we can return > an mbuf list of rejects. i'm working on a diff that must be able to do > multiple drops at a time.
no, actually dropping one mbuf on enqueue still holds, but i'll need to drop several on dequeue. not sure yet how to properly do that outside of an ifq lock though.