Re: [PATCH] Implementation of the sendgroup() system call

From: Avi Kivity
Date: Mon May 04 2009 - 03:31:44 EST


Andi Kleen wrote:
Elad Lahav <elahav@xxxxxxxxxxxx> writes:

The attached patch contains an implementation of sendgroup(), a system
call that allows a UDP packet to be transmitted efficiently to
multiple recipients. Use cases for this system call include
live-streaming and multi-player online games.
The basic idea is that the caller maintains a group - a list of IP
addresses and UDP ports - and calls sendgroup() with the group list
and a common payload. Optionally, the call allows for per-recipient
data to be prepended or appended to the shared block. The data is
copied once in the kernel into an allocated page, and the
per-recipient socket buffers point to that page. Savings come from
avoiding both the multiple calls and the multiple copies of the data
required with regular socket operations.

My guess it's more the copies than the calls? It sounds like
you want sendfile() for UDP. I think that would be a cleaner solution
than such a specific hack for your application. It would
have the advantage of saving the first copy too and be truly zero copy on capable NICs.

An aio udp send could accomplish both multiple packets per call, and zero-copy, without adding new syscalls. You could send the same packet to multiple recipients, or multiple packets to the same recipicent, or combinations thereof.

Or perhaps simple send to a local multicast group and let
some netfilter module turn that into regular UDP.

Sounds hacky and rooty.

--
Do not meddle in the internals of kernels, for they are subtle and quick to panic.

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/