In some cases the flow of data may not be along a simple I/O channel. This is the case for multicast traffic which is being received by multiple domains on the same machine. For such cases the Rbuf memory is mapped readable by all the recipients using TMM I/O channels to each recipient. The device driver places the records in the control areas of all the domains which should receive the packet and reference counts the Rbuf areas so that the memory is not reused until all of the receivers have indicated they are finished with it via their control areas.
Apart from the lack of copying, both domains benefit from the buffering memory provided by the other compared with a scheme using copying.
A problem potentially arises if one of the receivers of such multicast data is slower at processing it than the other and falls behind. Ideally it would not be able to have an adverse affect on the other receiver. This can be done by limiting the amount of memory in use by each I/O channel. When the limit is reached, the iorecs are not placed in that channel and the reference count used is one less. The buffers are hence selectively dropped from channels where the receiver is unable to keep up. An appropriate margin may be configured based on the fan-out of the connection.
One approximate but very efficient way of implementing this margin is to limit the size of the circular control buffer. Iorecs are then dropped automatically when they cannot be inserted in the buffer in a non-blocking manner. Even if a more accurate implementation of the margin is required, the Rbuf scheme ensures that the cost is only paid for I/O channels where it is required, rather than in general.
Table ii: Comparison of Buffering Properties