On Thu, 3 Feb 2011, Julian Elischer wrote:

On 2/3/11 10:08 AM, David Somayajulu wrote:
Hi All, While sending the Received Ethernet Frames (non - LRO case) to the FreeBSD Network Stack via (struct ifnet *)->if_input((struct ifnet *), (struct *mbuf));

Is it possible to send multiple Ethernet Frames in a single invocation of the above callback function?

In other words should (struct *mbuf) above always correspond to a single Ethernet Frame? I am not sure if I missed something, but I gathered from a quick perusal of ether_input() in net/if_ethersubr.c, that only ONE Ethernet Frame may be sent per callback.

yes only one. the linkages you see in the mbuf definition are for when you are putting it into some queue (interface, socket, reassembly, etc).

I had never considered passing a set of packets, but after my initial scoffing thoughts I realized that it would actually be a very interesting thought experiment to see if the ability to do that would be advantageous in any way. I tmay be a way to reduce some sorts of overhead if using interrupt mitigation.

This was discussed quite a lot at the network-related devsummit sessions a few years ago. One idea that was bandied about was introducing an mbuf vector data structure (I'm sure at least two floated around in Perforce at some point, and another ended up built into the Chelsio driver I think). The idea being that indirection through queues as with mbufs is quite inefficient when you want to pass them around in sets when the set may not be in the cache. Instead, vectors of mbuf pointers would be passed around, each entry being a chain representing a packet.

I think one reason that idea never really went anywhere was that the use cases were fairly artificial for anything other than link layer bridging between exactly two interfaces or systems with exactly one high-volume TCP connection. In most scenarios, packets may come in small bursts going to the same destination (etc), as is exploited by LRO, but not in a way that you're able to maintain passing around in sets that remain viable as you get above the link layer. I seem to recall benchmarking one of the prototypes and finding that it increased the working set on memory noticeably since it effectively meant much more queueing was taking place, whereas our current direct dispatch model helped latency a great deal. It could be that with more deferred dispatch in a parallel setting, it helps, but you'd definitely want to take a measurement-oriented approach in looking at it any further.

(For bridged ethernet filtering devices that act as a "bump in the wire", it might well prove a reasonable performance optimisation. I'm not sure if the cxgb mvec implementation would be appropriate to this task or not.)

Robert
_______________________________________________
freebsd-current@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-current
To unsubscribe, send any mail to "freebsd-current-unsubscr...@freebsd.org"

Reply via email to