Patrick McHardy
334a8132d9
[SKBUFF]: Keep track of writable header len of headerless clones
...
Currently NAT (and others) that want to modify cloned skbs copy them,
even if in the vast majority of cases its not necessary because the
skb is a clone made by TCP and the portion NAT wants to modify is
actually writable because TCP release the header reference before
cloning.
The problem is that there is no clean way for NAT to find out how
long the writable header area is, so this patch introduces skb->hdr_len
to hold this length. When a headerless skb is cloned skb->hdr_len
is set to the current headroom, for regular clones it is copied from
the original. A new function skb_clone_writable(skb, len) returns
whether the skb is writable up to len bytes from skb->data. To avoid
enlarging the skb the mac_len field is reduced to 16 bit and the
new hdr_len field is put in the remaining 16 bit.
I've done a few rough benchmarks of NAT (not with this exact patch,
but a very similar one). As expected it saves huge amounts of system
time in case of sendfile, bringing it down to basically the same
amount as without NAT, with sendmsg it only helps on loopback,
probably because of the large MTU.
Transmit a 1GB file using sendfile/sendmsg over eth0/lo with and
without NAT:
- sendfile eth0, no NAT: sys 0m0.388s
- sendfile eth0, NAT: sys 0m1.835s
- sendfile eth0: NAT + path: sys 0m0.370s (~ -80%)
- sendfile lo, no NAT: sys 0m0.258s
- sendfile lo, NAT: sys 0m2.609s
- sendfile lo, NAT + patch: sys 0m0.260s (~ -90%)
- sendmsg eth0, no NAT: sys 0m2.508s
- sendmsg eth0, NAT: sys 0m2.539s
- sendmsg eth0, NAT + patch: sys 0m2.445s (no change)
- sendmsg lo, no NAT: sys 0m2.151s
- sendmsg lo, NAT: sys 0m3.557s
- sendmsg lo, NAT + patch: sys 0m2.159s (~ -40%)
I expect other users can see a similar performance improvement,
packet mangling iptables targets, ipip and ip_gre come to mind ..
Signed-off-by: Patrick McHardy <kaber@trash.net>
Signed-off-by: David S. Miller <davem@davemloft.net>
2007-07-10 22:15:37 -07:00
..
amba
byteorder
dvb
hdlc
isdn
lockd
mlx4
IB/mlx4: Make sure inline data segments don't cross a 64 byte boundary
2007-06-18 09:23:47 -07:00
mmc
mtd
netfilter
[NETFILTER]: nf_conntrack_h323: fix ASN.1 types
2007-05-24 16:42:26 -07:00
netfilter_arp
netfilter_bridge
netfilter_ipv4
[NETFILTER]: ip_tables: fix compat related crash
2007-06-07 13:40:32 -07:00
netfilter_ipv6
nfsd
raid
md: don't write more than is required of the last page of a bitmap
2007-05-23 20:14:14 -07:00
spi
spi doc updates
2007-06-16 13:16:16 -07:00
sunrpc
sendfile: convert nfsd to splice_direct_to_actor()
2007-07-10 08:04:14 +02:00
tc_act
tc_ematch
usb
8250_pci.h
a.out.h
ac97_codec.h
acct.h
acpi.h
acpi_pmtmr.h
adb.h
adfs_fs.h
adfs_fs_i.h
adfs_fs_sb.h
aer.h
affs_hardblocks.h
agp_backend.h
agpgart.h
aio.h
aio_abi.h
amifd.h
amifdreg.h
amigaffs.h
anon_inodes.h
apm-emulation.h
apm_bios.h
arcdevice.h
arcfb.h
ata.h
[ATA] Add named constant for ATAPI command DEVICE RESET
2007-07-09 12:17:33 -04:00
atalk.h
atm.h
atm_eni.h
atm_he.h
atm_idt77105.h
atm_nicstar.h
atm_suni.h
atm_tcp.h
atm_zatm.h
atmapi.h
atmarp.h
atmbr2684.h
atmclip.h
atmdev.h
atmel_pdc.h
atmioc.h
atmlec.h
atmmpc.h
atmppp.h
atmsap.h
atmsvc.h
attribute_container.h
audit.h
auto_fs.h
auto_fs4.h
auxvec.h
ax25.h
b1lli.h
b1pcmcia.h
backing-dev.h
backlight.h
baycom.h
bcd.h
bfs_fs.h
binfmts.h
bio.h
bit_spinlock.h
bitmap.h
bitops.h
bitrev.h
blkdev.h
[TRIVIAL PATCH] Kill blk_congestion_wait() stub for !CONFIG_BLOCK
2007-07-10 08:03:32 +02:00
blkpg.h
blktrace_api.h
blockgroup_lock.h
bootmem.h
x86_64: allocate sparsemem memmap above 4G
2007-06-01 08:18:27 -07:00
bottom_half.h
bpqether.h
buffer_head.h
bug.h
cache.h
calc64.h
capability.h
capability.h warning fix
2007-05-23 20:14:12 -07:00
capi.h
cciss_ioctl.h
cd1400.h
cdev.h
cdk.h
cdrom.h
cfag12864b.h
chio.h
circ_buf.h
clk.h
clockchips.h
clocksource.h
cm4000_cs.h
cn_proc.h
cobalt-nvram.h
coda.h
coda_cache.h
coda_fs_i.h
coda_linux.h
coda_proc.h
coda_psdev.h
coff.h
com20020.h
compat.h
compiler-gcc.h
compiler-gcc3.h
compiler-gcc4.h
compiler-intel.h
compiler.h
completion.h
comstats.h
concap.h
configfs.h
connector.h
console.h
console_struct.h
Protect <linux/console_struct.h> from multiple inclusion
2007-06-08 17:23:34 -07:00
consolemap.h
const.h
cpu.h
cpufreq.h
cpumask.h
cpuset.h
cramfs_fs.h
cramfs_fs_sb.h
crash_dump.h
crc-ccitt.h
crc-itu-t.h
crc16.h
crc32.h
crc32c.h
crypto.h
cryptohash.h
ctype.h
cuda.h
cyclades.h
cyclomx.h
cycx_cfm.h
cycx_drv.h
cycx_x25.h
dcache.h
dccp.h
dcookies.h
debug_locks.h
debugfs.h
delay.h
delayacct.h
device-mapper.h
device.h
devpts_fs.h
dio.h
dirent.h
display.h
dlm.h
[DLM] variable allocation
2007-07-09 08:23:17 +01:00
dlm_device.h
[DLM] canceling deadlocked lock
2007-07-09 08:22:54 +01:00
dlm_netlink.h
[DLM] add lock timeouts and warnings [2/6]
2007-07-09 08:22:33 +01:00
dm-ioctl.h
dm9000.h
dma-mapping.h
dmaengine.h
dmapool.h
dmi.h
dn.h
dnotify.h
dqblk_v1.h
dqblk_v2.h
dqblk_xfs.h
ds1wm.h
ds1286.h
ds17287rtc.h
dtlk.h
edd.h
eeprom_93cx6.h
[PATCH] Add 93cx6 eeprom library
2007-07-08 22:16:36 -04:00
efi.h
efs_dir.h
efs_fs.h
efs_fs_i.h
efs_fs_sb.h
efs_vh.h
eisa.h
elevator.h
elf-em.h
elf-fdpic.h
elf.h
elfcore.h
elfnote.h
err.h
errno.h
Better documentation for ERESTARTSYS
2007-06-01 08:18:29 -07:00
errqueue.h
etherdevice.h
[NET]: Kill eth_copy_and_sum().
2007-07-10 22:08:12 -07:00
ethtool.h
eventfd.h
eventfd: clean compile when CONFIG_EVENTFD=n
2007-06-28 11:34:53 -07:00
eventpoll.h
ext2_fs.h
ext2_fs_sb.h
ext3_fs.h
ext3_fs_i.h
ext3_fs_sb.h
ext3_jbd.h
ext4_fs.h
Define/reserve new ext4 superblock fields
2007-05-31 16:20:15 -04:00
ext4_fs_extents.h
ext4: Extent overlap bugfix
2007-05-31 16:20:15 -04:00
ext4_fs_i.h
EXT4: Fix whitespace
2007-05-31 16:20:14 -04:00
ext4_fs_sb.h
ext4_jbd2.h
fadvise.h
fault-inject.h
fb.h
fbdev: Move declaration of fb_class to <linux/fb.h>
2007-06-01 08:18:28 -07:00
fcdevice.h
fcntl.h
fd.h
fd1772.h
fddidevice.h
fdreg.h
fib_rules.h
file.h
filter.h
firewire-cdev.h
firewire: Document userspace ioctl interface.
2007-07-10 00:07:45 +02:00
firewire-constants.h
firmware.h
flat.h
font.h
freezer.h
freezer: move frozen_process() to kernel/power/process.c
2007-05-23 20:14:11 -07:00
fs.h
Remove remnants of sendfile()
2007-07-10 08:04:15 +02:00
fs_enet_pd.h
fs_stack.h
fs_struct.h
fs_uart_pd.h
fsl_devices.h
fsnotify.h
fuse.h
futex.h
Revert "futex_requeue_pi optimization"
2007-06-18 09:48:41 -07:00
gameport.h
gen_stats.h
genalloc.h
generic_acl.h
generic_serial.h
genetlink.h
genhd.h
genhd: send async notification on media change
2007-05-23 20:14:12 -07:00
getcpu.h
gfp.h
gfs2_ondisk.h
[GFS2] Add nanosecond timestamp feature
2007-07-09 08:23:12 +01:00
gigaset_dev.h
gpio_keys.h
gpio_mouse.h
Input: add gpio-mouse driver
2007-07-10 00:35:17 -04:00
hardirq.h
sched: add in_atomic_preempt_off()
2007-07-09 18:51:58 +02:00
harrier_defs.h
hash.h
hayesesp.h
hdlc.h
hdlcdrv.h
hdpu_features.h
hdreg.h
hdsmart.h
hid-debug.h
hid.h
Merge branches 'debug-module-param' and 'upstream' into for-linus
2007-07-09 14:23:37 +02:00
hiddev.h
highmem.h
highuid.h
hil.h
hil_mlc.h
hippidevice.h
hp_sdc.h
hpet.h
hrtimer.h
htirq.h
hugetlb.h
shm: fix the filename of hugetlb sysv shared memory
2007-06-16 13:16:16 -07:00
hw_random.h
hwmon-sysfs.h
hwmon-vid.h
hwmon.h
hysdn_if.h
i2c-algo-bit.h
i2c-algo-pca.h
i2c-algo-pcf.h
i2c-algo-sgi.h
i2c-dev.h
i2c-gpio.h
i2c-id.h
i2c-isa.h
i2c-ocores.h
i2c-pnx.h
i2c-pxa.h
i2c.h
i2o-dev.h
i2o.h
i8k.h
ibmtr.h
icmp.h
icmpv6.h
ide.h
ide: add short cables support
2007-07-09 23:17:58 +02:00
idr.h
ieee80211.h
if.h
if_addr.h
if_arcnet.h
if_arp.h
if_bonding.h
if_bridge.h
if_cablemodem.h
if_ec.h
if_eql.h
if_ether.h
Add constant for FCS/CRC length (frame check sequence)
2007-05-21 19:41:19 -04:00
if_fc.h
if_fddi.h
if_frad.h
if_hippi.h
if_infiniband.h
if_link.h
[VLAN]: Use rtnl_link API
2007-07-10 22:15:03 -07:00
if_ltalk.h
if_packet.h
if_plip.h
if_ppp.h
if_pppox.h
if_shaper.h
if_slip.h
if_strip.h
if_tr.h
if_tun.h
if_tunnel.h
if_vlan.h
[VLAN]: Introduce symbolic constants for flag values
2007-07-10 22:15:02 -07:00
if_wanpipe.h
igmp.h
in.h
in6.h
in_route.h
inet.h
inet_diag.h
inetdevice.h
[IPV4]: include sysctl.h from inetdevice.h
2007-06-22 17:04:27 -07:00
init.h
init_task.h
initrd.h
inotify.h
input-polldev.h
input.h
Input: convert from class devices to standard devices
2007-07-10 00:35:17 -04:00
interrupt.h
io.h
ioc3.h
ioc4.h
ioctl.h
ioport.h
ioprio.h
cfq-iosched: fix async queue behaviour
2007-07-10 13:43:25 +02:00
ip.h
ip6_tunnel.h
ipc.h
ipmi.h
ipmi_msgdefs.h
ipmi_smi.h
ipsec.h
ipv6.h
[IPV6] ADDRCONF: Fix conflicts in DEVCONF_xxx constant.
2007-05-31 01:23:36 -07:00
ipv6_route.h
ipx.h
irda.h
irq.h
irq_cpustat.h
irqflags.h
irqreturn.h
isa.h
isapnp.h
isdn.h
isdn_divertif.h
isdn_ppp.h
isdnif.h
isicom.h
iso_fs.h
istallion.h
ixjuser.h
jbd.h
jbd2.h
jffs2.h
jhash.h
jiffies.h
journal-head.h
joystick.h
kallsyms.h
include/linux/kallsyms.h must #include <linux/errno.h>
2007-07-07 13:49:51 -07:00
kbd_diacr.h
kbd_kern.h
Kbuild
[IPV4]: The scheduled removal of multipath cached routing support.
2007-07-10 22:05:57 -07:00
kd.h
kdebug.h
kdev_t.h
kernel.h
hexdump: more output formatting
2007-06-08 17:23:34 -07:00
kernel_stat.h
kernelcapi.h
kexec.h
key-ui.h
key.h
keyboard.h
keyctl.h
kfifo.h
klist.h
kmalloc_sizes.h
kmod.h
kobj_map.h
kobject.h
kprobes.h
kref.h
ks0108.h
kthread.h
ktime.h
[KTIME]: Introduce ktime_add_us
2007-07-10 22:15:26 -07:00
kvm.h
kvm_para.h
lapb.h
latency.h
lcd.h
leds.h
libata.h
libata: Support chips with 64K PRD quirk
2007-07-09 12:17:35 -04:00
libps2.h
license.h
limits.h
linkage.h
linux_logo.h
list.h
llc.h
lm_interface.h
lock_dlm_plock.h
lockdep.h
log2.h
loop.h
lp.h
lzo.h
Add LZO1X algorithm to the kernel
2007-07-10 17:51:13 -07:00
m41t00.h
m48t86.h
magic.h
major.h
matroxfb.h
mbcache.h
mc6821.h
mc146818rtc.h
mca-legacy.h
mca.h
memory.h
memory_hotplug.h
mempolicy.h
mempool.h
meye.h
migrate.h
mii.h
minix_fs.h
miscdevice.h
mm.h
page_mapping must avoid slub pages
2007-06-21 15:55:12 -07:00
mm_inline.h
mm_types.h
mman.h
mmtimer.h
mmzone.h
mnt_namespace.h
mod_devicetable.h
module.h
moduleloader.h
moduleparam.h
mount.h
mpage.h
mqueue.h
mroute.h
msdos_fs.h
msg.h
msi.h
mtio.h
mutex-debug.h
mutex.h
mv643xx.h
[MIPS] Delete Ocelot 3 support.
2007-07-10 17:33:05 +01:00
n_r3964.h
namei.h
nbd.h
ncp.h
ncp_fs.h
ncp_fs_i.h
ncp_fs_sb.h
ncp_mount.h
ncp_no.h
neighbour.h
net.h
netdevice.h
[RTNETLINK]: Link creation API
2007-07-10 22:14:20 -07:00
netfilter.h
netfilter_arp.h
netfilter_bridge.h
netfilter_decnet.h
netfilter_ipv4.h
netfilter_ipv6.h
netlink.h
netpoll.h
netrom.h
nfs.h
nfs2.h
nfs3.h
nfs4.h
nfs4_acl.h
nfs4_mount.h
nfs_fs.h
nfs_fs_i.h
nfs_fs_sb.h
nfs_idmap.h
nfs_mount.h
nfs_page.h
NFS: Avoid a deadlock situation on write
2007-05-24 10:44:20 -04:00
nfs_xdr.h
nfsacl.h
nfsd_idmap.h
nl80211.h
nls.h
nmi.h
node.h
nodemask.h
notifier.h
nsc_gpio.h
nsproxy.h
nubus.h
numa.h
nvram.h
oom.h
oprofile.h
page-flags.h
pagemap.h
pagevec.h
param.h
parport.h
parport_pc.h
parser.h
pata_platform.h
Add irq_flags to struct pata_platform_info
2007-07-09 12:17:34 -04:00
patchkey.h
pci-acpi.h
pci.h
pci.h stubs (for EDD build error)
2007-07-01 12:29:44 -07:00
pci_hotplug.h
pci_ids.h
sdhci: add ene controller id
2007-07-09 21:23:08 +02:00
pci_regs.h
pcieport_if.h
pda_power.h
[BATTERY] pda_power platform driver
2007-07-10 11:25:59 +01:00
percpu.h
percpu_counter.h
personality.h
pfkeyv2.h
pfn.h
pg.h
phantom.h
phonedev.h
phy.h
pid.h
pid_namespace.h
pipe_fs_i.h
pipe: add documentation and comments
2007-07-10 08:04:16 +02:00
pkt_cls.h
pkt_sched.h
pktcdvd.h
platform_device.h
plist.h
pm.h
PM: introduce set_target method in pm_ops
2007-07-01 12:29:44 -07:00
pm_legacy.h
pmu.h
pnp.h
pnpbios.h
poison.h
poll.h
posix-timers.h
posix_acl.h
posix_acl_xattr.h
posix_types.h
power_supply.h
[BATTERY] Universal power supply class (was: battery class)
2007-07-10 11:25:44 +01:00
ppdev.h
ppp-comp.h
ppp_channel.h
ppp_defs.h
prctl.h
preempt.h
prefetch.h
prio_tree.h
proc_fs.h
profile.h
ps2esdi.h
ptrace.h
qnx4_fs.h
qnxtypes.h
quicklist.h
quota.h
quotaio_v1.h
quotaio_v2.h
quotaops.h
radeonfb.h
radix-tree.h
raid_class.h
ramfs.h
random.h
raw.h
rbtree.h
rcupdate.h
reboot.h
reciprocal_div.h
reiserfs_acl.h
reiserfs_fs.h
reiserfs_fs_i.h
reiserfs_fs_sb.h
reiserfs_xattr.h
relay.h
resource.h
resume-trace.h
rfkill.h
[RFKILL]: Make rfkill->name const
2007-06-07 13:39:34 -07:00
rio.h
rio_drv.h
rio_ids.h
rio_regs.h
rmap.h
romfs_fs.h
root_dev.h
rose.h
route.h
rslib.h
rtc-v3020.h
rtc.h
rtmutex.h
rtnetlink.h
[IPV4]: The scheduled removal of multipath cached routing support.
2007-07-10 22:05:57 -07:00
rwsem-spinlock.h
rwsem.h
rxrpc.h
sc26198.h
scatterlist.h
scc.h
sched.h
sched: micro-optimize mmdrop()
2007-07-09 18:52:01 +02:00
screen_info.h
sctp.h
scx200.h
scx200_gpio.h
sdla.h
seccomp.h
securebits.h
security.h
selection.h
selinux.h
selinux_netlink.h
sem.h
seq_file.h
Make common helpers for seq_files that work with list_heads
2007-07-10 17:51:13 -07:00
seqlock.h
serial.h
serial167.h
serial_8250.h
serial_core.h
serial_core.h: include <linux/sysrq.h>
2007-06-01 08:18:29 -07:00
serial_pnx8xxx.h
serial_reg.h
serialP.h
serio.h
shm.h
shmem_fs.h
signal.h
signalfd.h
skbuff.h
[SKBUFF]: Keep track of writable header len of headerless clones
2007-07-10 22:15:37 -07:00
slab.h
slab allocators: MAX_ORDER one off fix
2007-06-24 08:59:12 -07:00
slab_def.h
slub_def.h
SLUB: minimum alignment fixes
2007-06-16 13:16:16 -07:00
sm501-regs.h
SM501: Check SM501 ID register on initialisation
2007-06-24 08:59:11 -07:00
sm501.h
smb.h
smb_fs.h
Fix headers check fallout
2007-05-21 21:47:27 -07:00
smb_fs_i.h
smb_fs_sb.h
smb_mount.h
smbno.h
smp.h
smp_lock.h
snmp.h
socket.h
sockios.h
som.h
sonet.h
sony-laptop.h
sonypi.h
sort.h
sound.h
soundcard.h
spinlock.h
spinlock_api_smp.h
spinlock_api_up.h
spinlock_types.h
spinlock_types_up.h
spinlock_up.h
splice.h
pipe: allow passing around of ops private pointer
2007-07-10 08:04:14 +02:00
srcu.h
stacktrace.h
stallion.h
start_kernel.h
stat.h
statfs.h
stddef.h
stop_machine.h
string.h
stringify.h
superhyway.h
suspend.h
svga.h
swap.h
swapops.h
synclink.h
sys.h
syscalls.h
Introduce fixed sys_sync_file_range2() syscall, implement on PowerPC and ARM
2007-06-28 11:38:30 -07:00
sysctl.h
sysdev.h
sysfs.h
sysrq.h
sysv_fs.h
task_io_accounting.h
task_io_accounting_ops.h
taskstats.h
taskstats_kern.h
tc.h
tcp.h
telephony.h
termios.h
textsearch.h
textsearch_fsm.h
tfrc.h
thread_info.h
threads.h
ticable.h
tick.h
tifm.h
time.h
timer.h
NOHZ: prevent multiplication overflow - stop timer for huge timeouts
2007-05-29 18:11:10 -07:00
timerfd.h
times.h
timex.h
tiocl.h
tipc.h
tipc_config.h
topology.h
sched: more agressive idle balancing
2007-07-09 18:52:01 +02:00
toshiba.h
transport_class.h
trdevice.h
tsacct_kern.h
tty.h
tty_driver.h
tty_flip.h
tty_ldisc.h
types.h
uaccess.h
udf_fs.h
udf_fs_i.h
udf_fs_sb.h
udp.h
ufs_fs.h
ufs_fs_i.h
ufs_fs_sb.h
uinput.h
uio.h
ultrasound.h
umem.h
un.h
unistd.h
unwind.h
usb.h
USB: Add USB_DEVICE_INTERFACE_PROTOCOL macro
2007-07-10 00:35:14 -04:00
usb_gadget.h
usb_gadgetfs.h
usb_sl811.h
usb_usual.h
usbdevice_fs.h
user.h
utime.h
uts.h
utsname.h
vermagic.h
vfs.h
via.h
video_decoder.h
video_encoder.h
video_output.h
videodev.h
videodev2.h
V4L/DVB (5736): Add V4L2_FBUF_CAP/FLAG_LOCAL/GLOBAL_INV_ALPHA
2007-06-08 08:21:15 -03:00
videotext.h
vmalloc.h
vmstat.h
vt.h
vt_buffer.h
vt_kern.h
wait.h
sched: clean up sleep_on() APIs
2007-07-09 18:52:01 +02:00
wanrouter.h
watchdog.h
wireless.h
workqueue.h
writeback.h
x25.h
xattr.h
xfrm.h
yam.h
zconf.h
zlib.h
zorro.h
zorro_ids.h
zutil.h