linux/drivers
David Daney a620c16326 Staging: octeon-ethernet: Fix race freeing transmit buffers.
The existing code had the following race:

Thread-1                       Thread-2

inc/read in_use
                               inc/read in_use
inc tx_free_list[qos].len
                               inc tx_free_list[qos].len

The actual in_use value was incremented twice, but thread-1 is going
to free memory based on its stale value, and will free one too many
times.  The result is that memory is freed back to the kernel while
its packet is still in the transmit buffer.  If the memory is
overwritten before it is transmitted, the hardware will put a valid
checksum on it and send it out (just like it does with good packets).
If by chance the TCP flags are clobbered but not the addresses or
ports, the result can be a broken TCP stream.

The fix is to track the number of freed packets in a single location
(a Fetch-and-Add Unit register).  That way it can never get out of sync
with itself.

We try to free up to MAX_SKB_TO_FREE (currently 10) buffers at a time.
If fewer are available we adjust the free count with the difference.
The action of claiming buffers to free is atomic so two threads cannot
claim the same buffers.

Signed-off-by: David Daney <ddaney@caviumnetworks.com>
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
2009-06-24 18:34:41 +01:00
..
accessibility
acpi Merge branch 'linux-next' of git://git.kernel.org/pub/scm/linux/kernel/git/jbarnes/pci-2.6 2009-06-22 11:59:51 -07:00
amba
ata libata: don't set IORDY for reset 2009-06-23 01:54:30 -04:00
atm
auxdisplay
base Merge branch 'akpm' 2009-06-16 19:50:13 -07:00
block hd: stop defining MAJOR_NR 2009-06-18 09:56:20 +02:00
bluetooth
cdrom
char tty: n_hdlc add buffer flushing 2009-06-22 11:32:24 -07:00
clocksource Merge branches 'sh/pci-express-integration', 'sh/rsk-updates', 'sh/platform-updates' and 'sh/perf_counter' 2009-06-17 16:37:26 +09:00
connector
cpufreq
cpuidle
crypto crypto: padlock-aes - work around Nano CPU errata in CBC mode 2009-06-18 19:31:09 +08:00
dca
dio
dma DMA: txx9dmac: use dma_unmap_single if DMA_COMPL_{SRC,DEST}_UNMAP_SINGLE set 2009-06-24 18:34:40 +01:00
edac edac: Kconfig: fix the meaning of EDAC abbreviation 2009-06-18 13:03:57 -07:00
eisa Merge branch 'akpm' 2009-06-16 19:50:13 -07:00
firewire Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/ieee1394/linux1394-2.6 2009-06-22 21:29:52 -07:00
firmware Pull for-2.6.31 into release 2009-06-17 09:35:24 -07:00
gpio gpio: driver for PrimeCell PL061 GPIO controller 2009-06-19 16:46:03 -07:00
gpu drm/i915: enable GEM on PAE. 2009-06-19 10:29:20 +10:00
hid
hwmon Merge branch 'akpm' 2009-06-16 19:50:13 -07:00
i2c i2c: Fix stuck transaction on cpm-i2c driver 2009-06-22 01:43:32 +01:00
ide ide cmd64x: Remove serialize setting. 2009-06-21 22:48:03 -07:00
idle
ieee1394 Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/ieee1394/linux1394-2.6 2009-06-22 21:29:52 -07:00
ieee802154
infiniband Merge branches 'ehca', 'misc', 'mlx4', 'mthca' and 'nes' into for-linus 2009-06-23 10:38:47 -07:00
input Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input 2009-06-20 10:17:02 -07:00
isdn net: fix network drivers ndo_start_xmit() return values 2009-06-17 04:31:16 -07:00
leds
lguest
macintosh Merge branch 'i2c-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jdelvare/staging 2009-06-16 11:29:17 -07:00
mca
md Merge branch 'for-linus' of git://git.kernel.dk/linux-2.6-block 2009-06-19 17:43:04 -07:00
media V4L/DVB (12131): BUGFIX: An incorrect Carrier Recovery Loop optimization table was being 2009-06-23 03:29:57 -03:00
memstick
message fusion: mptsas, fix lock imbalance 2009-06-22 08:54:14 -05:00
mfd [WATCHDOG] twl4030 watchdog driver 2009-06-20 18:39:43 +00:00
misc gru: copyright fixes 2009-06-18 13:04:04 -07:00
mmc sdhci: remove needless double parenthesis 2009-06-21 21:01:00 +02:00
mtd Merge git://git.infradead.org/mtd-2.6 2009-06-22 16:56:22 -07:00
net Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband 2009-06-23 11:36:01 -07:00
nubus
of
oprofile
parisc
parport parport_pc: set properly the dma_mask for parport_pc device 2009-06-22 11:29:00 -07:00
pci Merge git://git.infradead.org/~dwmw2/iommu-2.6.31 2009-06-22 21:38:22 -07:00
pcmcia Merge branch 'akpm' 2009-06-16 19:50:13 -07:00
platform acer-wmi: fix rfkill conversion 2009-06-19 11:50:18 -04:00
pnp
power
pps LinuxPPS: core support 2009-06-18 13:04:04 -07:00
ps3
rapidio
regulator
rtc rtc: make rtc_update_irq callable with irqs enabled 2009-06-19 16:46:05 -07:00
s390 [S390] dasd: fix refcounting in dasd_change_state 2009-06-22 12:08:23 +02:00
sbus openprom: Squelch useless GCC warning. 2009-06-16 04:56:57 -07:00
scsi [SCSI] scsi_transport_fc: replace BUS_ID_SIZE by fixed count 2009-06-21 12:11:43 -05:00
serial msm: fixups to match current code 2009-06-22 11:32:25 -07:00
sh
sn
spi spi_mpc8xxx: s/83xx/8xxx/g 2009-06-19 16:46:05 -07:00
ssb
staging Staging: octeon-ethernet: Fix race freeing transmit buffers. 2009-06-24 18:34:41 +01:00
tc
telephony
thermal
uio
usb Merge commit 'origin/master' into next 2009-06-18 11:16:55 +10:00
uwb
video nvidiafb: fix boot-time printk string 2009-06-23 12:50:05 -07:00
virtio
vlynq drivers: add support for the TI VLYNQ bus 2009-06-16 19:47:52 -07:00
w1 w1-gpio: add external pull-up enable callback 2009-06-18 13:03:58 -07:00
watchdog [WATCHDOG] wdt_pci.c: remove #ifdef CONFIG_WDT_501_PCI 2009-06-23 07:13:52 +00:00
xen
zorro
Kconfig LinuxPPS: core support 2009-06-18 13:04:04 -07:00
Makefile LinuxPPS: core support 2009-06-18 13:04:04 -07:00