On Fri, Jul 10, 2020 at 08:45:54AM +0200, Magnus Karlsson wrote: > In the skb Tx path, transmission of a packet is performed with > dev_direct_xmit(). When QUEUE_STATE_FROZEN is set in the transmit > routines, it returns NETDEV_TX_BUSY signifying that it was not > possible to send the packet now, please try later. Unfortunately, the > xsk transmit code discarded the packet, missed to free the skb, and > returned EBUSY to the application. Fix this memory leak and > unnecessary packet loss, by not discarding the packet in the Tx ring, > freeing the allocated skb, and return EAGAIN. As EAGAIN is returned to the > application, it can then retry the send operation and the packet will > finally be sent as we will likely not be in the QUEUE_STATE_FROZEN > state anymore. So EAGAIN tells the application that the packet was not > discarded from the Tx ring and that it needs to call send() > again. EBUSY, on the other hand, signifies that the packet was not > sent and discarded from the Tx ring. The application needs to put the > packet on the Tx ring again if it wants it to be sent. > > Fixes: 35fcde7f8deb ("xsk: support for Tx") > Signed-off-by: Magnus Karlsson <magnus.karls...@intel.com> > Reported-by: Arkadiusz Zema <a.z...@falconvsystems.com> > Suggested-by: Arkadiusz Zema <a.z...@falconvsystems.com>
Acked-by: Jonathan Lemon <jonathan.le...@gmail.com> -- Jonathan