[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH v3 2/2] rtl8139: correctly track full receive bu
Re: [Qemu-devel] [PATCH v3 2/2] rtl8139: correctly track full receive buffer in standard mode
Tue, 01 Sep 2015 11:15:36 +0800
Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.8.0
On 08/31/2015 10:24 PM, Vlad Yasevich wrote:
> On 08/31/2015 05:59 AM, Jason Wang wrote:
>> On 08/28/2015 10:06 PM, Vladislav Yasevich wrote:
>>> In standard operation mode, when the receive ring buffer
>>> is full, the buffer actually appears empty to the driver since
>>> the RxBufAddr (the location we wirte new data to) and RxBufPtr
>>> (the location guest would stat reading from) are the same.
>>> As a result, the call to rtl8139_RxBufferEmpty ends up
>>> returning true indicating that the receive buffer is empty.
>>> This would result in the next packet overwriting the recevie buffer
>>> again and stalling receive operations.
>>> This patch tracks the number of unread bytes in the rxbuffer
>>> using an unused C+ register. On every read and write, the
>>> number is adjsted and the special case of a full buffer is also
>>> The C+ register trick is used to simplify migration and not require
>>> a new machine type. This register is not used in regular mode
>>> and C+ mode doesn't have the same issue.
>>> Signed-off-by: Vladislav Yasevich <address@hidden>
>>> hw/net/rtl8139.c | 45 +++++++++++++++++++++++++++++++++++++++++----
>>> 1 file changed, 41 insertions(+), 4 deletions(-)
>> I'm not sure this can happen. For example, looks like the following
>> check in rtl8139_do_receive():
>> if (avail != 0 && size + 8 >= avail)
>> can guarantee there's no overwriting?
> The problem is the calculation of avail. When the buffer is full,
> avail will be the the size of the receive buffer. So the test
> above will be false because the driver thinks there is actually
> enough room.
> With his patch, 'avail' will be calculated to 0.
If believe the condition size + 8 >= avail can guarantee that the buffer
won't be full (if we allow size + 8 == avail, buffer will be full)? So
avail == 0 means the buffer is empty. Or is there anything I miss?