Subject: Re: sendfile() broken with 2.6.26 + Apache 2 ?

From: Eric Dumazet <[email-masked]>
Date: Wed, 16 Jul 2008 11:08:04 +0200

Ian Jeffray a écrit :
> Hi Eric,
> 
> Thanks for directing me to a better list.
> 
> Further responses below:
> 
> Eric Dumazet wrote:
>> CC to netdev where this report might find better answers
>>
>> Ian Jeffray a écrit :
>>> All,
>>>
>>> I moved from kernel 2.6.25.4 to 2.6.26 yesterday and observed that
>>> large files sent via Apache2 are partially corrupt.
>>>
>>> This appears to be linked to sendfile() -- disabling the use of
>>> sendfile in the apache config (EnableSendfile Off) allows it to
>>> function as normal.
>>>
>>> My system is a simple Core2Duo running Debian lenny/sid; nothing
>>> special, and I have never observed problems like this before.
>>>
>>> The problem feels certainly related to sendfile() since the data
>>> reads correctly from disc in other programs, and via CIFS etc.
>>>
>>> The corruption happens part-way in to the file... I've no exact
>>> figure but it would seem like maybe 32KB -- I'm seeing broken
>>> PNGs served from Apache, where the top few dozen lines decode
>>> correctly, and the rest is garbage.
>>>
>>> I've made basically no configuration changes between 2.6.25.4 and
>>> 2.6.26 and have explicitly tried both enabling and disabling the
>>> new PAT support to no effect.
>>>
>>> This is completely repeatable and reproducible.
>>>
>>> Is anyone else seeing this broken behaviour?
>>>
>>
>>
>> What kind of network adapter are you using ? (lspci | grep -i ether)
> 
> 02:00.0 Ethernet controller: Attansic Technology Corp. L1 Gigabit 
> Ethernet Adapter (rev b0)
> 
> 
>> If you disable TCP segmentation offload on this NIC (ethtool -K eth0 
>> tso off) , is this problem still present ?
> 
> Wow.  That 'solves' the problem!  Great.
> 
> Does this therefore point to an attansic driver issue?
>

Yes, maybe related to commit 9d90fb1ac9d97da86e24d9ea947bf2a2f333829a 

In this patch, Jay Cliburn enabled TSO by default for atl1 driver.

This might be a driver problem, or a generic sendfile() problem, I dont know...