* [PATCH] acenic: use netdev_alloc_skb_ip_align
From: Stephen Hemminger @ 2011-07-22 16:31 UTC (permalink / raw)
To: David Miller; +Cc: eric.dumazet, netdev
In-Reply-To: <20110721.232501.1187843432422240228.davem@davemloft.net>
Take Eric's patch one step further.
Use netdev_skb_ip_align to do setup the receive skb.
Compile tested only.
Signed-off-by: Stephen Hemminger <shemminger@vyatta.com>
--- a/drivers/net/acenic.c 2011-07-22 09:15:26.103853123 -0700
+++ b/drivers/net/acenic.c 2011-07-22 09:28:36.343823394 -0700
@@ -1502,13 +1502,13 @@ static int __devinit ace_init(struct net
* firmware to wipe the ring without re-initializing it.
*/
if (!test_and_set_bit(0, &ap->std_refill_busy))
- ace_load_std_rx_ring(ap, RX_RING_SIZE);
+ ace_load_std_rx_ring(dev, RX_RING_SIZE);
else
printk(KERN_ERR "%s: Someone is busy refilling the RX ring\n",
ap->name);
if (ap->version >= 2) {
if (!test_and_set_bit(0, &ap->mini_refill_busy))
- ace_load_mini_rx_ring(ap, RX_MINI_SIZE);
+ ace_load_mini_rx_ring(dev, RX_MINI_SIZE);
else
printk(KERN_ERR "%s: Someone is busy refilling "
"the RX mini ring\n", ap->name);
@@ -1584,9 +1584,10 @@ static void ace_watchdog(struct net_devi
}
-static void ace_tasklet(unsigned long dev)
+static void ace_tasklet(unsigned long arg)
{
- struct ace_private *ap = netdev_priv((struct net_device *)dev);
+ struct net_device *dev = (struct net_device *) arg;
+ struct ace_private *ap = netdev_priv(dev);
int cur_size;
cur_size = atomic_read(&ap->cur_rx_bufs);
@@ -1595,7 +1596,7 @@ static void ace_tasklet(unsigned long de
#ifdef DEBUG
printk("refilling buffers (current %i)\n", cur_size);
#endif
- ace_load_std_rx_ring(ap, RX_RING_SIZE - cur_size);
+ ace_load_std_rx_ring(dev, RX_RING_SIZE - cur_size);
}
if (ap->version >= 2) {
@@ -1606,7 +1607,7 @@ static void ace_tasklet(unsigned long de
printk("refilling mini buffers (current %i)\n",
cur_size);
#endif
- ace_load_mini_rx_ring(ap, RX_MINI_SIZE - cur_size);
+ ace_load_mini_rx_ring(dev, RX_MINI_SIZE - cur_size);
}
}
@@ -1616,7 +1617,7 @@ static void ace_tasklet(unsigned long de
#ifdef DEBUG
printk("refilling jumbo buffers (current %i)\n", cur_size);
#endif
- ace_load_jumbo_rx_ring(ap, RX_JUMBO_SIZE - cur_size);
+ ace_load_jumbo_rx_ring(dev, RX_JUMBO_SIZE - cur_size);
}
ap->tasklet_pending = 0;
}
@@ -1642,8 +1643,9 @@ static void ace_dump_trace(struct ace_pr
* done only before the device is enabled, thus no interrupts are
* generated and by the interrupt handler/tasklet handler.
*/
-static void ace_load_std_rx_ring(struct ace_private *ap, int nr_bufs)
+static void ace_load_std_rx_ring(struct net_device *dev, int nr_bufs)
{
+ struct ace_private *ap = netdev_priv(dev);
struct ace_regs __iomem *regs = ap->regs;
short i, idx;
@@ -1657,11 +1659,10 @@ static void ace_load_std_rx_ring(struct
struct rx_desc *rd;
dma_addr_t mapping;
- skb = dev_alloc_skb(ACE_STD_BUFSIZE + NET_IP_ALIGN);
+ skb = netdev_alloc_skb_ip_align(dev, ACE_STD_BUFSIZE);
if (!skb)
break;
- skb_reserve(skb, NET_IP_ALIGN);
mapping = pci_map_page(ap->pdev, virt_to_page(skb->data),
offset_in_page(skb->data),
ACE_STD_BUFSIZE,
@@ -1705,8 +1706,9 @@ static void ace_load_std_rx_ring(struct
}
-static void ace_load_mini_rx_ring(struct ace_private *ap, int nr_bufs)
+static void ace_load_mini_rx_ring(struct net_device *dev, int nr_bufs)
{
+ struct ace_private *ap = netdev_priv(dev);
struct ace_regs __iomem *regs = ap->regs;
short i, idx;
@@ -1718,11 +1720,10 @@ static void ace_load_mini_rx_ring(struct
struct rx_desc *rd;
dma_addr_t mapping;
- skb = dev_alloc_skb(ACE_MINI_BUFSIZE + NET_IP_ALIGN);
+ skb = netdev_alloc_skb_ip_align(dev, ACE_MINI_BUFSIZE);
if (!skb)
break;
- skb_reserve(skb, NET_IP_ALIGN);
mapping = pci_map_page(ap->pdev, virt_to_page(skb->data),
offset_in_page(skb->data),
ACE_MINI_BUFSIZE,
@@ -1762,8 +1763,9 @@ static void ace_load_mini_rx_ring(struct
* Load the jumbo rx ring, this may happen at any time if the MTU
* is changed to a value > 1500.
*/
-static void ace_load_jumbo_rx_ring(struct ace_private *ap, int nr_bufs)
+static void ace_load_jumbo_rx_ring(struct net_device *dev, int nr_bufs)
{
+ struct ace_private *ap = netdev_priv(dev);
struct ace_regs __iomem *regs = ap->regs;
short i, idx;
@@ -1774,11 +1776,10 @@ static void ace_load_jumbo_rx_ring(struc
struct rx_desc *rd;
dma_addr_t mapping;
- skb = dev_alloc_skb(ACE_JUMBO_BUFSIZE + NET_IP_ALIGN);
+ skb = netdev_alloc_skb_ip_align(dev, ACE_JUMBO_BUFSIZE);
if (!skb)
break;
- skb_reserve(skb, NET_IP_ALIGN);
mapping = pci_map_page(ap->pdev, virt_to_page(skb->data),
offset_in_page(skb->data),
ACE_JUMBO_BUFSIZE,
@@ -2196,7 +2197,7 @@ static irqreturn_t ace_interrupt(int irq
#ifdef DEBUG
printk("low on std buffers %i\n", cur_size);
#endif
- ace_load_std_rx_ring(ap,
+ ace_load_std_rx_ring(dev,
RX_RING_SIZE - cur_size);
} else
run_tasklet = 1;
@@ -2212,7 +2213,8 @@ static irqreturn_t ace_interrupt(int irq
printk("low on mini buffers %i\n",
cur_size);
#endif
- ace_load_mini_rx_ring(ap, RX_MINI_SIZE - cur_size);
+ ace_load_mini_rx_ring(dev,
+ RX_MINI_SIZE - cur_size);
} else
run_tasklet = 1;
}
@@ -2228,7 +2230,8 @@ static irqreturn_t ace_interrupt(int irq
printk("low on jumbo buffers %i\n",
cur_size);
#endif
- ace_load_jumbo_rx_ring(ap, RX_JUMBO_SIZE - cur_size);
+ ace_load_jumbo_rx_ring(dev,
+ RX_JUMBO_SIZE - cur_size);
} else
run_tasklet = 1;
}
@@ -2267,7 +2270,7 @@ static int ace_open(struct net_device *d
if (ap->jumbo &&
!test_and_set_bit(0, &ap->jumbo_refill_busy))
- ace_load_jumbo_rx_ring(ap, RX_JUMBO_SIZE);
+ ace_load_jumbo_rx_ring(dev, RX_JUMBO_SIZE);
if (dev->flags & IFF_PROMISC) {
cmd.evt = C_SET_PROMISC_MODE;
@@ -2575,7 +2578,7 @@ static int ace_change_mtu(struct net_dev
"support\n", dev->name);
ap->jumbo = 1;
if (!test_and_set_bit(0, &ap->jumbo_refill_busy))
- ace_load_jumbo_rx_ring(ap, RX_JUMBO_SIZE);
+ ace_load_jumbo_rx_ring(dev, RX_JUMBO_SIZE);
ace_set_rxtx_parms(dev, 1);
}
} else {
--- a/drivers/net/acenic.h 2011-07-22 09:23:55.087833975 -0700
+++ b/drivers/net/acenic.h 2011-07-22 09:24:19.575833054 -0700
@@ -766,9 +766,9 @@ static inline void ace_unmask_irq(struct
* Prototypes
*/
static int ace_init(struct net_device *dev);
-static void ace_load_std_rx_ring(struct ace_private *ap, int nr_bufs);
-static void ace_load_mini_rx_ring(struct ace_private *ap, int nr_bufs);
-static void ace_load_jumbo_rx_ring(struct ace_private *ap, int nr_bufs);
+static void ace_load_std_rx_ring(struct net_device *dev, int nr_bufs);
+static void ace_load_mini_rx_ring(struct net_device *dev, int nr_bufs);
+static void ace_load_jumbo_rx_ring(struct net_device *dev, int nr_bufs);
static irqreturn_t ace_interrupt(int irq, void *dev_id);
static int ace_load_firmware(struct net_device *dev);
static int ace_open(struct net_device *dev);
^ permalink raw reply
* [PATCH] ath9k: use pci_dev->subsystem_device
From: Sergei Shtylyov @ 2011-07-22 15:58 UTC (permalink / raw)
To: netdev, linville, linux-wireless, ath9k-devel
Cc: jmalinen, lrodriguez, vasanth, senthilkumar
The driver reads PCI subsystem ID from the PCI configuration register while it's
already stored by the PCI subsystem in the 'subsystem_device' field of 'struct
pci_dev'...
Signed-off-by: Sergei Shtylyov <sshtylyov@ru.mvista.com>
---
The patch is against the recent Linus' tree.
drivers/net/wireless/ath/ath9k/pci.c | 5 ++---
1 file changed, 2 insertions(+), 3 deletions(-)
Index: linux-2.6/drivers/net/wireless/ath/ath9k/pci.c
===================================================================
--- linux-2.6.orig/drivers/net/wireless/ath/ath9k/pci.c
+++ linux-2.6/drivers/net/wireless/ath/ath9k/pci.c
@@ -129,7 +129,6 @@ static int ath_pci_probe(struct pci_dev
struct ath_softc *sc;
struct ieee80211_hw *hw;
u8 csz;
- u16 subsysid;
u32 val;
int ret = 0;
char hw_name[64];
@@ -223,8 +222,8 @@ static int ath_pci_probe(struct pci_dev
sc->irq = pdev->irq;
- pci_read_config_word(pdev, PCI_SUBSYSTEM_ID, &subsysid);
- ret = ath9k_init_device(id->device, sc, subsysid, &ath_pci_bus_ops);
+ ret = ath9k_init_device(id->device, sc, pdev->subsystem_device,
+ &ath_pci_bus_ops);
if (ret) {
dev_err(&pdev->dev, "Failed to initialize device\n");
goto err_init;
^ permalink raw reply
* [PATCH] sbni: use pci_dev->subsystem_device
From: Sergei Shtylyov @ 2011-07-22 15:50 UTC (permalink / raw)
To: netdev
The driver reads PCI subsystem ID from the PCI configuration register while it's
already stored by the PCI subsystem in the 'subsystem_device' field of 'struct
pci_dev'...
Signed-off-by: Sergei Shtylyov <sshtylyov@ru.mvista.com>
---
The patch is against the recent Linus' tree.
drivers/net/wan/sbni.c | 5 +----
1 file changed, 1 insertion(+), 4 deletions(-)
Index: linux-2.6/drivers/net/wan/sbni.c
===================================================================
--- linux-2.6.orig/drivers/net/wan/sbni.c
+++ linux-2.6/drivers/net/wan/sbni.c
@@ -303,7 +303,6 @@ sbni_pci_probe( struct net_device *dev
!= NULL ) {
int pci_irq_line;
unsigned long pci_ioaddr;
- u16 subsys;
if( pdev->vendor != SBNI_PCI_VENDOR &&
pdev->device != SBNI_PCI_DEVICE )
@@ -314,9 +313,7 @@ sbni_pci_probe( struct net_device *dev
/* Avoid already found cards from previous calls */
if( !request_region( pci_ioaddr, SBNI_IO_EXTENT, dev->name ) ) {
- pci_read_config_word( pdev, PCI_SUBSYSTEM_ID, &subsys );
-
- if (subsys != 2)
+ if (pdev->subsystem_device != 2)
continue;
/* Dual adapter is present */
^ permalink raw reply
* [PATCH] r8169: use pci_dev->subsystem_{vendor|device}
From: Sergei Shtylyov @ 2011-07-22 15:37 UTC (permalink / raw)
To: netdev, nic_swsd, romieu
The driver reads PCI subsystem IDs from the PCI configuration registers while
they are already stored by the PCI subsystem in the 'subsystem_{vendor|device}'
fields of 'struct pci_dev'...
Signed-off-by: Sergei Shtylyov <sshtylyov@ru.mvista.com>
---
The patch is against the recent Linus' tree.
drivers/net/r8169.c | 7 ++-----
1 file changed, 2 insertions(+), 5 deletions(-)
Index: linux-2.6/drivers/net/r8169.c
===================================================================
--- linux-2.6.orig/drivers/net/r8169.c
+++ linux-2.6/drivers/net/r8169.c
@@ -1982,12 +1982,9 @@ static void rtl8169sb_hw_phy_config(stru
static void rtl8169scd_hw_phy_config_quirk(struct rtl8169_private *tp)
{
struct pci_dev *pdev = tp->pci_dev;
- u16 vendor_id, device_id;
- pci_read_config_word(pdev, PCI_SUBSYSTEM_VENDOR_ID, &vendor_id);
- pci_read_config_word(pdev, PCI_SUBSYSTEM_ID, &device_id);
-
- if ((vendor_id != PCI_VENDOR_ID_GIGABYTE) || (device_id != 0xe000))
+ if ((pdev->subsystem_vendor != PCI_VENDOR_ID_GIGABYTE) ||
+ (pdev->subsystem_device != 0xe000))
return;
rtl_writephy(tp, 0x1f, 0x0001);
^ permalink raw reply
* Re: [PATCH] net: Fix security_socket_sendmsg() bypass problem.
From: David Miller @ 2011-07-22 15:22 UTC (permalink / raw)
To: penguin-kernel; +Cc: casey, anton, netdev, linux-security-module
In-Reply-To: <201107230012.HED65612.JFVSFOOOMHtFLQ@I-love.SAKURA.ne.jp>
From: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
Date: Sat, 23 Jul 2011 00:12:53 +0900
> I think the regression for SMACK can be fixed with below patch.
>
> Should I pass nosec flags down to "struct security_operations"->sendmsg()
> so that SELinux checks sock_has_perm() for only once when multiple different
> destination's addresses are passed to sendmmsg()?
>
> static int selinux_socket_sendmsg(struct socket *sock, struct msghdr *msg,
> int size, int nosec)
> {
> return nosec ? 0 : sock_has_perm(current, sock->sk, SOCKET__WRITE);
> }
Ugh, this takes away a non-trivial part of the performance gain of
sendmmsg().
I would instead rather that you check ahead of time whether this
actually is a send to different addresses. If they are all the
same, keep the nosec code path.
^ permalink raw reply
* [PATCH] net: Fix security_socket_sendmsg() bypass problem.
From: Tetsuo Handa @ 2011-07-22 15:12 UTC (permalink / raw)
To: casey, anton, davem; +Cc: netdev, linux-security-module
In-Reply-To: <201107222127.GBG51007.FStQFVOHOFOLJM@I-love.SAKURA.ne.jp>
I think the regression for SMACK can be fixed with below patch.
Should I pass nosec flags down to "struct security_operations"->sendmsg()
so that SELinux checks sock_has_perm() for only once when multiple different
destination's addresses are passed to sendmmsg()?
static int selinux_socket_sendmsg(struct socket *sock, struct msghdr *msg,
int size, int nosec)
{
return nosec ? 0 : sock_has_perm(current, sock->sk, SOCKET__WRITE);
}
----------------------------------------
[PATCH] net: Fix security_socket_sendmsg() bypass problem.
The sendmmsg() introduced by commit 228e548e "net: Add sendmmsg socket system
call" is capable of sending to multiple different destinations. However,
security_socket_sendmsg() is called for only once even if multiple different
destination's addresses are passed to sendmmsg().
SMACK is using destination's address for checking sendmsg() permission.
Therefore, we need to call security_socket_sendmsg() for each destination
address rather than only the first destination address.
Fix this problem by removing nosec flags.
Also, remove sock_sendmsg_nosec() because it is no longer used.
Signed-off-by: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
Cc: stable <stable@kernel.org> [3.0+]
---
net/socket.c | 28 +++++++---------------------
1 file changed, 7 insertions(+), 21 deletions(-)
--- linux-3.0.orig/net/socket.c
+++ linux-3.0/net/socket.c
@@ -580,20 +580,6 @@ int sock_sendmsg(struct socket *sock, st
}
EXPORT_SYMBOL(sock_sendmsg);
-int sock_sendmsg_nosec(struct socket *sock, struct msghdr *msg, size_t size)
-{
- struct kiocb iocb;
- struct sock_iocb siocb;
- int ret;
-
- init_sync_kiocb(&iocb, NULL);
- iocb.private = &siocb;
- ret = __sock_sendmsg_nosec(&iocb, sock, msg, size);
- if (-EIOCBQUEUED == ret)
- ret = wait_on_sync_kiocb(&iocb);
- return ret;
-}
-
int kernel_sendmsg(struct socket *sock, struct msghdr *msg,
struct kvec *vec, size_t num, size_t size)
{
@@ -1872,7 +1858,7 @@ SYSCALL_DEFINE2(shutdown, int, fd, int,
#define COMPAT_FLAGS(msg) COMPAT_MSG(msg, msg_flags)
static int __sys_sendmsg(struct socket *sock, struct msghdr __user *msg,
- struct msghdr *msg_sys, unsigned flags, int nosec)
+ struct msghdr *msg_sys, unsigned flags)
{
struct compat_msghdr __user *msg_compat =
(struct compat_msghdr __user *)msg;
@@ -1953,8 +1939,7 @@ static int __sys_sendmsg(struct socket *
if (sock->file->f_flags & O_NONBLOCK)
msg_sys->msg_flags |= MSG_DONTWAIT;
- err = (nosec ? sock_sendmsg_nosec : sock_sendmsg)(sock, msg_sys,
- total_len);
+ err = sock_sendmsg(sock, msg_sys, total_len);
out_freectl:
if (ctl_buf != ctl)
@@ -1979,7 +1964,7 @@ SYSCALL_DEFINE3(sendmsg, int, fd, struct
if (!sock)
goto out;
- err = __sys_sendmsg(sock, msg, &msg_sys, flags, 0);
+ err = __sys_sendmsg(sock, msg, &msg_sys, flags);
fput_light(sock->file, fput_needed);
out:
@@ -2014,18 +1999,19 @@ int __sys_sendmmsg(int fd, struct mmsghd
while (datagrams < vlen) {
/*
- * No need to ask LSM for more than the first datagram.
+ * Need to ask LSM every time in case LSM might check
+ * destination's address.
*/
if (MSG_CMSG_COMPAT & flags) {
err = __sys_sendmsg(sock, (struct msghdr __user *)compat_entry,
- &msg_sys, flags, datagrams);
+ &msg_sys, flags);
if (err < 0)
break;
err = __put_user(err, &compat_entry->msg_len);
++compat_entry;
} else {
err = __sys_sendmsg(sock, (struct msghdr __user *)entry,
- &msg_sys, flags, datagrams);
+ &msg_sys, flags);
if (err < 0)
break;
err = put_user(err, &entry->msg_len);
^ permalink raw reply
* Re: NIC driver r8168 with r8169 for RTL8111/8168B and DGE-528T together
From: Danie Wessels @ 2011-07-22 14:52 UTC (permalink / raw)
To: netdev; +Cc: Francois Romieu, Stephen Hemminger
In-Reply-To: <20110721102259.GA10481@electric-eye.fr.zoreil.com>
On 07/21/2011 12:22 PM, Francois Romieu wrote:
> Danie Wessels<dawessels@telkomsa.net> :
> [...]
>> gr8. I can give that a try
and ...
> Search for rtl8169_pci_tbl and remove the 0x8168 line : the kernel r8169
> driver will stop being used on the 8168s.
I see the r8168 driver was based on the r8169 of kernel 2.6.18 ?
{GPL of Copyrig.. with paten.. ??} see r8168-8.024.00.tar
ht tp://152
.104.125.41/downloads/downloadsView.aspx?Langid=1&PNid=13&PFid=4&Level=5&Conn=4&DownTypeID=3&GetDown=false&Downloads=true
>>
>> .>It ought to be supported by the kernel r8169 driver.
>>
>> See bugs listed on Ubuntu:
>> https://bugs.launchpad.net/ubuntu/+source/linux-source-2.6.22/+bug/141343
>
> Executive summary :
> a. started in 2007
> b. includes "kernel r8169 driver does not work, tried Realtek's r8168,
> happy now"
> c. includes b. + "...wait a few days, Oops"
> d. covers different devices (8168b, 8168c, plain 8169).
> e. people still using old kernel (see post 2.6.26
> 77332894c21165404496c56763d7df6c15c4bb09 in #38 then mention of 2.6.22,
> 2.6.24)
> f. usual "this is the same bug" (#141343 is the same bug as #141343
??
> e. one (1) dmesg attached to the whole thread (74 messages). Tons of lspci,
> not a single XID.
I think is is good summary!
>> https://bugs.launchpad.net/ubuntu/+source/linux/+bug/221499
>
> Trend (?) : recent kernels help. XID and up-to-date reports would be
> welcome if they can be streamlined to a standard (for me :o) ) kernel.
> See below.
>
>> https://bugs.launchpad.net/linux/+bug/347711
>
> I wish I could filter out comments by author. Flat PR get really, really
> messy with time.
yes, I can understand
:
>> .> Which problem(s) do you have with it ?
>> No communication to outside devices. I can not ping my router
>> through it but can ping its IP.
>
> So it is receiving packets either in promiscuous mode or (and)
> as long as its peer knows its MAC address ?
No. sorry, I think. What I meant is that I cannot ping any other IPs
other than the that of the card itself (on this onboard card) with the
r8169 driver.
Further: When I then rebooted to Win 7 the card also does not work until
I disable the card and then re-enable the onboard card.
Then when I rebooted to the previous Ubuntu (i.e. 10.10) the card might
work (if it was hot reboot..?)
>
> No Tx at all (it may help if you can capture traffic on the remote
> end) or just a few packets before it stops (and spits a NETDEV
> WATCHDOG message) ?
I will look into this.
>
:
> - What (specific)
> One of Ubuntu's report suggests that you are experiencing a regression.
> If so it would be nice to bissect it.
Now even after a reboot (and disable/enable) from Win 7, Ubuntu 11.04
does not have the card enabled any more.
> In the short run I can not do more as I must push something out for a mac
> address change problem with the 8168evl.
OK
--
Danie Wessels
^ permalink raw reply
* [GIT] Networking
From: David Miller @ 2011-07-22 14:33 UTC (permalink / raw)
To: torvalds; +Cc: akpm, netdev, linux-kernel
A bit less going on than in the past few releases, most notable this
time is:
1) There are currently 3 or 4 ways to add VLAN support for a driver,
which is just crazy. Jiri Pirko is trying to consolidate things so
we have less of a mess here.
2) The Neighbour layer has been simplifier and sped up. It had complexity
purely for the sake of allowing situations that simply never happen.
This removed some indirect calls in the fast path.
It even had a method pointer that everyone assigned to the same global
routine. :-)
There will be more activity in this area in the future.
3) New driver for rtl8192de wireless chipset.
4) PowerPC 64-bit now has a BPF JIT too.
5) Get more drivers supporting 64-bit device stats, thanks to Stephen
Hemminger.
6) Sometimes a config change can happen mid-dump in netlink, we can now
detect this situation using sequence numbers and decide to rescan
if we want to.
7) SKB zero-copy buffer support for virtualization from Shirley Ma.
8) Improve scalability of inetpeer table by removing the explicit
unused list and killing off some false sharing. From Eric Dumazet.
9) AF_PACKET sockets now support a "fanout" facility, whereby you can
distribute packet capture amongst a group of sockets. This will be
used by userland traffic analysis tools such as suricata.
Please pull, thanks a lot!
The following changes since commit 02f8c6aee8df3cdc935e9bdd4f2d020306035dbe:
Linux 3.0 (2011-07-21 19:17:23 -0700)
are available in the git repository at:
master.kernel.org:/pub/scm/linux/kernel/git/davem/net-next.git master
Ajit Khaparde (1):
be2net: move to new vlan model
Alexander Duyck (19):
v2 ethtool: remove support for ETHTOOL_GRXNTUPLE
ixgbe: remove ntuple filtering
ixgbe: fix flags relating to perfect filters to support coexistence
ixgbe: update perfect filter framework to support retaining filters
ixgbe: add basic support for setting and getting nfc controls
ixgbe: add support for displaying ntuple filters via the nfc interface
ixgbe: add support for nfc addition and removal of filters
ixgbe: fix ring assignment issues for SR-IOV and drop cases
ixgbe: pass adapter struct instead of netdev for interrupt data
ixgbe: Convert IXGBE_DESC_UNUSED from macro to static inline function
ixgbe: Move all values that deal with count, next_to_use, next_to_clean to u16
ixgbe: Add one function that handles most of context descriptor setup
ixgbe: Update method used for determining descriptor count for an skb
ixgbe: Make certain to initialize the fdir_perfect_lock in all cases
ixgbe: Update ATR to use recorded TX queues instead of CPU for routing
ixgbe: inline the ixgbe_maybe_stop_tx function
ixgbe: add structure for containing RX/TX rings to q_vector
ixgbe: Move interrupt related values out of ring and into q_vector
ixgbe: Pass staterr instead of re-reading status and error bits from descriptor
Alexander Smirnov (2):
ieee802154: free skb buffer if dev isn't running
Exclude duplicated checking for iface-up. This flags is checked in 'is_skb_forwardable' function, which is subroutine of 'dev_forward_skb'.
Alexey Dobriyan (3):
net: remove interrupt.h inclusion from netdevice.h
net: fix MIPS fallout from "net: remove interrupt.h inclusion from netdevice.h"
net: remove mm.h inclusion from netdevice.h
Allan Stephens (20):
tipc: Convert fatal broadcast sanity check to non-fatal check
tipc: Remove unused sanity test macro
tipc: Standardize exit logic for message rejection handling
tipc: Add sanity check to detect rejection of non-payload messages
tipc: Optimize routing of returned payload messages
tipc: Optimizations & corrections to message rejection
tipc: Eliminate message header routines for caching destination node
tipc: Eliminate redundant masking in message header routines
tipc: Partition name table instance array info into two parts
tipc: Convert name table publication lists to standard kernel lists
tipc: Eliminate checks for empty zone list during name translation
tipc: Correct typo in link statistics output
tipc: Eliminate unused field in bearer structure
tipc: Remove unnecessary includes in socket code
tipc: Eliminate useless check when creating internal message
tipc: Cleanup of message header size terminology
tipc: Optimize creation of FIN messages
tipc: Reject connection protocol message sent to unconnected port
tipc: Don't create payload message using connection protocol routine
tipc: Optimize creation of connection protocol messages
Aloisio Almeida Jr (3):
NFC: add NFC socket family
NFC: pn533: add NXP pn533 nfc device driver
NFC: add Documentation/networking/nfc.txt
Amit Kumar Salecha (5):
qlcnic: fix default operating state of interface
net: add external loopback test in ethtool self test
qlcnic: add external loopback support
qlcnic: define error code for loopback test
netxen: add fw version compatibility check
Amitkumar Karwar (7):
mwifiex: remove support for old chipsets W0/W1
mwifiex: get rid of global adapter pointer
mwifiex: remove casts of void pointers
mwifiex: modify SDIO aggregation Tx/Rx buffer size
mwifiex: fix regression in WEP security mode
mwifiex: fix minor issue in debugfs command 'info'
mwifiex: 11n specific configuration for transmit
Amos Kong (1):
tun: do not put self in waitq if doing a nonblock read
Anderson Briglia (7):
Bluetooth: Add advertising report meta event structs
Bluetooth: Implement the first SMP commands
Bluetooth: Start SMP procedure
Bluetooth: Add simple SMP pairing negotiation
Bluetooth: Add LE SMP Cryptoolbox functions
Bluetooth: Add SMP confirmation structs
Bluetooth: Add SMP confirmation checks methods
Anderson Lizardo (1):
Bluetooth: fix missing parameter for HCI_OP_DISCONNECT
Andre Guedes (15):
Bluetooth: LE advertising cache
Bluetooth: Add Advertising Report Meta Event handler
Bluetooth: Clear advertising cache before scanning
Bluetooth: Advertising entries lifetime
Bluetooth: Add 'dst_type' field to struct hci_conn
Bluetooth: Remove useless check in hci_connect()
Bluetooth: Check advertising cache in hci_connect()
Bluetooth: Set 'peer_addr_type' in hci_le_connect()
Bluetooth: Add extfeatures to struct hci_dev
Bluetooth: Write LE Host Supported command
Bluetooth: Add enable_le module parameter
Bluetooth: Add lmp_host_le_capable() macro
Bluetooth: Remove enable_smp parameter
Bluetooth: Fix potential deadlock in hci_core
Bluetooth: Fix potential deadlock in mgmt
Andre Heider (3):
ps3_gelic: Fix typos
ps3_gelic: Fix start_xmit kick error path
ps3_gelic: Don't kill the device on DMA failure
Andrew Morton (1):
drivers/net/wireless/rtlwifi/rtl8192de/phy.c: fix udelay() usage
Andy Gospodarek (1):
ixgbe: only enable WoL for magic packet by default
Andy Shevchenko (1):
net: can: remove custom hex_to_bin()
Anirban Chakraborty (4):
qlcnic: Remove holding api lock while taking the dump
qlcnic: Add code to tune FW dump
qlcnic: Add support to enable/disable FW dump capability
qlcnic: change capture mask for FW dump
Antonio Quartulli (19):
batman-adv: move neigh_node->if_incoming->if_status check in find_router()
batman-adv: move smallest_signed_int(), seq_before() and seq_after() into main.h
batman-adv: use is_broadcast_ether_addr() instead of compare_eth(.., brd_addr)
batman-adv: a multiline comment should precede the variable it is describing
batman-adv: Unify the first 3 bytes in each packet
batman-adv: improved client announcement mechanism
batman-adv: improved roaming mechanism
batman-adv: protect the local and the global trans-tables with rcu
batman-adv: add wrapper function to throw uevent in userspace
batman-adv: gateway election code refactoring
batman-adv: throw uevent in userspace on gateway add/change/del event
batman-adv: improved gateway tq-based selection
batman-adv: unify flags for tt_change/tt_local_entry/tt_global_entry
batman-adv: add_bcast_packet_to_list() takes the sending delay as parameter
batman-adv: pass a unique flag arg instead of a sequence of bool ones
batman-adv: initialise last_ttvn and tt_crc for the orig_node structure
batman-adv: keep local table consistency for further TT_RESPONSE
batman-adv: keep global table consistency in case of roaming
batman-adv: request the full table if tt_crc doesn't match
Antti Julku (2):
Bluetooth: Move blacklisting functions to hci_core
Bluetooth: Add blacklisting support for mgmt interface
Arend van Spriel (3):
lib: crc8: add new library module providing crc8 algorithm
lib: cordic: add library module providing cordic angle calculation
drivers: bcma: export bcma_core_disable() function
Ariel Elior (2):
bnx2x: Renaming the "reset_task" to "sp_rtnl_task"
bnx2x: Multiple concurrent l2 traffic classes
Arik Nemtsov (11):
mac80211: reestablish mis-configured existing Rx BA sessions
mac80211: dynamic PS - don't enter PS when TX frames are pending
mac80211: propagate information about STA WME support down
wl12xx: AP-mode - use mac80211 indication about STA WME support
wl12xx: AP mode - support FW TX inactivity triggers
wl12xx: use 802.11 header location after relocation to frame start
wl12xx: schedule TX packets according to FW occupancy
wl12xx: implement Tx watermarks per AC
wl12xx: initialize max_power levels for 11a channels
wl12xx: always initialize AP-mode max power level
wl12xx: start/stop queues according to global per-AC counters
Barry Grussling (1):
DSA: Enable cascading in multi-chip 6131 configuration
Bastian Blank (1):
xen/netback: Add module alias for autoloading
Ben Dooks (1):
net: DM9000: Add support for byte EEPROM access
Ben Greear (2):
af-packet: Hold reference to bound network devices.
af-packet: Use existing netdev reference for bound sockets.
Ben Hutchings (7):
sfc: Fix loop condition for efx_filter_search() when !for_insert
sfc: Allow resets to be upgraded; use atomic ops for safety
sfc: Fix mapping of reset reasons and flags to methods
sfc: Fix assertions in efx_filter_rfs()
sfc: Remove 'Solarstorm' from Kconfig descriptions
sfc: Remove 'Communications' after 'Solarflare' in references to hardware
ethtool: Allow zero-length register dumps again
Benjamin Herrenschmidt (1):
sungem: Spring cleaning and GRO support
Bill Sommerfeld (1):
ipv4: Constrain UFO fragment sizes to multiples of 8 bytes
Bjørn Mork (1):
Disable router anycast address for /127 prefixes
Bruce Allan (8):
e1000e: disable far-end loopback mode on ESB2
e1000e: 82579 intermittently disabled during S0->Sx
e1000e: log when swflag is cleared unexpectedly on ICH/PCH devices
e1000e: do not schedule the Tx queue until ready
e1000e: access multiple PHY registers on same page at the same time
e1000e: Clear host wakeup bit on 82577/8 without touching PHY page 800
e1000e: remove redundant reverse dependency on CRC32
e1000e: update driver version
Carolyn Wyborny (5):
igb: Change version to remove number after -k in kernel versions.
igb: Fix lack of flush after register write and before delay
igb: Update copyright on all igb driver files.
igb: Add support of SerDes Forced mode for certain hardware
e1000e: Add Jumbo Frame support to 82583 devices
Chaoming Li (12):
rtlwifi: rtl8192de: Merge def.h
rtlwifi: rtl8192de: Merge dynamic management routines
rtlwifi: rtl8192de: Merge firmware routines
rtlwifi: rtl8192de: Merge hardware routines
rtlwifi: rtl8192de: Merge led routines
rtlwifi: rtl8192de: Merge phy routines
rtlwifi: rtl8192de: Merge register definitions
rtlwifi: rtl8192de: Merge rf routines
rtlwifi: rtl8192de: Merge main (sw) routines
rtlwifi: rtl8192de: Merge table routines
rtlwifi: rtl8192de: Merge TX and RX routines
rtlwifi: rtl8192de: Modify Kconfig and Makefile routines for new driver
Chetan Loke (1):
af-packet: fix - avoid reading stale data
Choi, Jong-Hwan (1):
net: Kobj and queues_kset should be used when CONFIG_XPS is enabled
Chris Friesen (1):
netfilter: ipset: fix compiler warnings "'hash_ip4_data_next' declared inline after being called"
Christian Lamparter (6):
carl9170: import 1.9.4 firmware headers
carl9170: enable IEEE80211_HW_NEED_DTIM_PERIOD
carl9170: allow PSM if the 5 GHz band is selected
mac80211: fix smatch complains
carl9170: use carl9170 queue enums
carl9170: Implement tx_frames_pending mac80211 callback function
Connor Hansen (1):
drivers/ssb/driver_chipcommon_pmu.c: uninitilized warning
Dan Carpenter (9):
b43: check for allocation failures
rtnetlink: unlock on error path in netlink_dump()
iwlegacy: fix up brokenness caused by cleanup
dcb: use nlmsg_free() instead of kfree()
mwifiex: restore handling of NULL parameters
rtlwifi: potential forever loop in rtl92de_hw_init()
wanxl: remove a stray irq enable
dcbnl: unlock on an error path in dcbnl_cee_fill()
skbuff: fix error handling in pskb_copy()
Daniel Baluta (1):
skbuff: update struct sk_buff members comments
Daniel Drake (2):
libertas: add sd8686 reset_card support
libertas: fix handling of command timeout, completion and interruption
Daniel Halperin (1):
iwlwifi: disambiguate invalid DMA index warnings
Daniele Furlan (1):
batman-adv: accept delayed rebroadcasts to avoid bogus routing under heavy load
David Howells (1):
batman-adv: count_real_packets() in batman-adv assumes char is signed
David Lamparter (2):
net: add 802.1ad / 802.1ah / QinQ ethertypes
net: vlan, qlcnic: make vlan_find_dev private
David Miller (4):
Bluetooth: Kill set but not used variable 'l2cap_sk' in rfcomm_sock_getsockopt_old()
Bluetooth: Do not ignore errors returned from strict_strtol()
Bluetooth: Kill set but unused variable 'cmd' in cmtp_recv_capimsg()
ipv4: Inline neigh binding.
David S. Miller (59):
Merge branch 'master' of master.kernel.org:/.../davem/net-2.6
Merge branch 'batman-adv/next' of git://git.open-mesh.org/ecsv/linux-merge
Merge branch 'master' of master.kernel.org:/.../davem/net-2.6
sctp: Guard IPV6 specific code properly.
Merge branch 'can/at91-sam9x5' of git://git.pengutronix.de/git/mkl/linux-2.6
Merge branch 'batman-adv/next' of git://git.open-mesh.org/ecsv/linux-merge
Merge branch 'batman-adv/next' of git://git.open-mesh.org/ecsv/linux-merge
Merge branch 'master' of master.kernel.org:/.../davem/net-2.6
net: Fix build failures due to ip_is_fragment()
Merge branch 'master' of master.kernel.org:/.../jkirsher/net-next-2.6
Merge branch 'for-davem' of git://git.kernel.org/.../linville/wireless-next-2.6
Merge branch 'tipc-Jun24-2011' of git://git.kernel.org/.../paulg/net-next-2.6
Merge branch 'master' of master.kernel.org:/.../jkirsher/net-next-2.6
Merge branch 'for-next' of git://git2.kernel.org/.../lowpan/lowpan
Merge branch 'for-davem' of git://git.kernel.org/.../linville/wireless-next-2.6
Merge branch 'batman-adv/next' of git://git.open-mesh.org/linux-merge
packet: Add helpers to register/unregister ->prot_hook
packet: Add fanout support.
ipv4: Add ip_defrag() agent IP_DEFRAG_AF_PACKET.
packet: Add pre-defragmentation support for ipv4 fanouts.
Merge branch 'master' of master.kernel.org:/.../davem/net-2.6
veth: Kill unused code label and code block.
packet: Add 'cpu' fanout policy.
packet: Fix leak in pre-defrag support.
rose: Delete commented out references to ancient firewalling code.
packet: Fix build with INET disabled.
Merge branch 'batman-adv/next' of git://git.open-mesh.org/linux-merge
Merge branch 'for-davem' of git://git.kernel.org/.../linville/wireless-next-2.6
neigh: Store hash shift instead of mask.
ipv4: Use universal hash for ARP.
Merge branch 'master' of master.kernel.org:/.../jkirsher/net-next-2.6
netdevice: Kill 'feature' test macros.
net: Push protocol type directly down to header_ops->cache()
net: Kill support for multiple hh_cache entries per neighbour
net: Embed hh_cache inside of struct neighbour.
Merge branch 'master' of master.kernel.org:/.../davem/net-2.6
Merge branch 'master' of git://git.kernel.org/.../bwh/sfc-next
Merge branch 'davem-next.r8169' of git://git.kernel.org/.../romieu/netdev-2.6
Merge branch 'for-davem' of git://git.kernel.org/.../linville/wireless-next-2.6
ipv4: Use calculated 'neigh' instead of re-evaluating dst->neighbour
ipv6: Use calculated 'neigh' instead of re-evaluating dst->neighbour
net: Create and use new helper, neigh_output().
neigh: Simply destroy handling wrt. hh_cache.
neigh: Kill neigh_ops->hh_output
neigh: Kill hh_cache->hh_output
neigh: Kill ndisc_ops->queue_xmit
neigh: Pass neighbour entry to output ops.
ipv6: Get rid of rt6i_nexthop macro.
net: Abstract dst->neighbour accesses behind helpers.
net: Add ->neigh_lookup() operation to dst_ops
Merge branch 'davem-next.r8169' of git://git.kernel.org/.../romieu/netdev-2.6
Merge branch 'vhost-net-next' of git://git.kernel.org/.../mst/vhost
Merge branch 'master' of git://git.kernel.org/.../kaber/nf-next-2.6
Merge branch 'master' of master.kernel.org:/.../davem/net-2.6
Merge branch 'master' of master.kernel.org:/.../davem/net-2.6
Merge branch 'master' of master.kernel.org:/.../jkirsher/net-next-2.6
net: Fix ppc64 BPF JIT dependencies.
Merge branch 'vhost-net-next' of git://git.kernel.org/.../mst/vhost
icmp: Fix regression in nexthop resolution during replies.
Dmitry Eremin-Solenikov (3):
fakehard: stop setting platform_data as it's unused anymore
ieee802154: support specifying hw address for created devices
ieee802154: it's IEEE 802.15.4, not ZigBee
Dmitry Kravkov (16):
bnx2x: do not allocate FCoE ring if disabled
bnx2x: remove references to intr_sem
bnx2x: put start bd csum in separate function
bnx2x: avoid release of unrequested irqs
bnx2x: disable fairness if ETS is enabled
bnx2x: dump FW memory when appropriate msglvl is raised
bnx2x: use bnx2x_reload_if_running
bnx2x: removed unused variables
bnx2x: update DCB data during PMF migration
bnx2x: Cosmetic changes.
bnx2x: PFC support for 578xx
bnx2x: Fix compilation when CNIC is not selected in config
bnx2x: add missing command in error handling flow
bnx2x: DCB rework
bnx2x: fix MB index for 4-port devices
bnx2x: disable FCoE for 578xx devices since not yet supported
Dmitry.Tarnyagin (1):
caif: Add CAIF HSI Link layer driver
Don Fry (1):
iwlagn: remove iwlagn_hcmd_utils structure and call directly
Don Skidmore (2):
ixgbe: update driver version string
ixgbe: convert to ndo_fix_features
Eddie Wai (1):
cnic: Randomize initial TCP port for iSCSI connections
Eduardo Bacchi Kienetz (1):
rt2800usb: Add new device ID for Belkin
Eliad Peller (18):
mac80211: add ieee80211_get_operstate() function
mac80211: add cancel_hw_scan() callback
mac80211: quiesce vif before suspending
wl12xx: add support for rx streaming
wl12xx: add automatic rx streaming triggers
wl12xx: add rx_streaming debugfs entry
wl12xx: remove unused crc7 references
wl12xx: fix erroneous commit (cb5ae0)
wl12xx: don't check wow param on suspend/resume
wl12xx: clear wl->wow_enabled on resume
wl12xx: enable/disable beacon filtering on ap suspend/resume
wl12xx_sdio: enable wowlan only if enable_irq_wake() succeeded
wl12xx: check the vif's operstate after join
wl12xx: use _ni version of ieee80211_tx_status
wl12xx: use freezable workqueue for netstack_work
wl12xx: configure suspend/resume only if associated/started
wl12xx: add stop_scan command
wl12xx: implement cancel_hw_scan() callback
Emil Tantilov (5):
ixgbe: add support for Dell CEM
ixgbe: move setting RSC into a separate function
ixgbe: move reset code into a separate function
ixgbe: disable RSC when Rx checksum is off
ixgbe: remove ifdef check for non-existent define
Emmanuel Grumbach (28):
iwlagn: solve sparse warning
iwlagn: free the ICT ISR when the request_irq failed
iwlagn: don't disable interrupts after the NIC has been reset
iwlagn: add a iwl_pci.[ch] files that will contain all PCI specific code
iwlagn: remove uneeded include to pci.h and dma_mapping.h from a few files
iwlagn: introduce iwl_bus and iwl_bus_ops
iwlagn: add get_dev to iwl_bus_ops
iwlagn: move PCI related operations from probe and remove to PCI layer
iwlagn: don't use the PCI wrappers for DMA operation
iwlagn: add a method to get the HW ID description as a string to iwl_bus_ops
iwlagn: don't read the PCI_REVISION_ID from iwl-agn.c
iwlagn: add a get_irq method to iwl_bus_ops and use it
iwlagn: finally kill the pointer to pci_dev from iwl-dev.h
iwlagn: waterfall the bus level if prepare card failed
iwlagn: fix misplaced bracket
iwlagn: warn about nested SYNC commands
iwlagn: store the irq number to iwl_bus just like dev
iwlagn: introduce transport layer and implement rx_init
iwlagn: add rx_free to transport layer
iwlagn: move the tx allocation funcs to the transport layer
iwlagn: remove the indirection for the rx write pointer
iwlagn: remove the CMD_MAPPED flag
iwlagn: add an API to free the TX context
iwlagn: add an API for RX stop
iwlagn: add an API for TX stop
iwlagn: remove code duplication
iwlagn: consolidate the API that sends host commands and move to transport
iwlagn: provide heplers to access the transport ops
Eric Dumazet (23):
inetpeer: remove unused list
inetpeer: lower false sharing effect
snmp: reduce percpu needs by 50%
l2tp: fix l2tp_ip_sendmsg() route handling
veth: fix 64bit stats on 32bit arches
myricom: remove stats_lock
b44: use dev_kfree_skb() in b44_tx()
veth: Kill unused tx_dropped
net: sched: constify tcf_proto and tc_action
sky2: use GFP_KERNEL allocations at device setup
af_packet: lock imbalance
bna: use netdev_alloc_skb_ip_align()
net: introduce __netdev_alloc_skb_ip_align
e1000e: remove e1000_queue_stats
inetpeer: kill inet_putpeer race
be2net: account for skb allocation failures
netfilter: nfnetlink: add RCU in nfnetlink_rcv_msg()
netfilter: nfnetlink_queue: provide rcu enabled callbacks
ipv4: save cpu cycles from check_leaf()
netfilter: nfnetlink_queue: assert monotonic packet ids
ipv6: unshare inetpeers
ipv6: make fragment identifications less predictable
acenic: include NET_SKB_PAD headroom to incoming skbs
Fabrice Deyber (1):
ath9k: Further fix for mesh beaconing
Felipe Balbi (5):
net: wl12xx: sdio: id_tables should be __devinitconst
net: wl12xx: remove some unnecessary prints
net: wl12xx: care for optional operations
net: wl12xx: remove the nops
net: wl12xx: remove unnecessary prints
Felix Fietkau (20):
ath9k: unify edma and non-edma tx code, improve tx fifo handling
ath9k_hw: remove ath9k_hw_get_desc_link
ath9k: show excessive-retry MPDUs in debugfs
ath9k_hw: remove hardcoded PLL overrides for AR9280
ath9k_hw: always enable 5 GHz fast clock for AR9280
ath9k_hw: fix MAC clock for half/quarter rate
ath9k_hw: fix MAC clock rate for AR9287 v1.3+
ath9k_hw: initialize more timing related registers for half/quarter channels
ath9k_hw: remove ar9287 v1.3+ specific hardcoded register hacks
ath9k_hw: set 5 GHz half/quarter channels on AR9002 using fractional mode
ath9k_hw: fix synth delay for half/quarter channels
ath9k_hw: add a missing delay for an analog register
ath5k: add missing checks for rfgain probe
ath5k: apply the synth voltage tweak only on AR5112 rev 2
ath5k: fix reference clock frequency for spur mitigation on AR2413
ath5k: initialize common->clockrate
ath5k: delay full calibration after reset
ath5k: fix reference clock usec duration setting restore
ath5k: disable 32KHz sleep clock operation by default
ath5k: do not call ieee80211_stop_queue for queues not managed by mac80211
Florian Westphal (1):
netfilter: nfnetlink_queue: batch verdict support
Francois Romieu (4):
r8169: move the firmware down into the device private data.
r8169: explicit firmware format check.
r8169: check firmware content sooner.
r8169: fix sticky accepts packet bits in RxConfig.
Fry, Donald H (3):
iwlagn: remove the indirection for update_chain_flags
iwlagn: remove the indirection for iwl_apm_init
iwlagn: remove indirection for eeprom_query_addr
Gabor Juhos (32):
ath9k: define mac version for AR9330
ath9k: define device id for AR9330
ath9k: add MAC revision detection for AR9330
ath9k: add platform device id for AR9330
ath9k: add AR9330 initvals
ath9k: initialize mode registers for AR9330
ath9k: initialize tx gain table for AR9330
ath9k: initialize rx gain table for AR9330
ath9k: add AR9330 specific PLL initialization
ath9k: use different BB watchdog timeout value for AR9330
ath9k: don't enable LDPC for AR9330
ath9k: read spur frequency information from eeprom for AR9330
ath9k: fix channel frequency calculation for AR9340
ath9k: configure RF channel frequency for AR9330
ath9k: enable TX/RX data byte swap for AR9330
ath9k: skip internal regulator configuration for AR9330
ath9k: enable tuning capacitance configuration for AR9330
ath9k: use correct EEPROM base for AR9330
ath9k: configure xpa bias level for AR9330
ath9k: set NF limits for AR9330
ath9k: enable antenna diversity for AR9330
ath9k: use correct max_streams for AR9330
ath9k: add a missing case statement to ath_ant_div_comb_alt_check
ath9k: fix antenna diversity configuration for non AR9485 chips
ath9k: remove superfluous parentheses
ath9k: add fast_div_bias configuration for diversity group 1
ath9k: set diversity group for AR9330
ath9k: fix few register offsets for AR9330
ath9k: configure diversity based on eeprom contents for AR9330
ath9k: configure internal regulator for AR9330
ath9k: add external_reset callback to ath9k_platfom_data for AR9330
ath9k: enable support for AR9330
Geert Uytterhoeven (2):
net/m68k: Include <linux/interrupt.h> where needed
bcma: main.c needs to include <linux/slab.h>
Geoff Levand (1):
net/ps3: Fix gelic RX DMA restart
Gerrit Renker (6):
dccp: Clean up slow-path input processing
dccp: combine the functionality of enqeueing and cloning
dccp: cosmetics of info message
dccp ccid-2: move rfc 3390 function into header file
dccp ccid-2: Use existing function to test for data packets
dccp ccid-2: Perform congestion-window validation
Gertjan van Wingerde (12):
rt2x00: Enable PA_PE bits in TX_PIN_CFG according to active band.
rt2x00: Don't disable G0 PA_PE bit in case of BT coexistence.
rt2x00: Add support for RT3572/RT3592/RT3592+Bluetooth combo card
rt2x00: Interface sequence lock doesn't have to disable interrupts.
rt2x00: Move rt2800_txdone and rt2800_txdone_entry_check to rt2800usb.
rt2x00: Enabled rt35xx device support by default.
rt2x00: Serialize TX operations on a queue.
rt2x00: Don't use queue entry as parameter when creating TX descriptor.
rt2x00: Reduce window of a queue's tx lock.
rt2x00: Add device ID for RT539F device.
rt2x00: Properly identify rt2800usb devices.
rt2x00: Implement tx_frames_pending mac80211 callback function.
Giuseppe CAVALLARO (4):
stmmac: update the version (V2)
stmmac: remove warning when compile as built-in (V2)
stmmac: unify MAC and PHY configuration parameters (V2)
stmmac: improve and up-to-date the documentation
Greg Dietsche (10):
iwlegacy: remove unreachable code
iwlegacy: remove unecessary if statement
iwlegacy: return -EINVAL instead of -1
iwlegacy: propagate error return value
iwlegacy: add missing null check
qlge: remove unecessary if statement
iwlwifi: remove unecessary if statement
net: icplus: remove unnecessary code
e1000: remove unnecessary code
net: rds: fix const array syntax
Greg Rose (3):
rtnetlink: Compute and store minimum ifinfo dump size
ixgbevf: Update the driver string
ixgbevf: Fix bungled declaration of ixgbevf_mbx_ops
Guo-Fu Tseng (3):
jme: Fix compile warning introduced by new pm macro
jme: Cleanup PM operations after using new PM API
jme: Fix unmap error (Causing system freeze)
Gustavo F. Padovan (23):
Bluetooth: fix set but not used warning
Bluetooth: Create __l2cap_chan_close()
Bluetooth: Create l2cap_chan_send()
Bluetooth: Add chan->chan_type struct member
Bluetooth: create channel timer to replace sk_timer
Bluetooth: Remove export of l2cap_chan_clear_timer()
Bluetooth: Rename __l2cap_chan_close() to l2cap_chan_close()
Merge master.kernel.org:/.../padovan/bluetooth-2.6
Bluetooth: Merge l2cap_chan_create() in the l2cap_sock_alloc()
Bluetooth: Add l2cap_chan_ops abstraction
Bluetooth: add recv() callback to l2cap_chan_ops
Bluetooth: add close() callback to l2cap_chan_ops
Bluetooth: Add state tracking to struct l2cap_chan
Bluetooth: Add refcnt to struct l2cap_chan
Bluetooth: Make timer functions generic
Bluetooth: keep reference if any ERTM timer is enabled
Bluetooth: Don't forget to check for LE_LINK
Bluetooth: use bit operation on conf_state
Bluetooth: Use bit operations on conn_state
Bluetooth: Fix locking in blacklist code
Merge master.kernel.org:/.../padovan/bluetooth-2.6
Bluetooth: Fix bad locking balance
Bluetooth: Clean up unused struct hci_conn items
Hans Schillstrom (4):
IPVS remove unused var from migration to netns
IPVS: rename of netns init and cleanup functions.
IPVS: labels at pos 0
IPVS: remove unused init and cleanup functions.
Hauke Mehrtens (3):
ssb: add __devinit to some functions
ssb: fix ssb clock rate according to broadcom source
bcma: add check if sprom is available before accessing it.
Hayes Wang (8):
r8169: support new firmware format.
r8169: adjust some registers.
r8169: modify the flow of the hw reset.
r8169: add ERI functions.
r8169: support RTL8111E-VL.
r8169: fix wake on lan setting for non-8111E.
r8169: don't enable rx when shutdown.
r8169: adjust the RxConfig settings.
Ian Abbott (1):
lib/checksum.c: optimize do_csum a bit
Ido Yariv (4):
wl12xx: Check for FW quirks as soon as the FW boots
wl12xx: Avoid recovery while one is already in progress
wl12xx: Support routing FW logs to the host
wl12xx: Increase low & high TX watermarks
Ilia Kolomisnky (1):
Bluetooth: Fixes l2cap "command reject" reply according to spec
Jaikumar Ganesh (1):
Bluetooth: Add BT_POWER L2CAP socket option.
Jan Engelhardt (1):
netfilter: xt_CT: provide info on why a rule was rejected
Jason Wang (3):
virtio_net: introduce VIRTIO_NET_HDR_F_DATA_VALID
vhost: init used ring after backend was set
vhost: set log when updating used flags or avail event
Javier Lopez (1):
mac80211_hwsim driver support userspace frame tx/rx
Jean Delvare (1):
ipw2100: Fix command list for debugging
Jeff Kirsher (2):
e1000e: use GFP_KERNEL allocations at init time
68360enet: Remove Kconfig/Makefile references
Jeffrey Huang (1):
bnx2: Add MCP dump
Jerry Chu (1):
tcp: RFC2988bis + taking RTT sample from 3WHS for the passive open side
Jesper Juhl (4):
Remove redundant linux/version.h includes from net/
net: Remove unneeded version.h includes from drivers/net/
net, wireless: Don't return uninitialized in __cfg80211_stop_sched_scan()
drivers/net: static should be at beginning of declaration
Jesse Gross (2):
vmxnet3: Convert to new vlan model.
vmxnet3: Enable GRO support.
Jiri Bohac (1):
bonding: clean up bond_del_vlan()
Jiri Pirko (47):
bonding: allow all slave speeds
vlan: finish removing vlan_find_dev from public header
vlan: introduce __vlan_find_dev_deep()
nes: do vlan cleanup
ehea: do vlan cleanup
lro: kill lro_vlan_hwaccel_receive_skb
lro: kill lro_vlan_hwaccel_receive_frags
lro: do vlan cleanup
amd8111e: do vlan cleanup
atl1c: do vlan cleanup
atl1e: do vlan cleanup
bnad: do vlan cleanup
chelsio: do vlan cleanup
cxgb4vf: do vlan cleanup
cxgb4: remove forgotten unused vlan_group
enic: do vlan cleanup
gianfar: do vlan cleanup
igbvf: do vlan cleanup
jme: do vlan cleanup
mlx4: do vlan cleanup
qlge: do vlan cleanup
s2io: do vlan cleanup
spider_net: do not mention dying vlan_hwaccel_receive_skb
tehuti: do vlan cleanup
vlan: kill vlan_hwaccel_receive_skb
ixgbevf: do vlan cleanup
acenic: do vlan cleanup
via-velocity: do vlan cleanup
starfire: do vlan cleanup
ns83820: do vlan cleanup
atl1: do vlan cleanup
atl2: do vlan cleanup
cxgb3: do vlan cleanup
vlan: kill __vlan_hwaccel_rx and vlan_hwaccel_rx
e1000: do vlan cleanup
forcedeth: do vlan cleanup
igb: do vlan cleanup
vxge: do vlan cleanup
qeth: do vlan cleanup
vlan: kill vlan_gro_frags and vlan_gro_receive
stmmac: do vlan cleanup
qlcnic: remove usage of vlan_group_get_device
staging: et131x: remove unused prototype et131x_vlan_rx_register
bonding: do vlan cleanup
macvlan: do vlan cleanup
vlan: kill ndo_vlan_rx_register
vlan: move vlan_group_[gs]et_device to public header
Joe Perches (47):
net: 8021q: Add pr_fmt
net: Remove unnecessary semicolons
drivers/net: Remove unnecessary semicolons
include/net: Remove unnecessary semicolons
net: Remove casts of void *
gianfar: Use pr_<level>, netdev_<level> and netif_<level>
drivers/net: Remove casts of void *
ariadne: Update style, neaten, restructure to eliminate prototypes
a2065: Use pr_fmt, pr_<level> and netdev_<level>
lib8390: Use pr_<level> and netdev_<level>
lib8390: Indent braces appropriately
lib8390: Normalize source code spacing
lib8390: Convert include <asm to include <linux
lib8390: Remove unnecessary extern
zorro8390: Update style, neaten, restructure to eliminate prototypes
generic_hdlc: Update to current logging forms
cosa: Update to current logging forms
cyclom: Update to current logging forms
frame relay dlci/frad: Update to current logging forms
dscc4: Update to current logging forms
farsync: Update to current logging forms
ixp4xx_hss: Update to current logging forms
wan: Update to current logging forms
rt2x00: Fix unspeficied typo
caif: Fix recieve/receive typo
Bluetooth: Rename function bt_err to bt_to_errno
Bluetooth: Add bt_printk
appletalk: Reduce switch/case indent
decnet: Reduce switch/case indent
econet: Reduce switch/case indent
ipconfig: Reduce switch/case indent
netfilter: Reduce switch/case indent
ipv4: Reduce switch/case indent
ipv6: Reduce switch/case indent
lapb: Reduce switch/case indent
netrom: Reduce switch/case indent
sctp: Reduce switch/case indent
sunrpc: Reduce switch/case indent
x25: Reduce switch/case indent
netpoll: Remove unused EXPORT_SYMBOLs of netpoll_poll and netpoll_poll_dev
netpoll: Remove wrapper function netpoll_poll
af_econet: Use current logging styles and neatening
b44: Use pr_<level>_once and DRV_DESCRIPTION
benet: Add missing comma between constant string array
ath5k: Add missing breaks in switch/case
iwlegacy: Add missing comma between constant string array
iwlagn: Add missing comma between constant string array
Johan Hedberg (1):
Bluetooth: Remove unnecessary use of hci_dev_list_lock
Johannes Berg (30):
iwlagn: fix dual-mode RXON
iwlagn: advertise interface combinations
iwlagn: fix interface combinations
Bluetooth: fix sparse & gcc warnings
iwlagn: don't check ucode subtype
netlink: advertise incomplete dumps
nl80211: use netlink consistent dump feature for BSS dumps
iwlagn: use PM ops macro
iwlagn: fix cmd queue unmap
iwlagn: extend host command timeout
iwlagn: fill beacon TX rate properly
iwlagn: don't use CCK rates for P2P interfaces
wireless: unify QoS control field definitions
mac80211: restrict advertised HW scan rates
iwlagn: verify mutex held for sync commands
mac80211: allow driver to impose WoWLAN restrictions
mac80211: allow driver to iterate keys
cfg80211/nl80211: support GTK rekey offload
mac80211: support GTK rekey offload
mac80211: fix TKIP races, make API easier to use
mac80211: fix CCMP races
mac80211: fix CMAC races
mac80211: use AES_BLOCK_SIZE
mac80211: simplify RX PN/IV handling
mac80211: allow drivers to access key sequence counter
mac80211: allow driver to generate P1K for IV32
cfg80211: fix docbook
mac80211: fix docbook
mac80211: allocate only one RX queue
mac80211: allow driver to disconnect after resume
John Fastabend (21):
macvlan: add VLAN filters to lowerdev
ixgbe: dcbnl reduce duplicated code and indentation
ixgbe: consolidate packet buffer allocation
ixgbe: consolidate MRQC and MTQC handling
ixgbe: configure minimal packet buffers to support TC
ixgbe: DCB use existing TX and RX queues
ixgbe: DCB 82598 devices, tx_idx and rx_idx swapped
ixgbe: setup redirection table for multiple packet buffers
ixgbe: fix bit mask for DCB version
ixgbe: DCB and perfect filters can coexist
ixgbe: DCB, remove unneeded ixgbe_dcb_txq_to_tc() routine
dcb: Add DCBX capabilities bitmask to the get_ieee response
net: dcbnl, add multicast group for DCB
dcb: Add ieee_dcb_setapp() to be used for IEEE 802.1Qaz APP data
dcb: Add ieee_dcb_delapp() and dcb op to delete app entry
dcb: Add dcb_ieee_getapp_mask() for drivers to query APP settings
dcb: fix return type on dcb_setapp()
dcb: Add missing error check in dcb_ieee_set()
ixgbe: complete FCoE initialization from setapp() routine
ixgbe: remove unused fcoe.tc field and fcoe_setapp()
ixgbe: implement DCB ops dcb_ieee_del()
John W. Linville (16):
Merge branch 'master' of git://git.kernel.org/.../linville/wireless-2.6
Merge branch 'master' of git://git.kernel.org/.../linville/wireless-next-2.6 into for-davem
Merge branch 'master' of git://git.kernel.org/.../linville/wireless-2.6
Merge branch 'wireless-next-2.6' of git://git.kernel.org/.../iwlwifi/iwlwifi-2.6
ath5k: free sc->ah in ath5k_deinit_softc
Merge branch 'master' of master.kernel.org:/.../padovan/bluetooth-next-2.6
Merge branch 'master' of git://git.kernel.org/.../linville/wireless-next-2.6 into for-davem
Merge branch 'wireless-next-2.6' of git://git.kernel.org/.../iwlwifi/iwlwifi-2.6
Merge branch 'master' of git://git.kernel.org/.../linville/wireless-2.6
Merge branch 'master' of git://git.kernel.org/.../linville/wireless-next-2.6 into for-davem
Merge branch 'for-linville' of git://git.kernel.org/.../luca/wl12xx
Merge branch 'master' of git://git.kernel.org/.../linville/wireless-next-2.6 into for-davem
Merge branch 'for-linville' of git://git.kernel.org/.../luca/wl12xx
Merge branch 'master' of git://git.kernel.org/.../linville/wireless-2.6
Merge branch 'master' of master.kernel.org:/.../padovan/bluetooth-next-2.6
Merge branch 'master' of git://git.kernel.org/.../linville/wireless-next-2.6 into for-davem
Jon Mason (25):
myri_sbus: remove driver
tg3: remove unnecessary read of PCI_CAP_ID_EXP
mlx4: remove unnecessary read of PCI_CAP_ID_EXP
cxgb3: remove unnecessary read of PCI_CAP_ID_EXP
e1000e: remove unnecessary reads of PCI_CAP_ID_EXP
igb: remove unnecessary reads of PCI_CAP_ID_EXP
bnx2: remove unnecessary read of PCI_CAP_ID_EXP
bnx2x: remove unnecessary read of PCI_CAP_ID_EXP
niu: remove unnecessary read of PCI_CAP_ID_EXP
r8169: remove unnecessary read of PCI_CAP_ID_EXP
sky2: remove unnecessary reads of PCI_CAP_ID_EXP
vxge: remove unnecessary reads of PCI_CAP_ID_EXP
myri10ge: ensure tx queues remain stopped
myri10ge: Mask PCI Surprise Link Down Events
myri10ge: rework parity error check and cleanup
myri10ge: allow small_bytes = 0
myri10ge: add support for set_phys_id
myri10ge: remove unnecessary read of PCI_CAP_ID_EXP
myri10ge: misc style cleanups
myri10ge: update version
myri10ge: Update MAINTAINERS
iwlegacy: remove unnecessary read of PCI_CAP_ID_EXP
rtlwifi: remove unnecessary read of PCI_CAP_ID_EXP
rtlwifi: use PCI_VENDOR_ID_*
iwlwifi: remove unnecessary read of PCI_CAP_ID_EXP
Jozsef Kadlecsik (17):
netfilter: ipset: timeout can be modified for already added elements
netfilter: ipset: whitespace fixes: some space before tab slipped in
netfilter: ipset: options and flags support added to the kernel API
netfilter: ipset: support listing setnames and headers too
netfilter: ipset: fix adding ranges to hash types
netfilter: ipset: set type support with multiple revisions added
netfilter: ipset: support range for IPv4 at adding/deleting elements for hash:*net* types
netfilter: ipset: adding ranges to hash types with timeout could still fail, fixed
netfilter: ipset: take into account cidr value for the from address when creating the set
netfilter: ipset: use unified from/to address masking and check the usage
netfilter: ipset: add xt_action_param to the variant level kadt functions, ipset API change
netfilter: ipset: fix return code for destroy when sets are in use
netfilter: ipset: use the stored first cidr value instead of '1'
netfilter: ipset: hash:net,iface type introduced
netfilter: ipset: whitespace and coding fixes detected by checkpatch.pl
netfilter: ipset: make possible to hash some part of the data element only
netfilter: ipset: hash:net,iface fixed to handle overlapping nets behind different interfaces
Julian Anastasov (1):
ipvs: support more FTP PASV responses
Jussi Kivilinna (6):
zd1211rw: fix invalid signal values from device
zd1211rw: make 'handle_rx_packet: invalid, small RX packet' message debug-only
zd1211rw: only update HW beacon if new beacon differs from currect
zd1211rw: handle lost read-reg interrupts
zd1211rw: don't let zd_mac_config_beacon() run too long from beacon interrupt handler
zd1211rw: detect stalled beacon interrupt faster
Kalle Valo (4):
iwlegacy: fix stop/wake queue hacks
iwlwifi: fix stop/wake queue hacks
zd1211rw: include mac80211.h from zd_chip.h
rtlwifi: include mac80211.h from core.h
Krishna Kumar (2):
Remove redundant variable/code in __qdisc_run
virtio_net: Fix panic in virtnet_remove
Kuninori Morimoto (1):
net: sh_eth: tidyup compile warning
Kurt Van Dijck (1):
can: remove useless defaults in Kconfig
Larry Finger (17):
b43: Fix warnings from gcc 4.6.0
rtlwifi: Fix warnings from gcc 4.6.0
rtl8192c-common: Fix warnings from gcc 4.6.0
rtl8192ce: Fix warnings from gcc 4.6.0
rtl8192cu: Fix warnings from gcc 4.6.0
rtl8192se: Fix warnings from gcc 4.6.0
b43legacy: Fix warnings from gcc 4.6.0
rtlwifi: rtl8192se: Use write barrier when assigning ownership
rtlwifi: rtl8192se: Synchronize IRQ after disabling it
rtlwifi: Fix warnings on parisc arch
rtlwifi: Fix build problems introduced by merging rtl8192de
rtlwifi: rtl8192de: Fix build errors when using allyes configuration
rtlwifi: rtl8192de: Remove irq_enabled boolean
rtlwifi: rtl8192de: Remove comparison of boolean with true
rtlwifi: rtl8192de: Replace loops calling udelay with single mdelay
rtlwifi: rtl8192de: Fix error exit from hw_init
rtlwifi: rtl8192cu: Fix duplicate if test
Lauro Ramos Venancio (3):
NFC: add nfc subsystem core
NFC: add nfc generic netlink interface
NFC: add the NFC socket raw protocol
Lior Levy (1):
ixgbe: A fix to VF TX rate limit
Luciano Coelho (2):
wl12xx: split channel array per band in sched_scan
cfg80211: return -ENOENT when stopping sched_scan while not running
Luis R. Rodriguez (1):
cfg80211: skip disabled channels on channel survey
Luiz Augusto von Dentz (1):
Bluetooth: fix shutdown on SCO sockets
Manuel Zerpies (2):
net/can: use printk_ratelimited() instead of printk_ratelimit()
net/rds: use prink_ratelimited() instead of printk_ratelimit()
Marc Kleine-Budde (10):
can: at91_can: don't align struct definitions
can: at91_can: fix comment about priv->tx_next
can: at91_can: don't copy data to rx'ed RTR frames
can: at91_can: let get_tx_* functions return unsigned int
can: at91_can: directly define AT91_MB_RX_LAST
can: at91_can: rename AT91_MB_RX_MASK to AT91_IRQ_MB_RX
can: at91_can: convert derived mailbox constants into functions
can: at91_can: add id_table and convert prime mailbox constats to functions
can: at91_can: register mb0 sysfs entry only on at91sam9263
can: at91_can: add support for the AT91SAM9X5 SOCs
Marek Lindner (3):
batman-adv: use NO_FLAGS define instead of hard-coding 0
batman-adv: broadcast primary OGM on all active hard-interfaces
batman-adv: aggregation checks should use the primary_if pointer
Marek Vasut (1):
ASIX: Add AX88772B USB ID
Mat Martineau (8):
Bluetooth: Restore accidentally-deleted line
Bluetooth: Fix check for the ERTM local busy state
Bluetooth: Fix indentation whitespace
Bluetooth: ERTM timeouts need to be converted to jiffies
Bluetooth: Check earlier for L2CAP ERTM frames to drop
Bluetooth: Move code for ERTM local busy state to separate functions
Bluetooth: Use event-driven approach for handling ERTM receive buffer
Bluetooth: Remove L2CAP busy queue
Matt Carlson (23):
tg3: Workaround tagged status update bug
tg3: Remove 40BIT_DMA_LIMIT_BUG
tg3: Remove 4G_DMA_BNDRY_BUG flag
tg3: Add more selfboot formats to NVRAM selftest
tg3: Fix EEE debounce timer values
tg3: Show flowctrl settings through get_settings()
tg3: Migrate phy preprocessor defs to system defs
tg3: Create funcs for power source switching
tg3: Detect APE enabled devs earlier
tg3: Move power state transitions to init_one
tg3: Check transitions to D0 power state
tg3: Determine PCI function number in one place
tg3: Create critical section around GPIO toggling
tg3: Add function status reporting
tg3: Match power source to driver state
tg3: Fix io failures after chip reset
tg3: Fix link flap at 100Mbps with EEE enabled
tg3: Fix link down notify failure when EEE disabled
tg3: Add 5719 and 5720 to EEE_CAP list
tg3: Fix RSS indirection table distribution
tg3: Fix int selftest for recent devices.
tg3: Return size from tg3_vpd_readblock()
tg3: Fix NVRAM selftest failures for 5720 devs
Matt Evans (1):
net: filter: BPF 'JIT' compiler for PPC64
Matvejchikov Ilya (6):
slip: remove redundant NULL-pointer check before calling slhc_free
slip: fix MTU comparation operation when reallocating buffers
slip: remove redundant check slip_devs for NULL
slip: remove dead code within the slip initialization
slip: remove unused 'line' field from the 'slip' structure
slcan: remove unused 'leased', 'line' and 'pid' fields from the 'slcan' structure
Max Matveev (2):
Update description of net.sctp.sctp_rmem and net.sctp.sctp_wmem tunables
Update documented default values for various TCP/UDP tunables
Meenakshi Venkataraman (2):
mac80211: add driver RSSI threshold events
iwlagn: Enable/disable PS poll based on RSSI and BT coex traffic state
Michael Büsch (1):
b43: Add RX side DMA memory barrier
Michael Chan (16):
cnic: Fix interrupt logic
cnic: Fix race conditions with firmware
cnic: Improve NETDEV_UP event handling
cnic, bnx2: Check iSCSI support early in bnx2_init_one()
cnic: Move indexing function pointers to struct kcq_info
cnic, bnx2i: Add support for new devices - 57800, 57810, and 57840
cnic: Replace get_random_bytes() with random32()
cnic: Fix port_mode setting
cnic: Fix ring setup/shutdown code
cnic: Return proper error code if we fail to send netlink message
bnx2: Read iSCSI config from shared memory during ->probe()
bnx2: Close device if tx_timeout reset fails
cnic: Fix Context ID space calculation
cnic: Wait for all Context IDs to be deleted before sending FCOE_DESTROY_FUNC
cnic: Add VLAN ID as a parameter during netevent upcall
bnx2: Fix endian swapping on firmware version string
Michael S. Tsirkin (4):
vhost: vhost TX zero-copy support
vhost: fix zcopy reference counting
vhost: optimize interrupt enable/disable
vhost-net: update used ring on backend change
Michal Simek (1):
net: emaclite: Add missing linux/interrupt.h header
Michał Mirosław (9):
e1000: convert to ndo_fix_features
igb: convert to ndo_fix_features
net: Add documentation for netdev features handling
net: m68k/nfeth: Remove wrong usage of dev->flags
net: vlan: remove reduntant check in ndo_fix_features callback
net: cleanup vlan_features setting in register_netdev
net: unexport netdev_fix_features()
net: remove /sys/class/net/*/features
net: remove SK_ROUTE_CAPS from meta ematch
Michio Honda (6):
sctp: Add ADD/DEL ASCONF handling at the receiver.
sctp: Add Auto-ASCONF support (core).
sctp: Add sysctl support for Auto-ASCONF.
sctp: Add socket option operation for Auto-ASCONF.
sctp: Add ASCONF operation on the single-homed host
sctp: kzalloc() error handling on deleting last address
Mike Frysinger (2):
can: bfin_can: simplify xmit id1 setup
can: bfin_can: auto-calculate accessor sizes
Mike McCormack (16):
rtlwifi: Synchronize IRQ after disabling it
rtlwifi: Remove set_rfpowerstate_inprogress
rtlwifi: Store loop index in local variable
rtlwifi: Run IPS leave work in a tasklet
rtlwifi: Don't block interrupts in spinlocks
rtlwifi: Assign rx buffer ownership to hardware last
rtlwifi: Use write barrier when assigning ownership
rtlwifi: Fix logic in rx_interrupt
rtlwifi: Remove unnecessary indent
rtlwifi: Resubmit skbs with bad CRC early
rtlwifi: Free skb in one place
rtlwifi: Factor out code to receive one packet
rtlwifi: Fix typo in variable name
rtlwifi: rtl8192cu: Remove unused parameter
rtlwifi: rtl8192{c,ce,cu,se}: Remove comparisons of booleans with true
rtlwifi: rtl8192{ce,cu,se} Remove irq_enabled
Mohammed Shafi Shajakhan (19):
ath9k: remove redundant if check
ath9k: make ath9k_setpower function as static
ath9k: mark few functions as static
ath9k: wake up chip before initializing PAPRD table
ath9k: Add a debug entry to start/stop ANI
ath9k: better position PAPRD debug message
ath9k: make use of a helper to get paprd scale factor
ath9k: Add debug messages to track PAPRD failures
ath9k: remove a redundant call to pcipowersave
ath9k: Fix a corner case failure in sending PAPRD frames in HT40
ath9k_hw: make sure PAPRD training is properly done
ath9k_hw: Fix calculation of PAPRD training power at 5Ghz
ath9k_hw: Add carrier leak correction in desired gain calculation
ath9k_hw: make use of the gain_table_entry macro
ath9k: move few descriptor macros to ath9k.h
ath9k_htc: Add device ID for Sony UWA-BR100
ath9k_hw: Disable PAPRD based on paprd_ht20_mask for 5GHz
ath9k: remove an unnecessary function declaration
mac80211: remove a redundant check
Mr Dash Four (1):
netfilter: add SELinux context support to AUDIT target
Neil Horman (1):
vmxnet3: remove unused variable
Nicolas Schichan (1):
e1000: always call e1000_check_for_link() on e1000_ce4100 MACs.
Nikanth Karthikesan (1):
if_spi: Fix compilation warning - unused variable
Ohad Ben-Cohen (2):
wl12xx: don't bail if mmc isn't MMC_CAP_POWER_OFF_CARD
wl12xx: one SDIO initialization is enough
Oliver Hartkopp (1):
slcan: remove obsolete code in slcan initialisation
Olivier Sobrie (1):
libertas: fix errors in functions accessing module registers
Oz Krakowski (1):
wl12xx: fix Tx security sequence number handling
Padmanabh Ratnakar (1):
be2net: Enable NETIF_F_TSO6 for VLAN traffic for BE
Patrick McHardy (2):
Merge branch 'master' of /repos/git/net-next-2.6
Merge branch 'master' of git://git.kernel.org/.../horms/ipvs-next-2.6
Paul Gortmaker (1):
ip: introduce ip_is_fragment helper inline function
Paul Stewart (3):
cfg80211: Ignore downstream DEAUTH for authtry_bsses
mac80211: Start monitor work on restart
mac80211: Drop DS Channel PARAM in directed probe
Pavel Roskin (19):
ath9k: use standard max(), remove A_MAX macro
ath9k: typo fix in a comment
ath5k: minor cleanup
ath5k: annotate reg in ath5k_hw_nic_reset() as __iomem
ath5k: add missing ieee80211_free_hw() on unload in AHB code
ath5k: remove PRIV_ENTRY and PRIV_ASSIGN macros, they obfuscate the code
ath5k: replace spaces with tabs as suggested by checkpatch.pl
ath5k: remove unneeded parentheses after return
ath5k: use KERN_WARNING in ATH5K_PRINTF
ath5k: use DEFINE_PCI_DEVICE_TABLE in led.c, mark users with __devinit
ath5k: use more readable way to clear MAC address
ath5k: don't use volatile, it's not needed
ath5k: use parentheses around macro definitions
ath5k: fix misplaced or extraneous braces found by checkpatch.pl
ath5k: fix formatting errors found by checkpatch.pl
ath5k: use kstrtoint() to parse numbers coming from sysfs
ath5k: read sc->imask with sc->irqlock held
ath5k: validate mode in ath5k_ani_init() before trying to set it
ath5k: fix typos, bad comment formatting and GHz in place of MHz
Peter Pan(潘卫平) (6):
bonding: make 802.3ad use latest lacp_rate
bonding:delete lacp_fast from ad_bond_info
bonding:delete agg_select_mode from ad_bond_info
bonding: delete unused ad_timer
bonding: delete unused arp_mon_pt
bonding:delete a dereference before check
Po-Yu Chuang (1):
net: add Faraday FTGMAC100 Gigabit Ethernet driver
Rafał Miłecki (60):
b43: rename ssb_device variable in ssb specific functions
b43: add bus device abstraction layer
b43: bus: abstract R/W operations
b43: bus: abstract 80211 core info
b43: bus: abstract SPROM
b43: bus: abstract device structs and irq
b43: bus: abstract chip info
b43: bus: abstract board info
b43: bus: abstract bus and core operations
bcma: add IRQ number and pointer to DMA dev
bcma: pci: implement interrupts control
b43: LP-PHY: use new pointers path to access ssb_device
b43: SDIO: use new pointers path to access ssb_device
b43: use new pointers path to access ssb_device in SSB specific places
b43: bus: add helpers for checking host type
bcma: host pci: implement block R/W operations
b43: do not use SSB specific flags when calling core reset function
bcma: read SPROM and extract MAC from it
b43: add an option to register BROKEN bcma driver
b43: add BCMA 80211 core specific defines
b43: define new PHYs and radio regs for cores >= 24
b43: HT-PHY: add place for writing HT PHY support
b43: add Kconfig option for compiling SSB driver
b43: HT-PHY: implement radio ops
b43: HT-PHY: implement switching analog
bcma: enable support for 14e4:4357 (BCM43225)
bcma: fix BCM43224 rev 0 workaround
bcma: clean exports of functions
b43: HT-PHY: implement killing radio
b43: HT-PHY: enable radio
b43: HT-PHY: define standard structs for channel switching
b43: HT-PHY: add place for implementing channel switching
b43: HT-PHY: switch radio to requested channel
b43: N-PHY: update switching analog on/off
b43: N-PHY: move declarations of chantables functions to correct files
b43: HT-PHY: calibrate radio after switching channel
b43: HT-PHY: prepare place for HT-PHY tables
b43: HT-PHY: upload PHY values when switching channel
b43: HT-PHY: perform some tables ops on channel switching
b43: HT-PHY: add channel switching tables for 2 GHz band
b43: HT-PHY: implement lacking 0x908 PHY reg op
b43: HT-PHY: replace radio routing magic numbers
b43: HT-PHY: init radio when enabling it
b43: HT-PHY: add init tables
b43: HT-PHY: basic PHY init
b43: HT-PHY: correct 0x2059 radio init
bcma: detect PCI core working in hostmode
b43: make b43_wireless_init bus generic
b43: implement BCMA bus ops
b43: use switches for SSB specific code
b43: handle BCMA in bus switches
b43: bus: add helpers for getting/setting wldev from/in bus core
b43: change selecting ucode for newer cores
b43: select BLOCKIO for BCMA
b43: use radio ID reading code to older cores only
b43: read radio ID on new cores
b43: LCN-PHY add place for new PHY support
b43: define firmwares for HT and LCN PHYs
b43: LCN-PHY: include new PHY in common code
b43: HT-PHY: define dummy TX power functions
Rajkumar Manoharan (10):
ath9k: Remove ATH9K_BEACON_PERIOD mask
ath9k: Handle IBSS status changes in BSS_CHANGED_IBSS
ath9k_hw: Fix false tx hung detection in AR9003 chips
ath9k: Fix locking issue during tx completion
ath9k_htc: do not configure filter before driver is started
mac80211: Restart STA timers only on associated state
ath9k_hw: Update AR9003 interval to improve 5G Tx EVM
ath9k_hw: Disable power detector calibration for AR9003
ath9k_hw: Remove read-only registers from AR9003 intervals
ath9k_htc: Inform stack about tx ack status
Randy Dunlap (3):
irda: fix smsc-ircc2 section mismatch warning
Bluetooth: uses crypto interfaces, select CRYPTO
bluetooth: uses crypto interfaces, select CRYPTO
Richard Cochran (29):
net: export time stamp utility function for Ethernet MAC drivers
fec: enable transmit and receive time stamping.
davinci_emac: pass ioctls through to phy device.
davinci_emac: enable transmit time stamping.
tg3: enable transmit time stamping.
dnet: enable transmit time stamping.
ethoc: enable transmit time stamping.
r6040: enable transmit time stamping.
stmmac: enable transmit time stamping.
smsc9420: enable transmit time stamping.
net: correct comment on where to place transmit time stamp hook.
fec: fix race in transmit time stamping.
tg3: fix race in transmit time stamping.
r6040: fix race in transmit time stamping.
stmmac: fix race in transmit time stamping.
smsc9420: fix race in transmit time stamping.
davinci_emac: fix race in transmit time stamping.
net: export the receive time stamping hook for non-NAPI drivers
lib8390: enable transmit and receive time stamping.
emaclite: enable transmit and receive time stamping.
ll_temac: enable transmit and receive time stamping.
fec_mpc52xx: enable transmit and receive time stamping.
macb: enable transmit time stamping.
fs_enet: enable transmit time stamping.
smsc911x: enable transmit time stamping.
pxa168_eth: enable transmit time stamping.
ucc_geth: enable transmit time stamping.
mv643xx_eth: fix race in trasmit path.
mv643xx_eth: enable transmit time stamping.
Robert Healy (1):
igb: Fix for DH89xxCC near end loopback test
Roopa Prabhu (1):
enic: Add support for MTU change via port profile on a dynamic vnic
Ruiyi Zhang (1):
Bluetooth: Allow unsegmented SDU retries on sock_queue_rcv_skb failure
Sathya Perla (8):
be2net: support multiple TX queues
be2net: fix netdev_stats_update
be2net: get rid of multi_rxq module param
be2net: fix initialization of vlan_prio_bmap
be2net: fix certain cmd failure logging
be2net: create/destroy rx-queues on interface open/close
be2net: clear intr bit in be_probe()
be2net: request native mode each time the card is reset
Satoru Moriya (2):
udp: add tracepoints for queueing skb to rcvbuf
core: add tracepoints for queueing skb to rcvbuf
Sebastian Andrzej Siewior (1):
net/b43: don't return IRQ_HANDLED if nothing was done
Sebastian Poehn (2):
gianfar v5: implement nfc
gianfar v2: code cleanups
Selvin Xavier (1):
be2net: Fix Rx pause counter for lancer
Senthil Balasubramanian (1):
ath9k_hw: Fix incorrect key_miss handling
Sergei Shtylyov (7):
ssb: use pci_dev->revision
iwlwifi: use pci_dev->revision, again
mlx4: use pci_dev->revision
ssb: PCI revision ID register is 8-bit wide
ssb: use pci_dev->revision
ssb: use pci_dev->subsystem_{vendor,device}
lanai: use pci_dev->subsystem_device
Shahar Levi (4):
mac80211: Stop BA session event from device
wl12xx: Stop BA session event from device
wl12xx: Enable beacon early termination in 2.4GHz band only
wl12xx: Add Support for Low Power DRPw (LPD) Mode
Shan Wei (4):
net: Kill unuseful net/TUNABLE doc in kernel source
net: Add GSO to vlan_features initialization
net: fix warning of versioncheck
net: doc: fix compile warning of no format arguments in ifenslave.c
Shiraz Hashim (1):
stmmac: add memory barriers at appropriate places
Shirley Ma (5):
sock.h: Add a new sock zero-copy flag
skbuff: skb supports zero-copy buffers
macvtap: macvtapTX zero-copy support
skbuff: clear tx zero-copy flag
vhost: handle wrap around in # of bufs math
Shmulik Ravid (3):
dcbnl: Aggregated CEE GET operation
dcbnl: Add CEE notification
bnx2x: Add dcbnl notification
Shreyas Bhatewara (2):
vmxnet3: set netdev parant device before calling netdev_info
vmxnet3: fix publicity of NETIF_F_HIGHDMA
Shyam Iyer (1):
Separate handling of irq type flags variable from the irq_flags request_irq variable
Somnath Kotur (1):
be2net: Fallback to the older opcode if MCC_CREATE_EXT opcode is not supported on the card
Srinivas Kandagatla (1):
stmmac: Allow SOCs to use Store forward mode eventhough tx_coe is 0. (V2)
Sritej Velaga (3):
qlcnic: Add capability to take FW dump deterministically
qlcnic: fix chip reset logic
qlcnic: updated supported cards information
Stanislaw Gruszka (10):
iwlagn: refactor iwlagn_mac_channel_switch
iwlegacy: remove unused power commands defines
iwlegacy: remove recover from statistics
iwlegacy: remove reset rf infrastructure
iwlegacy: remove firmware event log
iwlegacy: remove unused agg_tids_count
iwlegacy: refactor iwl4965_mac_channel_switch
rt2x00: fix possible memory corruption in case of invalid rxdesc.size
rt2x00: reset usb devices at probe
iwlagn: fix rmmod crash
Stephen Boyd (1):
Bluetooth: Silence DEBUG_STRICT_USER_COPY_CHECKS=y warning
Stephen Hemminger (1):
ixgbevf: remove unnecessary ampersands
Stephen Rothwell (5):
net: add needed interrupt.h
net/staging: add needed interrupt.h and hardirq.h includes
Bluetooth: include scatterlist.h where needed
net: include io.h in sja1000_of_platform.c for iounmap etc
net: include dma-mapping.h in ll_temac_main.c for dma_map_single etc
Steve Hodgson (1):
sfc: Fix Siena mac statistics on big endian platforms
Steven.Li (1):
Bluetooth: Add Atheros AR3012 one PID/VID supported
Sucheta Chakraborty (5):
netxen: suppress false lro warning messages
qlcnic: fix initial number of msix entries in adapter.
qlcnic: multi protocol internal loopback support added.
qlcnic: enable mac-learning in promiscous mode.
qlcnic: fix race in skb->len access.
Sven Eckelmann (21):
batman-adv: Use kzalloc rather than kmalloc followed by memset with 0
batman-adv: Annotate functions with format strings
batman-adv: Print jiffies as unsigned long
batman-adv: Remove comparising < 0 for unsigned type
batman-adv: Don't do pointer arithmetic with void*
batman-adv: Add const type qualifier for pointers
batman-adv: Only use int up and down gw representation
batman-adv: Remove explicit casts cast from void* for store
batman-adv: Remove casts from type x to type x
batman-adv: Calculate sizeof using variable insead of types
batman-adv: Use rcu_dereference_protected by update-side
batman-adv: Check type of x and y in seq_(before|after)
batman-adv: Ensure that we really have route changes in update_route
batman-adv: Don't return value in void function
batman-adv: Fix signedness problem in parse_gw_bandwidth
batman-adv: Rewrite debugfs kobj_to_* helpers as functions
batman-adv: Use enums for related constants
batman-adv: Move compare_orig to originator.c
batman-adv: Keep interface_tx as local function
batman-adv: Reduce usage of char
batman-adv: Replace version info instead of appending them
Thadeu Lima de Souza Cascardo (1):
can: make function can_get_bittiming static
Thomas Graf (1):
rtnl: provide link dump consistency info
Tobias Klauser (15):
net: am79c961a: Omit check for multicast bit in netdev_for_each_mc_addr
net: depca: Omit check for multicast bit in netdev_for_each_mc_addr
net: iseries_veth: Omit check for multicast bit in netdev_for_each_mc_addr
net: ucc_geth: Omit check for multicast bit in netdev_for_each_mc_addr
net: de4x5: Omit check for multicast bit in netdev_for_each_mc_addr
net: e1000e: Use is_multicast_ether_addr helper
net: de4x5: Use helpers from linux/etherdevice.h
net: igb: Use is_multicast_ether_addr helper
net: iseries_veth: Use is_unicast_ether_addr helper
net: rionet: Use is_multicast_ether_addr
net: depca: Use helpers from linux/etherdevice.h
net: ewrk3: Use helpers from linux/etherdevice.h
net: vxge: Use is_multicast_ether_addr helper
net/wireless: ipw2x00: Use helpers from linux/etherdevice.h
drivers/net: Omit check for multicast bit in netdev_for_each_mc_addr
Uwe Kleine-König (1):
net/can: allow CAN_AT91 on AT91SAM9X5
Vasanthy Kolluri (5):
enic: Pass 802.1p bits for packets tagged with vlan zero
enic: Log device configuration in detail during driver load
enic: Get/Set interrupt resource index for transmit and receive queues
enic: Bug Fix: Fix hardware transmit queue indexing in enic_poll_controller
enic: Add support to configure hardware interrupt coalesce timers in a platform independent way
Vasu Dev (1):
ixgbe: setup per CPU PCI pool for FCoE DDP
Ville Tervo (1):
Bluetooth: Do not send SET_EVENT_MASK for 1.1 and earlier devices
Vincent Zweije (1):
networking: fix warning about unused label wake_up
Vinicius Costa Gomes (25):
Bluetooth: Add support for using the crypto subsystem
Bluetooth: Add support for LE Start Encryption
Bluetooth: Remove debug statements
Bluetooth: Add support for resuming socket when SMP is finished
Bluetooth: Fix initial security level of LE links
Bluetooth: Update the security level when link is encrypted
Bluetooth: Add support for building pairing commands
Bluetooth: Add support for Pairing features exchange
Bluetooth: Add support for SMP timeout
Bluetooth: Add key size checks for SMP
Bluetooth: Fix crash when setting a LE socket to ready
Bluetooth: Remove useless access to the socket
Bluetooth: Fix not setting the chan state
Bluetooth: Add support for SMP phase 3 (key distribution)
Bluetooth: Add new structures for supporting SM key distribution
Bluetooth: Add functions to manipulate the link key list for SMP
Bluetooth: Reject an encryption request when the key isn't found
Bluetooth: Fix SM pairing parameters negotiation
Bluetooth: Add support for storing the LTK
Bluetooth: Use the link key list to temporarily store the STK
Bluetooth: Use the stored LTK for restabilishing security
Bluetooth: Remove unused field in hci_conn
Bluetooth: Add support for communicating keys with userspace
Bluetooth: Add support for storing the key size
Bluetooth: Add support for returning the encryption key size
Vitaliy Ivanov (1):
net: wimax: Remove of unused 'rfkill_input' pointer
Vlad Zolotarov (1):
New 7.0 FW: bnx2x, cnic, bnx2i, bnx2fc
Vladislav Zolotarov (14):
bnx2x: Created bnx2x_sp
bnx2x: 57712 parity handling
bnx2x: Update date to 2011/06/13 and version to 1.70.00-0
bnx2x: use correct dma_sync function
bnx2x: stop tx before CNIC_STOP
bnx2x: remove unnecessary dma_sync
bnx2x: disable loacal BH when scheduling FCOE napi
bnx2x: use BNX2X_Q_FLG_TPA_IPV6 for TPA queue configuration
bnx2x: fix memory barriers
bnx2x: Implementation for netdev->ndo_fcoe_get_wwn
bnx2x: Fixed ethtool -d for 578xx
bnx2x: Read FIP mac from SHMEM in single function mode
bnx2x: Parity errors recovery for 578xx
bnx2x: Broken self-test in SF mode on 578xx
Waldemar Rymarkiewicz (6):
Bluetooth: Fix auth_complete_evt for legacy units
Bluetooth: Refactor hci_auth_complete_evt function
Bluetooth: Remove a magic number
Bluetooth: Verify a pin code in pin_code_reply
Bluetooth: Simplify hci_conn_accept_secure check
Bluetooth: Clean up some code style issues
Wang Shaoyan (1):
ATM: Delete no use FILL_RX_POOLS_IN_BH marco
Werner Almesberger (1):
IEEE 802.15.4: do not enable driver debugging by default
Wey-Yi Guy (52):
nl80211: add testmode dump support
iwlagn: send tx power command if defer cause by RXON not match
iwlagn: remove un-necessary tx power ops
iwlagn: change the logging level for aggregation enable check
iwlagn: change log to better represent the state of aggregation process
iwlagn: save the latest smps mode
iwlagn: set smps mode after assoc for 1000 device
iwlagn: move all post scan functions in one place
iwlagn: direct call to post_scan function
iwlagn: call commit_rxon function directly
iwlagn: usersapce application decide the size of trace buffer
iwlagn: add dumpit support for testmode trace function
iwlagn: move bt_coex_active as part of iwlagn_mod_params
iwlagn: move led_mode as part of iwlagn_mod_params
iwlagn: move no_sleep_autoadjust as part of iwlagn_mod_params
iwlagn: Band capabilities in EEPROM
iwlagn: use sku capabilities information from EEPROM
iwlagn: add coex debug flag
iwlagn: add debug message for coex related activities
iwlagn: use IWL_DEBUG_TEMP for temperature related debug
iwlagn: use IWL_DEBUG_FW for firmware related debug msg
iwlagn: remove unused debug flag
iwlagn: generic temperature location in EEPROM
iwlagn: group similar defines together
iwlagn: merge duplicated code into single place
iwlagn: Sanity check for 11n capability
iwlagn: Sanity check for valid context
iwlagn: Remove un-necessary indirect call
iwlagn: add PAN to tx flush
iwlagn: Support flush queues for specified interface
iwlagn: move PCI power related functions to the PCI layer
iwlagn: add power_save module parameter
iwlagn: Add power_level module parameter
iwlagn: add offset define for subsystem id
iwlagn: code alignment
iwlagn: merge duplicate code into single function
iwlagn: remove incorrect define
iwlagn: re-define the testmode cmd and attr enum
iwlagn: add correct firmware name for 135 series
iwlagn: add module parameter to disable stuck queue watchdog timer
iwlagn: scd memory boundary
iwlagn: call bt_coex directlly
iwlagn: remove hcmd ops
iwlagn: remove the indirection for the dma channel num
iwlagn: remove double level temperature indirect call
iwlagn: use bt handler for 2030 and 135 series devices
iwlagn: declare static
iwlagn: add CMD_ON_DEMAND flag for host command from testmode
iwlagn: allow application own the uCode operation
iwlagn: block regular host commands if driver don't own uCode
iwlagn: separate and enhance the fixed rate from
iwlagn: fix warning in testmode attribute table
Williams, Mitch A (1):
igbvf: update version number
YOSHIFUJI Hideaki (1):
sctp: Allow regular C expression in 4th argument for SCTP_DEBUG_PRINTK_IPADDR macro.
Yaniv Rosner (27):
bnx2x: Add new phy BCM8722
bnx2x: Fix port type display
bnx2x: Change return status type
bnx2x: Add TX fault check for fiber PHYs
bnx2x: Fix over current port display
bnx2x: Fix BCM84833 settings
bnx2x: Fix grammar and relocate code
bnx2x: Adjust BCM8726 module detection settings
bnx2x: Fix link status sync
bnx2x: Modify XGXS functions
bnx2x: Improve cl45 access methods
bnx2x: do not call link update without HW notification
bnx2x: Add new MAC support for 578xx
bnx2x: Add Warpcore support for 578xx
bnx2x: Add new PHY 54616s
bnx2x: Adjust ETS to 578xx
bnx2x: Adjust BCM84833 to BCM578xx
bnx2x: Add a periodic task for link PHY events
bnx2x: Rename LASI registers to definitions in mdio.h
bnx2x: PFC fixes
bnx2x: Change BCM54616S to BCM54618SE
bnx2x: Add CL37 BAM for Warpcore
bnx2x: Reset PHY due to fan failure for 578xx
bnx2x: Fix false link indication at link partner when DAC is used
bnx2x: Fix BCM84833 initialization
bnx2x: Add autogrEEEn support
bnx2x: Fix warning message during 57712/8727 initialization
Yogesh Ashok Powar (7):
mwifiex: remove list traversal in mwifiex_num_pkts_in_txq
mwifiex: Remove redundant skb_queue_empty checks
mwifiex: adding check for enough space before padding
mwifiex: disable transmission buffer aggregation for AMSDU packets
mac80211: Skip tailroom reservation for full HW-crypto devices with race fix
mwifiex: 4-byte alignment in mwifiex_process_sta_txpd()
mwifiex: add cfg80211 handler for set_bitrate_mask
Yoshihiro Shimoda (1):
net: sh_eth: remove __flush_purge_region
Zefir Kurtisi (1):
minstrel_ht: fixed rate mode through debugfs
françois romieu (1):
8139cp: convert to new VLAN model.
jamal (1):
net_sched: fix dequeuer fairness
stephen hemminger (24):
iph: use default get_stats
ipv6: generate link local address for GRE tunnel
vmxnet3: convert to 64 bit stats interface
veth: convert to 64 bit statistics
netxen: convert to 64 bit statistics
enic: update to support 64 bit stats
myricom: update to 64 bit stats
niu: support 64 bit stats interface
tun: reserves space for network in skb
tun: dont force inline of functions
ifb: convert to 64 bit stats
vxge: fix 64 bit access on 32 bit platforms
xen: convert to 64 bit stats interface
bonding: add min links parameter to 802.3ad
virtio-net: per cpu 64 bit stats (v2)
skge: cleanup pci id table
add pci-id for DGE-530T
skge: make support for old Genesis chips optional
skge: update version
sky2: force receive checksum when using RSS on some hardware (v2)
sky2: use correct Inter Packet Gap at 10/100mbit
sky2: support for new Optima chipsets (EXPERIMENTAL)
sky2: version 1.29
skge/sky2: change config references to Marvell
Documentation/DocBook/80211.tmpl | 5 +-
Documentation/networking/ifenslave.c | 18 +-
Documentation/networking/ip-sysctl.txt | 29 +-
Documentation/networking/netdev-features.txt | 154 +
Documentation/networking/nfc.txt | 128 +
Documentation/networking/stmmac.txt | 200 +-
MAINTAINERS | 2 +-
arch/arm/mach-davinci/board-mityomapl138.c | 1 +
arch/arm/mach-davinci/dm646x.c | 1 +
arch/arm/mach-davinci/pm.c | 1 +
arch/arm/mach-imx/dma-v1.c | 1 +
arch/arm/mach-imx/mach-mx31_3ds.c | 1 +
arch/arm/mach-iop13xx/setup.c | 1 +
arch/arm/mach-mxs/devices/platform-auart.c | 1 +
arch/arm/mach-mxs/devices/platform-dma.c | 1 +
arch/arm/mach-mxs/devices/platform-fec.c | 1 +
arch/arm/plat-mxc/devices/platform-fec.c | 1 +
arch/arm/plat-mxc/devices/platform-fsl-usb2-udc.c | 1 +
arch/arm/plat-mxc/devices/platform-imx-fb.c | 1 +
arch/arm/plat-mxc/devices/platform-ipu-core.c | 1 +
arch/arm/plat-mxc/devices/platform-mxc-ehci.c | 1 +
arch/arm/plat-mxc/devices/platform-mxc-mmc.c | 1 +
arch/arm/plat-nomadik/include/plat/ste_dma40.h | 1 +
arch/m68k/emu/nfeth.c | 2 +-
arch/powerpc/Kconfig | 1 +
arch/powerpc/Makefile | 3 +-
arch/powerpc/include/asm/ppc-opcode.h | 40 +
arch/powerpc/net/Makefile | 4 +
arch/powerpc/net/bpf_jit.h | 227 +
arch/powerpc/net/bpf_jit_64.S | 138 +
arch/powerpc/net/bpf_jit_comp.c | 694 ++
arch/x86/kernel/tboot.c | 1 +
crypto/async_tx/raid6test.c | 1 +
drivers/Kconfig | 2 -
drivers/Makefile | 1 +
drivers/atm/ambassador.c | 11 +-
drivers/atm/ambassador.h | 4 -
drivers/atm/eni.h | 1 +
drivers/atm/firestream.c | 1 +
drivers/atm/horizon.c | 1 +
drivers/atm/idt77252.c | 1 +
drivers/atm/iphase.c | 1 +
drivers/atm/lanai.c | 9 +-
drivers/atm/zatm.c | 1 +
drivers/bcma/Kconfig | 11 +
drivers/bcma/Makefile | 3 +-
drivers/bcma/bcma_private.h | 11 +-
drivers/bcma/core.c | 3 +-
drivers/bcma/driver_chipcommon_pmu.c | 6 +-
drivers/bcma/driver_pci.c | 62 +-
drivers/bcma/driver_pci_host.c | 14 +
drivers/bcma/host_pci.c | 53 +
drivers/bcma/main.c | 14 +-
drivers/bcma/sprom.c | 165 +
drivers/bluetooth/ath3k.c | 5 +
drivers/bluetooth/btusb.c | 12 +-
drivers/char/random.c | 15 +
drivers/dma/coh901318.c | 1 +
drivers/dma/dmaengine.c | 1 +
drivers/dma/dmatest.c | 1 +
drivers/dma/ipu/ipu_idmac.c | 1 +
drivers/dma/ste_dma40.c | 1 +
drivers/firewire/net.c | 6 +-
drivers/ieee802154/Makefile | 2 -
drivers/ieee802154/fakehard.c | 2 -
drivers/infiniband/core/addr.c | 7 +-
drivers/infiniband/core/netlink.c | 2 +-
drivers/infiniband/hw/amso1100/c2.c | 1 +
drivers/infiniband/hw/cxgb3/iwch_cm.c | 12 +-
drivers/infiniband/hw/cxgb4/cm.c | 42 +-
drivers/infiniband/hw/nes/nes_cm.c | 2 +-
drivers/infiniband/hw/nes/nes_hw.c | 19 +-
drivers/infiniband/hw/nes/nes_hw.h | 4 -
drivers/infiniband/hw/nes/nes_nic.c | 50 +-
drivers/infiniband/ulp/ipoib/ipoib_main.c | 41 +-
drivers/infiniband/ulp/ipoib/ipoib_multicast.c | 20 +-
drivers/infiniband/ulp/iser/iscsi_iser.h | 1 +
drivers/isdn/hardware/mISDN/avmfritz.c | 1 +
drivers/isdn/hardware/mISDN/hfcmulti.c | 1 +
drivers/isdn/hardware/mISDN/hfcpci.c | 1 +
drivers/isdn/hardware/mISDN/mISDNinfineon.c | 1 +
drivers/isdn/hardware/mISDN/mISDNipac.c | 1 +
drivers/isdn/hardware/mISDN/netjet.c | 1 +
drivers/isdn/hardware/mISDN/speedfax.c | 1 +
drivers/isdn/hardware/mISDN/w6692.c | 1 +
drivers/isdn/hisax/hisax.h | 1 +
drivers/isdn/hisax/hisax_fcpcipnp.c | 1 +
drivers/isdn/i4l/isdn_net.c | 5 +-
drivers/media/dvb/b2c2/flexcop-common.h | 1 +
drivers/media/dvb/dm1105/dm1105.c | 1 +
drivers/media/dvb/mantis/mantis_ca.c | 1 +
drivers/media/dvb/mantis/mantis_common.h | 1 +
drivers/media/dvb/mantis/mantis_evm.c | 1 +
drivers/media/dvb/mantis/mantis_hif.c | 1 +
drivers/media/dvb/mantis/mantis_ioc.c | 1 +
drivers/media/dvb/mantis/mantis_pcmcia.c | 1 +
drivers/media/dvb/mantis/mantis_uart.c | 1 +
drivers/media/dvb/mantis/mantis_vp1034.c | 1 +
drivers/media/dvb/pluto2/pluto2.c | 1 +
drivers/mmc/host/tmio_mmc_dma.c | 1 +
drivers/mtd/nand/atmel_nand.c | 1 +
drivers/net/3c503.c | 1 +
drivers/net/7990.c | 9 +-
drivers/net/8139cp.c | 84 +-
drivers/net/8139too.c | 1 +
drivers/net/8390.h | 1 +
drivers/net/Kconfig | 43 +-
drivers/net/Makefile | 3 +-
drivers/net/a2065.c | 356 +-
drivers/net/ac3200.c | 1 +
drivers/net/acenic.c | 66 +-
drivers/net/acenic.h | 8 +-
drivers/net/amd8111e.c | 37 +-
drivers/net/amd8111e.h | 3 -
drivers/net/apne.c | 1 +
drivers/net/appletalk/ltpc.c | 8 +-
drivers/net/arcnet/arc-rimi.c | 1 +
drivers/net/arcnet/com20020-isa.c | 1 +
drivers/net/arcnet/com20020-pci.c | 1 +
drivers/net/arcnet/com20020.c | 1 +
drivers/net/arcnet/com90io.c | 1 +
drivers/net/arcnet/com90xx.c | 1 +
drivers/net/ariadne.c | 1267 ++--
drivers/net/arm/am79c961a.c | 14 +-
drivers/net/arm/at91_ether.c | 1 +
drivers/net/arm/ep93xx_eth.c | 1 +
drivers/net/arm/ks8695net.c | 2 +
drivers/net/atl1c/atl1c.h | 3 +-
drivers/net/atl1c/atl1c_main.c | 74 +-
drivers/net/atl1e/atl1e.h | 3 +-
drivers/net/atl1e/atl1e_main.c | 84 +-
drivers/net/atlx/atl1.c | 21 +-
drivers/net/atlx/atl1.h | 1 -
drivers/net/atlx/atl2.c | 81 +-
drivers/net/atlx/atl2.h | 3 -
drivers/net/atlx/atlx.c | 57 +-
drivers/net/b44.c | 21 +-
drivers/net/bcm63xx_enet.c | 1 +
drivers/net/benet/be.h | 16 +-
drivers/net/benet/be_cmds.c | 142 +-
drivers/net/benet/be_cmds.h | 29 +-
drivers/net/benet/be_ethtool.c | 55 +-
drivers/net/benet/be_main.c | 430 +-
drivers/net/bmac.c | 9 +-
drivers/net/bna/bfa_cee.c | 2 +-
drivers/net/bna/bnad.c | 67 +-
drivers/net/bna/bnad.h | 3 +-
drivers/net/bna/cna.h | 3 +-
drivers/net/bnx2.c | 97 +-
drivers/net/bnx2.h | 15 +
drivers/net/bnx2x/Makefile | 2 +-
drivers/net/bnx2x/bnx2x.h | 1105 ++--
drivers/net/bnx2x/bnx2x_cmn.c | 1497 +++--
drivers/net/bnx2x/bnx2x_cmn.h | 675 ++-
drivers/net/bnx2x/bnx2x_dcb.c | 851 ++-
drivers/net/bnx2x/bnx2x_dcb.h | 30 +-
drivers/net/bnx2x/bnx2x_dump.h | 1721 ++++--
drivers/net/bnx2x/bnx2x_ethtool.c | 698 ++-
drivers/net/bnx2x/bnx2x_fw_defs.h | 519 +-
drivers/net/bnx2x/bnx2x_hsi.h | 5489 ++++++++++------
drivers/net/bnx2x/bnx2x_init.h | 409 +-
drivers/net/bnx2x/bnx2x_init_ops.h | 194 +-
drivers/net/bnx2x/bnx2x_link.c | 6671 ++++++++++++++++----
drivers/net/bnx2x/bnx2x_link.h | 183 +-
drivers/net/bnx2x/bnx2x_main.c | 6227 +++++++++++--------
drivers/net/bnx2x/bnx2x_reg.h | 957 +++-
drivers/net/bnx2x/bnx2x_sp.c | 5692 +++++++++++++++++
drivers/net/bnx2x/bnx2x_sp.h | 1297 ++++
drivers/net/bnx2x/bnx2x_stats.c | 908 ++--
drivers/net/bnx2x/bnx2x_stats.h | 228 +-
drivers/net/bonding/bond_3ad.c | 53 +-
drivers/net/bonding/bond_3ad.h | 8 +-
drivers/net/bonding/bond_alb.c | 4 +-
drivers/net/bonding/bond_ipv6.c | 8 +-
drivers/net/bonding/bond_main.c | 127 +-
drivers/net/bonding/bond_procfs.c | 1 +
drivers/net/bonding/bond_sysfs.c | 34 +
drivers/net/bonding/bonding.h | 8 +-
drivers/net/caif/Kconfig | 9 +
drivers/net/caif/Makefile | 3 +
drivers/net/caif/caif_hsi.c | 1219 ++++
drivers/net/caif/caif_serial.c | 2 +-
drivers/net/caif/caif_shm_u5500.c | 1 -
drivers/net/caif/caif_shmcore.c | 2 +-
drivers/net/caif/caif_spi.c | 1 -
drivers/net/caif/caif_spi_slave.c | 1 -
drivers/net/can/Kconfig | 8 +-
drivers/net/can/at91_can.c | 366 +-
drivers/net/can/bfin_can.c | 137 +-
drivers/net/can/c_can/c_can.c | 1 -
drivers/net/can/c_can/c_can_platform.c | 1 -
drivers/net/can/dev.c | 2 +-
drivers/net/can/janz-ican3.c | 1 +
drivers/net/can/sja1000/sja1000.h | 1 +
drivers/net/can/sja1000/sja1000_of_platform.c | 1 +
drivers/net/can/slcan.c | 63 +-
drivers/net/can/softing/softing_fw.c | 1 +
drivers/net/can/softing/softing_main.c | 2 +-
drivers/net/cassini.c | 1 +
drivers/net/chelsio/common.h | 2 -
drivers/net/chelsio/cxgb2.c | 39 +-
drivers/net/chelsio/sge.c | 18 +-
drivers/net/chelsio/sge.h | 2 +-
drivers/net/cnic.c | 412 +-
drivers/net/cnic.h | 52 +-
drivers/net/cnic_defs.h | 6488 +++++++++++--------
drivers/net/cnic_if.h | 15 +-
drivers/net/cpmac.c | 1 +
drivers/net/cxgb3/adapter.h | 2 -
drivers/net/cxgb3/common.h | 1 -
drivers/net/cxgb3/cxgb3_main.c | 51 +-
drivers/net/cxgb3/cxgb3_offload.c | 19 +-
drivers/net/cxgb3/sge.c | 35 +-
drivers/net/cxgb3/t3_hw.c | 11 +-
drivers/net/cxgb4/cxgb4.h | 1 -
drivers/net/cxgb4/cxgb4_main.c | 2 +-
drivers/net/cxgb4vf/adapter.h | 2 +-
drivers/net/cxgb4vf/cxgb4vf_main.c | 68 +-
drivers/net/cxgb4vf/sge.c | 34 +-
drivers/net/cxgb4vf/t4vf_hw.c | 1 -
drivers/net/davinci_cpdma.c | 2 +-
drivers/net/davinci_emac.c | 7 +-
drivers/net/declance.c | 47 +-
drivers/net/depca.c | 31 +-
drivers/net/dl2k.c | 4 +-
drivers/net/dm9000.c | 27 +-
drivers/net/dnet.c | 3 +
drivers/net/e100.c | 2 +
drivers/net/e1000/e1000.h | 2 +-
drivers/net/e1000/e1000_ethtool.c | 69 -
drivers/net/e1000/e1000_hw.c | 7 +-
drivers/net/e1000/e1000_main.c | 203 +-
drivers/net/e1000e/82571.c | 5 +-
drivers/net/e1000e/e1000.h | 51 +-
drivers/net/e1000e/es2lan.c | 8 +
drivers/net/e1000e/ethtool.c | 1 +
drivers/net/e1000e/hw.h | 21 +-
drivers/net/e1000e/ich8lan.c | 191 +-
drivers/net/e1000e/lib.c | 4 +-
drivers/net/e1000e/netdev.c | 171 +-
drivers/net/e1000e/phy.c | 352 +-
drivers/net/e2100.c | 1 +
drivers/net/ehea/ehea.h | 1 -
drivers/net/ehea/ehea_main.c | 54 +-
drivers/net/ehea/ehea_qmr.c | 2 +-
drivers/net/enic/enic.h | 4 +-
drivers/net/enic/enic_dev.c | 11 +
drivers/net/enic/enic_dev.h | 1 +
drivers/net/enic/enic_main.c | 153 +-
drivers/net/enic/enic_res.c | 30 +-
drivers/net/enic/vnic_cq.c | 2 +
drivers/net/enic/vnic_cq.h | 1 +
drivers/net/enic/vnic_dev.c | 60 +
drivers/net/enic/vnic_dev.h | 5 +
drivers/net/enic/vnic_devcmd.h | 19 +
drivers/net/enic/vnic_enet.h | 11 +-
drivers/net/enic/vnic_intr.c | 7 +-
drivers/net/enic/vnic_intr.h | 6 +-
drivers/net/epic100.c | 4 +-
drivers/net/es3210.c | 1 +
drivers/net/ethoc.c | 3 +
drivers/net/ewrk3.c | 39 +-
drivers/net/fealnx.c | 4 +-
drivers/net/fec.c | 9 +-
drivers/net/fec_mpc52xx.c | 6 +-
drivers/net/forcedeth.c | 68 +-
drivers/net/fs_enet/fs_enet-main.c | 2 +
drivers/net/ftgmac100.c | 1365 ++++
drivers/net/ftgmac100.h | 246 +
drivers/net/gianfar.c | 182 +-
drivers/net/gianfar.h | 57 +-
drivers/net/gianfar_ethtool.c | 958 +++-
drivers/net/greth.c | 2 +
drivers/net/hamachi.c | 4 +-
drivers/net/hamradio/baycom_ser_fdx.c | 1 +
drivers/net/hamradio/baycom_ser_hdx.c | 1 +
drivers/net/hp-plus.c | 1 +
drivers/net/hp.c | 1 +
drivers/net/hp100.c | 18 +-
drivers/net/ibmveth.c | 1 +
drivers/net/ifb.c | 57 +-
drivers/net/igb/Makefile | 2 +-
drivers/net/igb/e1000_82575.c | 22 +-
drivers/net/igb/e1000_82575.h | 4 +-
drivers/net/igb/e1000_defines.h | 17 +-
drivers/net/igb/e1000_hw.h | 2 +-
drivers/net/igb/e1000_mac.c | 5 +-
drivers/net/igb/e1000_mac.h | 2 +-
drivers/net/igb/e1000_mbx.c | 2 +-
drivers/net/igb/e1000_mbx.h | 2 +-
drivers/net/igb/e1000_nvm.c | 2 +-
drivers/net/igb/e1000_nvm.h | 2 +-
drivers/net/igb/e1000_phy.c | 2 +-
drivers/net/igb/e1000_phy.h | 2 +-
drivers/net/igb/e1000_regs.h | 2 +-
drivers/net/igb/igb.h | 6 +-
drivers/net/igb/igb_ethtool.c | 102 +-
drivers/net/igb/igb_main.c | 128 +-
drivers/net/igbvf/igbvf.h | 4 +-
drivers/net/igbvf/netdev.c | 46 +-
drivers/net/ioc3-eth.c | 9 +-
drivers/net/ipg.c | 1 +
drivers/net/irda/ali-ircc.c | 1 +
drivers/net/irda/donauboe.c | 1 +
drivers/net/irda/nsc-ircc.c | 1 +
drivers/net/irda/pxaficp_ir.c | 2 +
drivers/net/irda/sir_dev.c | 1 +
drivers/net/irda/smsc-ircc2.c | 3 +-
drivers/net/irda/via-ircc.c | 1 +
drivers/net/irda/via-ircc.h | 2 +-
drivers/net/irda/vlsi_ir.c | 1 +
drivers/net/irda/w83977af_ir.c | 1 +
drivers/net/iseries_veth.c | 14 +-
drivers/net/ixgbe/ixgbe.h | 102 +-
drivers/net/ixgbe/ixgbe_82598.c | 43 +
drivers/net/ixgbe/ixgbe_82599.c | 645 +-
drivers/net/ixgbe/ixgbe_common.c | 244 +-
drivers/net/ixgbe/ixgbe_common.h | 5 +
drivers/net/ixgbe/ixgbe_dcb.c | 10 +-
drivers/net/ixgbe/ixgbe_dcb.h | 7 -
drivers/net/ixgbe/ixgbe_dcb_82598.c | 43 +-
drivers/net/ixgbe/ixgbe_dcb_82598.h | 3 +-
drivers/net/ixgbe/ixgbe_dcb_82599.c | 119 +-
drivers/net/ixgbe/ixgbe_dcb_82599.h | 14 +-
drivers/net/ixgbe/ixgbe_dcb_nl.c | 129 +-
drivers/net/ixgbe/ixgbe_ethtool.c | 589 +-
drivers/net/ixgbe/ixgbe_fcoe.c | 279 +-
drivers/net/ixgbe/ixgbe_fcoe.h | 12 +-
drivers/net/ixgbe/ixgbe_main.c | 1354 ++--
drivers/net/ixgbe/ixgbe_sriov.c | 16 +
drivers/net/ixgbe/ixgbe_type.h | 99 +-
drivers/net/ixgbe/ixgbe_x540.c | 2 +
drivers/net/ixgbevf/ixgbevf.h | 8 +-
drivers/net/ixgbevf/ixgbevf_main.c | 88 +-
drivers/net/ixp2000/ixpdev.c | 1 +
drivers/net/jme.c | 73 +-
drivers/net/jme.h | 7 +-
drivers/net/korina.c | 7 +-
drivers/net/ks8842.c | 1 +
drivers/net/ks8851.c | 1 +
drivers/net/ks8851_mll.c | 4 +-
drivers/net/ksz884x.c | 3 +-
drivers/net/lib8390.c | 290 +-
drivers/net/ll_temac_main.c | 7 +-
drivers/net/lne390.c | 1 +
drivers/net/macb.c | 3 +
drivers/net/mace.c | 1 +
drivers/net/macmace.c | 2 +-
drivers/net/macvlan.c | 27 +-
drivers/net/macvtap.c | 134 +-
drivers/net/mipsnet.c | 1 +
drivers/net/mlx4/en_netdev.c | 49 +-
drivers/net/mlx4/en_port.c | 23 +-
drivers/net/mlx4/en_rx.c | 26 +-
drivers/net/mlx4/en_tx.c | 5 +-
drivers/net/mlx4/main.c | 4 +-
drivers/net/mlx4/mlx4_en.h | 6 +-
drivers/net/mlx4/reset.c | 2 +-
drivers/net/mv643xx_eth.c | 8 +-
drivers/net/myri10ge/myri10ge.c | 268 +-
drivers/net/myri10ge/myri10ge_mcp_gen_header.h | 2 +
drivers/net/myri_sbus.c | 1187 ----
drivers/net/myri_sbus.h | 311 -
drivers/net/netx-eth.c | 1 +
drivers/net/netxen/netxen_nic.h | 5 +-
drivers/net/netxen/netxen_nic_ctx.c | 16 +-
drivers/net/netxen/netxen_nic_hw.c | 6 +
drivers/net/netxen/netxen_nic_init.c | 74 +-
drivers/net/netxen/netxen_nic_main.c | 13 +-
drivers/net/niu.c | 39 +-
drivers/net/ns83820.c | 34 +-
drivers/net/octeon/octeon_mgmt.c | 1 +
drivers/net/pcnet32.c | 9 +-
drivers/net/phy/icplus.c | 6 +-
drivers/net/plip.c | 6 +-
drivers/net/ppp_async.c | 1 +
drivers/net/ppp_synctty.c | 1 +
drivers/net/pptp.c | 1 -
drivers/net/ps3_gelic_net.c | 44 +-
drivers/net/ps3_gelic_net.h | 1 -
drivers/net/pxa168_eth.c | 5 +-
drivers/net/qla3xxx.c | 5 +-
drivers/net/qlcnic/qlcnic.h | 46 +-
drivers/net/qlcnic/qlcnic_ctx.c | 37 +-
drivers/net/qlcnic/qlcnic_ethtool.c | 163 +-
drivers/net/qlcnic/qlcnic_hw.c | 74 +-
drivers/net/qlcnic/qlcnic_init.c | 133 +-
drivers/net/qlcnic/qlcnic_main.c | 78 +-
drivers/net/qlge/qlge.h | 4 +-
drivers/net/qlge/qlge_ethtool.c | 2 -
drivers/net/qlge/qlge_main.c | 167 +-
drivers/net/r6040.c | 3 +
drivers/net/r8169.c | 628 ++-
drivers/net/rionet.c | 2 +-
drivers/net/s2io.c | 90 +-
drivers/net/s2io.h | 1 -
drivers/net/sc92031.c | 1 +
drivers/net/sfc/Kconfig | 7 +-
drivers/net/sfc/efx.c | 60 +-
drivers/net/sfc/enum.h | 3 +-
drivers/net/sfc/ethtool.c | 27 +-
drivers/net/sfc/falcon.c | 51 +-
drivers/net/sfc/filter.c | 47 +-
drivers/net/sfc/net_driver.h | 12 +-
drivers/net/sfc/nic.c | 1 +
drivers/net/sfc/siena.c | 49 +-
drivers/net/sgiseeq.c | 1 +
drivers/net/sh_eth.c | 12 +-
drivers/net/sis190.c | 1 +
drivers/net/sis900.c | 4 +-
drivers/net/skge.c | 103 +-
drivers/net/skge.h | 1 +
drivers/net/sky2.c | 165 +-
drivers/net/sky2.h | 16 +-
drivers/net/slhc.c | 2 +-
drivers/net/slip.c | 35 +-
drivers/net/slip.h | 1 -
drivers/net/smc-mca.c | 1 +
drivers/net/smc-ultra.c | 1 +
drivers/net/smc911x.c | 5 -
drivers/net/smc9194.c | 5 -
drivers/net/smc91x.c | 5 -
drivers/net/smsc911x.c | 2 +
drivers/net/smsc9420.c | 3 +
drivers/net/spider_net.c | 5 +-
drivers/net/starfire.c | 90 +-
drivers/net/stmmac/dwmac1000_core.c | 1 +
drivers/net/stmmac/dwmac1000_dma.c | 1 +
drivers/net/stmmac/dwmac100_core.c | 1 +
drivers/net/stmmac/dwmac100_dma.c | 1 +
drivers/net/stmmac/stmmac.h | 11 +-
drivers/net/stmmac/stmmac_ethtool.c | 2 +
drivers/net/stmmac/stmmac_main.c | 192 +-
drivers/net/stmmac/stmmac_mdio.c | 84 +-
drivers/net/sunbmac.c | 8 +-
drivers/net/sungem.c | 898 ++--
drivers/net/sungem.h | 25 -
drivers/net/sunhme.c | 16 +-
drivers/net/sunlance.c | 8 +-
drivers/net/sunqe.c | 7 +-
drivers/net/tehuti.c | 37 +-
drivers/net/tehuti.h | 1 -
drivers/net/tg3.c | 788 ++-
drivers/net/tg3.h | 30 +-
drivers/net/tlan.c | 2 +
drivers/net/tokenring/3c359.c | 6 +-
drivers/net/tokenring/ibmtr.c | 3 +-
drivers/net/tokenring/madgemc.c | 2 +-
drivers/net/tsi108_eth.c | 1 +
drivers/net/tulip/de2104x.c | 1 +
drivers/net/tulip/de4x5.c | 12 +-
drivers/net/tulip/pnic.c | 1 +
drivers/net/tulip/tulip_core.c | 1 +
drivers/net/tun.c | 32 +-
drivers/net/typhoon.c | 2 +-
drivers/net/ucc_geth.c | 7 +-
drivers/net/usb/asix.c | 4 +
drivers/net/usb/cdc-phonet.c | 1 +
drivers/net/usb/cdc_ncm.c | 1 -
drivers/net/usb/ipheth.c | 15 +-
drivers/net/usb/kalmia.c | 12 +-
drivers/net/veth.c | 73 +-
drivers/net/via-velocity.c | 51 +-
drivers/net/via-velocity.h | 2 +-
drivers/net/virtio_net.c | 79 +-
drivers/net/vmxnet3/vmxnet3_drv.c | 120 +-
drivers/net/vmxnet3/vmxnet3_ethtool.c | 53 +-
drivers/net/vmxnet3/vmxnet3_int.h | 8 +-
drivers/net/vxge/vxge-config.c | 57 +-
drivers/net/vxge/vxge-config.h | 2 +
drivers/net/vxge/vxge-main.c | 159 +-
drivers/net/vxge/vxge-main.h | 53 +-
drivers/net/vxge/vxge-traffic.c | 6 +-
drivers/net/wan/c101.c | 30 +-
drivers/net/wan/cosa.c | 226 +-
drivers/net/wan/cycx_drv.c | 81 +-
drivers/net/wan/cycx_main.c | 32 +-
drivers/net/wan/cycx_x25.c | 177 +-
drivers/net/wan/dlci.c | 22 +-
drivers/net/wan/dscc4.c | 81 +-
drivers/net/wan/farsync.c | 8 +-
drivers/net/wan/hd64570.c | 8 +-
drivers/net/wan/hd64572.c | 8 +-
drivers/net/wan/hdlc.c | 16 +-
drivers/net/wan/hdlc_cisco.c | 21 +-
drivers/net/wan/hdlc_fr.c | 96 +-
drivers/net/wan/hdlc_ppp.c | 9 +-
drivers/net/wan/hdlc_x25.c | 12 +-
drivers/net/wan/hostess_sv11.c | 11 +-
drivers/net/wan/ixp4xx_hss.c | 28 +-
drivers/net/wan/lapbether.c | 18 +-
drivers/net/wan/n2.c | 42 +-
drivers/net/wan/pc300_drv.c | 4 +-
drivers/net/wan/pc300_tty.c | 2 +-
drivers/net/wan/pc300too.c | 36 +-
drivers/net/wan/pci200syn.c | 29 +-
drivers/net/wan/sbni.c | 67 +-
drivers/net/wan/sdla.c | 52 +-
drivers/net/wan/sealevel.c | 11 +-
drivers/net/wan/wanxl.c | 93 +-
drivers/net/wan/x25_asy.c | 47 +-
drivers/net/wan/z85230.c | 34 +-
drivers/net/wireless/adm8211.c | 1 +
drivers/net/wireless/ath/ath.h | 1 +
drivers/net/wireless/ath/ath5k/ahb.c | 5 +-
drivers/net/wireless/ath/ath5k/ani.c | 9 +-
drivers/net/wireless/ath/ath5k/ath5k.h | 174 +-
drivers/net/wireless/ath/ath5k/attach.c | 24 +-
drivers/net/wireless/ath/ath5k/base.c | 87 +-
drivers/net/wireless/ath/ath5k/base.h | 11 +-
drivers/net/wireless/ath/ath5k/caps.c | 4 +-
drivers/net/wireless/ath/ath5k/debug.c | 207 +-
drivers/net/wireless/ath/ath5k/desc.h | 4 +-
drivers/net/wireless/ath/ath5k/dma.c | 8 +-
drivers/net/wireless/ath/ath5k/eeprom.c | 46 +-
drivers/net/wireless/ath/ath5k/eeprom.h | 12 +-
drivers/net/wireless/ath/ath5k/initvals.c | 14 +-
drivers/net/wireless/ath/ath5k/led.c | 8 +-
drivers/net/wireless/ath/ath5k/mac80211-ops.c | 10 +-
drivers/net/wireless/ath/ath5k/pci.c | 14 +-
drivers/net/wireless/ath/ath5k/pcu.c | 16 +-
drivers/net/wireless/ath/ath5k/phy.c | 100 +-
drivers/net/wireless/ath/ath5k/reg.h | 89 +-
drivers/net/wireless/ath/ath5k/reset.c | 49 +-
drivers/net/wireless/ath/ath5k/rfbuffer.h | 4 +-
drivers/net/wireless/ath/ath5k/rfgain.h | 8 +-
drivers/net/wireless/ath/ath5k/sysfs.c | 10 +-
drivers/net/wireless/ath/ath5k/trace.h | 15 +-
drivers/net/wireless/ath/ath9k/ahb.c | 4 +
drivers/net/wireless/ath/ath9k/ar5008_phy.c | 5 +
drivers/net/wireless/ath/ath9k/ar9002_hw.c | 39 -
drivers/net/wireless/ath/ath9k/ar9002_mac.c | 6 -
drivers/net/wireless/ath/ath9k/ar9002_phy.c | 34 +-
.../net/wireless/ath/ath9k/ar9003_2p2_initvals.h | 10 +-
drivers/net/wireless/ath/ath9k/ar9003_eeprom.c | 39 +-
drivers/net/wireless/ath/ath9k/ar9003_hw.c | 182 +-
drivers/net/wireless/ath/ath9k/ar9003_mac.c | 19 +-
drivers/net/wireless/ath/ath9k/ar9003_paprd.c | 131 +-
drivers/net/wireless/ath/ath9k/ar9003_phy.c | 41 +-
drivers/net/wireless/ath/ath9k/ar9003_phy.h | 9 +-
.../net/wireless/ath/ath9k/ar9330_1p1_initvals.h | 1147 ++++
.../net/wireless/ath/ath9k/ar9330_1p2_initvals.h | 1080 ++++
drivers/net/wireless/ath/ath9k/ath9k.h | 18 +-
drivers/net/wireless/ath/ath9k/beacon.c | 30 +-
drivers/net/wireless/ath/ath9k/debug.c | 59 +-
drivers/net/wireless/ath/ath9k/debug.h | 1 +
drivers/net/wireless/ath/ath9k/hif_usb.c | 2 +
drivers/net/wireless/ath/ath9k/htc_drv_beacon.c | 8 +-
drivers/net/wireless/ath/ath9k/htc_drv_init.c | 1 +
drivers/net/wireless/ath/ath9k/htc_drv_main.c | 9 +-
drivers/net/wireless/ath/ath9k/hw-ops.h | 5 -
drivers/net/wireless/ath/ath9k/hw.c | 196 +-
drivers/net/wireless/ath/ath9k/hw.h | 14 +-
drivers/net/wireless/ath/ath9k/init.c | 14 +-
drivers/net/wireless/ath/ath9k/mac.c | 3 +-
drivers/net/wireless/ath/ath9k/main.c | 179 +-
drivers/net/wireless/ath/ath9k/rc.c | 56 +-
drivers/net/wireless/ath/ath9k/recv.c | 147 +-
drivers/net/wireless/ath/ath9k/reg.h | 21 +-
drivers/net/wireless/ath/ath9k/xmit.c | 346 +-
drivers/net/wireless/ath/carl9170/carl9170.h | 3 +-
drivers/net/wireless/ath/carl9170/fw.c | 2 +-
drivers/net/wireless/ath/carl9170/fwcmd.h | 19 +-
drivers/net/wireless/ath/carl9170/fwdesc.h | 18 +-
drivers/net/wireless/ath/carl9170/hw.h | 15 +-
drivers/net/wireless/ath/carl9170/main.c | 19 +-
drivers/net/wireless/ath/carl9170/phy.c | 6 -
drivers/net/wireless/ath/carl9170/rx.c | 2 +-
drivers/net/wireless/ath/carl9170/version.h | 6 +-
drivers/net/wireless/ath/carl9170/wlan.h | 25 +-
drivers/net/wireless/atmel.c | 1 +
drivers/net/wireless/b43/Kconfig | 32 +
drivers/net/wireless/b43/Makefile | 5 +
drivers/net/wireless/b43/b43.h | 56 +-
drivers/net/wireless/b43/bus.c | 256 +
drivers/net/wireless/b43/bus.h | 70 +
drivers/net/wireless/b43/dma.c | 48 +-
drivers/net/wireless/b43/leds.c | 15 +-
drivers/net/wireless/b43/lo.c | 6 +-
drivers/net/wireless/b43/main.c | 612 ++-
drivers/net/wireless/b43/main.h | 2 +-
drivers/net/wireless/b43/phy_a.c | 21 +-
drivers/net/wireless/b43/phy_common.c | 20 +-
drivers/net/wireless/b43/phy_common.h | 6 +
drivers/net/wireless/b43/phy_g.c | 92 +-
drivers/net/wireless/b43/phy_ht.c | 406 ++
drivers/net/wireless/b43/phy_ht.h | 46 +
drivers/net/wireless/b43/phy_lcn.c | 52 +
drivers/net/wireless/b43/phy_lcn.h | 14 +
drivers/net/wireless/b43/phy_lp.c | 135 +-
drivers/net/wireless/b43/phy_n.c | 120 +-
drivers/net/wireless/b43/pio.c | 10 +-
drivers/net/wireless/b43/radio_2055.h | 5 +
drivers/net/wireless/b43/radio_2056.h | 5 +
drivers/net/wireless/b43/radio_2059.c | 165 +
drivers/net/wireless/b43/radio_2059.h | 54 +
drivers/net/wireless/b43/rfkill.c | 9 +-
drivers/net/wireless/b43/sdio.c | 10 +-
drivers/net/wireless/b43/sysfs.c | 4 +-
drivers/net/wireless/b43/tables_lpphy.c | 15 +-
drivers/net/wireless/b43/tables_nphy.h | 8 -
drivers/net/wireless/b43/tables_phy_ht.c | 750 +++
drivers/net/wireless/b43/tables_phy_ht.h | 22 +
drivers/net/wireless/b43/tables_phy_lcn.c | 34 +
drivers/net/wireless/b43/tables_phy_lcn.h | 6 +
drivers/net/wireless/b43/wa.c | 24 +-
drivers/net/wireless/b43/xmit.c | 5 +-
drivers/net/wireless/b43legacy/dma.c | 10 +-
drivers/net/wireless/b43legacy/main.c | 10 +-
drivers/net/wireless/b43legacy/xmit.c | 2 -
drivers/net/wireless/hostap/hostap_wlan.h | 1 +
drivers/net/wireless/ipw2x00/ipw2100.c | 2 +-
drivers/net/wireless/ipw2x00/ipw2200.h | 1 +
drivers/net/wireless/ipw2x00/libipw_rx.c | 4 +-
drivers/net/wireless/ipw2x00/libipw_wx.c | 1 +
drivers/net/wireless/iwlegacy/iwl-3945.c | 4 -
drivers/net/wireless/iwlegacy/iwl-4965-lib.c | 79 +-
drivers/net/wireless/iwlegacy/iwl-4965-rs.c | 3 +
drivers/net/wireless/iwlegacy/iwl-4965-rx.c | 78 +-
drivers/net/wireless/iwlegacy/iwl-4965-tx.c | 3 +-
drivers/net/wireless/iwlegacy/iwl-4965.c | 10 +-
drivers/net/wireless/iwlegacy/iwl-commands.h | 7 -
drivers/net/wireless/iwlegacy/iwl-core.c | 91 +-
drivers/net/wireless/iwlegacy/iwl-core.h | 17 +-
drivers/net/wireless/iwlegacy/iwl-debugfs.c | 192 +-
drivers/net/wireless/iwlegacy/iwl-dev.h | 61 +-
drivers/net/wireless/iwlegacy/iwl-devtrace.c | 3 -
drivers/net/wireless/iwlegacy/iwl-devtrace.h | 60 -
drivers/net/wireless/iwlegacy/iwl-eeprom.c | 1 -
drivers/net/wireless/iwlegacy/iwl-helpers.h | 9 +
drivers/net/wireless/iwlegacy/iwl-rx.c | 21 -
drivers/net/wireless/iwlegacy/iwl-scan.c | 92 +-
drivers/net/wireless/iwlegacy/iwl3945-base.c | 301 +-
drivers/net/wireless/iwlegacy/iwl4965-base.c | 465 +--
drivers/net/wireless/iwlwifi/Makefile | 2 +
drivers/net/wireless/iwlwifi/iwl-1000.c | 21 +-
drivers/net/wireless/iwlwifi/iwl-2000.c | 83 +-
drivers/net/wireless/iwlwifi/iwl-5000-hw.h | 2 +-
drivers/net/wireless/iwlwifi/iwl-5000.c | 58 +-
drivers/net/wireless/iwlwifi/iwl-6000.c | 59 +-
drivers/net/wireless/iwlwifi/iwl-agn-calib.c | 15 +-
drivers/net/wireless/iwlwifi/iwl-agn-calib.h | 7 -
drivers/net/wireless/iwlwifi/iwl-agn-eeprom.c | 20 +-
drivers/net/wireless/iwlwifi/iwl-agn-hcmd.c | 142 +-
drivers/net/wireless/iwlwifi/iwl-agn-hw.h | 7 -
drivers/net/wireless/iwlwifi/iwl-agn-ict.c | 4 +-
drivers/net/wireless/iwlwifi/iwl-agn-lib.c | 312 +-
drivers/net/wireless/iwlwifi/iwl-agn-rs.c | 30 +-
drivers/net/wireless/iwlwifi/iwl-agn-rxon.c | 136 +-
drivers/net/wireless/iwlwifi/iwl-agn-sta.c | 20 +-
drivers/net/wireless/iwlwifi/iwl-agn-tt.c | 38 +-
drivers/net/wireless/iwlwifi/iwl-agn-tx.c | 233 +-
drivers/net/wireless/iwlwifi/iwl-agn-ucode.c | 67 +-
drivers/net/wireless/iwlwifi/iwl-agn.c | 884 ++--
drivers/net/wireless/iwlwifi/iwl-agn.h | 52 +-
drivers/net/wireless/iwlwifi/iwl-commands.h | 38 +-
drivers/net/wireless/iwlwifi/iwl-core.c | 150 +-
drivers/net/wireless/iwlwifi/iwl-core.h | 136 +-
drivers/net/wireless/iwlwifi/iwl-debug.h | 18 +-
drivers/net/wireless/iwlwifi/iwl-debugfs.c | 7 +-
drivers/net/wireless/iwlwifi/iwl-dev.h | 130 +-
drivers/net/wireless/iwlwifi/iwl-eeprom.c | 32 +-
drivers/net/wireless/iwlwifi/iwl-eeprom.h | 26 +-
drivers/net/wireless/iwlwifi/iwl-fh.h | 2 +-
drivers/net/wireless/iwlwifi/iwl-hcmd.c | 34 +-
drivers/net/wireless/iwlwifi/iwl-helpers.h | 9 +
drivers/net/wireless/iwlwifi/iwl-io.h | 6 +-
drivers/net/wireless/iwlwifi/iwl-led.c | 17 +-
drivers/net/wireless/iwlwifi/iwl-pci.c | 560 ++
drivers/net/wireless/iwlwifi/iwl-pci.h | 69 +
drivers/net/wireless/iwlwifi/iwl-power.c | 42 +-
drivers/net/wireless/iwlwifi/iwl-power.h | 2 +-
drivers/net/wireless/iwlwifi/iwl-prph.h | 19 +-
drivers/net/wireless/iwlwifi/iwl-rx.c | 94 +-
drivers/net/wireless/iwlwifi/iwl-scan.c | 20 +-
drivers/net/wireless/iwlwifi/iwl-sta.c | 20 +-
drivers/net/wireless/iwlwifi/iwl-sv-open.c | 190 +-
drivers/net/wireless/iwlwifi/iwl-testmode.h | 251 +-
drivers/net/wireless/iwlwifi/iwl-trans.c | 571 ++
drivers/net/wireless/iwlwifi/iwl-trans.h | 105 +
drivers/net/wireless/iwlwifi/iwl-tx.c | 311 +-
drivers/net/wireless/iwmc3200wifi/fw.c | 2 +-
drivers/net/wireless/libertas/cfg.c | 1 +
drivers/net/wireless/libertas/cmd.c | 47 +-
drivers/net/wireless/libertas/cmd.h | 2 +
drivers/net/wireless/libertas/cmdresp.c | 7 +-
drivers/net/wireless/libertas/debugfs.c | 1 +
drivers/net/wireless/libertas/ethtool.c | 1 +
drivers/net/wireless/libertas/if_sdio.c | 34 +
drivers/net/wireless/libertas/if_spi.c | 8 +-
drivers/net/wireless/libertas/main.c | 13 +-
drivers/net/wireless/libertas/mesh.c | 1 +
drivers/net/wireless/libertas/rx.c | 1 +
drivers/net/wireless/libertas/tx.c | 1 +
drivers/net/wireless/libertas_tf/cmd.c | 1 +
drivers/net/wireless/libertas_tf/main.c | 3 +-
drivers/net/wireless/mac80211_hwsim.c | 464 ++-
drivers/net/wireless/mac80211_hwsim.h | 133 +
drivers/net/wireless/mwifiex/11n.c | 33 +-
drivers/net/wireless/mwifiex/11n.h | 14 +-
drivers/net/wireless/mwifiex/11n_aggr.c | 54 +-
drivers/net/wireless/mwifiex/11n_rxreorder.c | 5 +-
drivers/net/wireless/mwifiex/11n_rxreorder.h | 5 +-
drivers/net/wireless/mwifiex/cfg80211.c | 56 +-
drivers/net/wireless/mwifiex/cmdevt.c | 28 +-
drivers/net/wireless/mwifiex/debugfs.c | 2 +-
drivers/net/wireless/mwifiex/decl.h | 4 +-
drivers/net/wireless/mwifiex/fw.h | 11 +
drivers/net/wireless/mwifiex/join.c | 23 +-
drivers/net/wireless/mwifiex/main.c | 36 +-
drivers/net/wireless/mwifiex/main.h | 29 +-
drivers/net/wireless/mwifiex/scan.c | 6 +-
drivers/net/wireless/mwifiex/sdio.c | 89 +-
drivers/net/wireless/mwifiex/sdio.h | 6 +-
drivers/net/wireless/mwifiex/sta_cmd.c | 113 +-
drivers/net/wireless/mwifiex/sta_cmdresp.c | 50 +-
drivers/net/wireless/mwifiex/sta_rx.c | 2 +-
drivers/net/wireless/mwifiex/sta_tx.c | 13 +-
drivers/net/wireless/mwifiex/txrx.c | 2 +-
drivers/net/wireless/mwifiex/wmm.c | 30 +-
drivers/net/wireless/mwl8k.c | 1 +
drivers/net/wireless/orinoco/main.c | 2 +-
drivers/net/wireless/p54/p54pci.h | 1 +
drivers/net/wireless/prism54/islpci_dev.c | 1 +
drivers/net/wireless/prism54/islpci_dev.h | 1 +
drivers/net/wireless/prism54/islpci_hotplug.c | 1 +
drivers/net/wireless/rt2x00/Kconfig | 9 +-
drivers/net/wireless/rt2x00/rt2400pci.c | 1 +
drivers/net/wireless/rt2x00/rt2500pci.c | 1 +
drivers/net/wireless/rt2x00/rt2500usb.c | 1 +
drivers/net/wireless/rt2x00/rt2800.h | 16 +
drivers/net/wireless/rt2x00/rt2800lib.c | 378 +-
drivers/net/wireless/rt2x00/rt2800lib.h | 1 -
drivers/net/wireless/rt2x00/rt2800pci.c | 8 +-
drivers/net/wireless/rt2x00/rt2800usb.c | 90 +-
drivers/net/wireless/rt2x00/rt2x00.h | 2 +
drivers/net/wireless/rt2x00/rt2x00crypto.c | 6 +-
drivers/net/wireless/rt2x00/rt2x00dev.c | 13 +
drivers/net/wireless/rt2x00/rt2x00lib.h | 3 +-
drivers/net/wireless/rt2x00/rt2x00mac.c | 14 +
drivers/net/wireless/rt2x00/rt2x00queue.c | 113 +-
drivers/net/wireless/rt2x00/rt2x00queue.h | 4 +-
drivers/net/wireless/rt2x00/rt2x00usb.c | 1 +
drivers/net/wireless/rt2x00/rt61pci.c | 1 +
drivers/net/wireless/rt2x00/rt73usb.c | 1 +
drivers/net/wireless/rtl818x/rtl8180/dev.c | 1 +
drivers/net/wireless/rtlwifi/Kconfig | 15 +-
drivers/net/wireless/rtlwifi/Makefile | 1 +
drivers/net/wireless/rtlwifi/base.c | 6 +-
drivers/net/wireless/rtlwifi/core.c | 12 +-
drivers/net/wireless/rtlwifi/core.h | 2 +
drivers/net/wireless/rtlwifi/efuse.c | 14 +-
drivers/net/wireless/rtlwifi/pci.c | 249 +-
drivers/net/wireless/rtlwifi/pci.h | 12 -
drivers/net/wireless/rtlwifi/ps.c | 97 +-
drivers/net/wireless/rtlwifi/ps.h | 3 +-
drivers/net/wireless/rtlwifi/rc.c | 2 +-
drivers/net/wireless/rtlwifi/regd.c | 18 -
drivers/net/wireless/rtlwifi/rtl8192c/dm_common.c | 4 +-
drivers/net/wireless/rtlwifi/rtl8192c/fw_common.c | 2 -
drivers/net/wireless/rtlwifi/rtl8192c/phy_common.c | 12 +-
drivers/net/wireless/rtlwifi/rtl8192ce/hw.c | 21 +-
drivers/net/wireless/rtlwifi/rtl8192ce/led.c | 2 +-
drivers/net/wireless/rtlwifi/rtl8192ce/phy.c | 14 +-
drivers/net/wireless/rtlwifi/rtl8192ce/reg.h | 2 +
drivers/net/wireless/rtlwifi/rtl8192ce/rf.c | 2 +-
drivers/net/wireless/rtlwifi/rtl8192ce/trx.c | 12 +-
drivers/net/wireless/rtlwifi/rtl8192cu/hw.c | 8 +-
drivers/net/wireless/rtlwifi/rtl8192cu/led.c | 2 +-
drivers/net/wireless/rtlwifi/rtl8192cu/mac.c | 11 -
drivers/net/wireless/rtlwifi/rtl8192cu/phy.c | 2 -
drivers/net/wireless/rtlwifi/rtl8192cu/rf.c | 4 +-
drivers/net/wireless/rtlwifi/rtl8192cu/trx.c | 2 +-
drivers/net/wireless/rtlwifi/rtl8192de/Makefile | 14 +
drivers/net/wireless/rtlwifi/rtl8192de/def.h | 269 +
drivers/net/wireless/rtlwifi/rtl8192de/dm.c | 1355 ++++
drivers/net/wireless/rtlwifi/rtl8192de/dm.h | 212 +
drivers/net/wireless/rtlwifi/rtl8192de/fw.c | 790 +++
drivers/net/wireless/rtlwifi/rtl8192de/fw.h | 155 +
drivers/net/wireless/rtlwifi/rtl8192de/hw.c | 2329 +++++++
drivers/net/wireless/rtlwifi/rtl8192de/hw.h | 66 +
drivers/net/wireless/rtlwifi/rtl8192de/led.c | 159 +
drivers/net/wireless/rtlwifi/rtl8192de/led.h | 38 +
drivers/net/wireless/rtlwifi/rtl8192de/phy.c | 3831 +++++++++++
drivers/net/wireless/rtlwifi/rtl8192de/phy.h | 178 +
drivers/net/wireless/rtlwifi/rtl8192de/reg.h | 1313 ++++
drivers/net/wireless/rtlwifi/rtl8192de/rf.c | 628 ++
drivers/net/wireless/rtlwifi/rtl8192de/rf.h | 44 +
drivers/net/wireless/rtlwifi/rtl8192de/sw.c | 423 ++
drivers/net/wireless/rtlwifi/rtl8192de/sw.h | 37 +
drivers/net/wireless/rtlwifi/rtl8192de/table.c | 1690 +++++
drivers/net/wireless/rtlwifi/rtl8192de/table.h | 57 +
drivers/net/wireless/rtlwifi/rtl8192de/trx.c | 959 +++
drivers/net/wireless/rtlwifi/rtl8192de/trx.h | 756 +++
drivers/net/wireless/rtlwifi/rtl8192se/dm.c | 7 +-
drivers/net/wireless/rtlwifi/rtl8192se/fw.c | 2 -
drivers/net/wireless/rtlwifi/rtl8192se/hw.c | 26 +-
drivers/net/wireless/rtlwifi/rtl8192se/led.c | 2 +-
drivers/net/wireless/rtlwifi/rtl8192se/phy.c | 22 +-
drivers/net/wireless/rtlwifi/rtl8192se/reg.h | 6 +-
drivers/net/wireless/rtlwifi/rtl8192se/rf.c | 2 +-
drivers/net/wireless/rtlwifi/rtl8192se/trx.c | 12 +-
drivers/net/wireless/rtlwifi/wifi.h | 10 +-
drivers/net/wireless/wl1251/sdio.c | 1 +
drivers/net/wireless/wl1251/spi.c | 1 +
drivers/net/wireless/wl12xx/Kconfig | 2 +-
drivers/net/wireless/wl12xx/acx.c | 61 +-
drivers/net/wireless/wl12xx/acx.h | 20 +-
drivers/net/wireless/wl12xx/boot.c | 40 +-
drivers/net/wireless/wl12xx/cmd.c | 109 +-
drivers/net/wireless/wl12xx/cmd.h | 62 +
drivers/net/wireless/wl12xx/conf.h | 65 +-
drivers/net/wireless/wl12xx/debugfs.c | 153 +-
drivers/net/wireless/wl12xx/event.c | 101 +-
drivers/net/wireless/wl12xx/event.h | 29 +-
drivers/net/wireless/wl12xx/ini.h | 3 +
drivers/net/wireless/wl12xx/init.c | 27 +-
drivers/net/wireless/wl12xx/io.c | 7 +-
drivers/net/wireless/wl12xx/io.h | 15 +
drivers/net/wireless/wl12xx/main.c | 793 ++-
drivers/net/wireless/wl12xx/ps.c | 21 +-
drivers/net/wireless/wl12xx/rx.c | 39 +-
drivers/net/wireless/wl12xx/rx.h | 12 +
drivers/net/wireless/wl12xx/scan.c | 90 +-
drivers/net/wireless/wl12xx/scan.h | 18 +-
drivers/net/wireless/wl12xx/sdio.c | 83 +-
drivers/net/wireless/wl12xx/spi.c | 16 +-
drivers/net/wireless/wl12xx/testmode.c | 2 +-
drivers/net/wireless/wl12xx/tx.c | 176 +-
drivers/net/wireless/wl12xx/tx.h | 28 +-
drivers/net/wireless/wl12xx/wl12xx.h | 63 +-
drivers/net/wireless/zd1211rw/zd_chip.h | 2 +
drivers/net/wireless/zd1211rw/zd_def.h | 6 +
drivers/net/wireless/zd1211rw/zd_mac.c | 118 +-
drivers/net/wireless/zd1211rw/zd_mac.h | 1 +
drivers/net/wireless/zd1211rw/zd_usb.c | 129 +-
drivers/net/wireless/zd1211rw/zd_usb.h | 5 +-
drivers/net/xen-netback/netback.c | 1 +
drivers/net/xen-netfront.c | 69 +-
drivers/net/xilinx_emaclite.c | 14 +-
drivers/net/yellowfin.c | 6 +-
drivers/net/znet.c | 2 +-
drivers/net/zorro8390.c | 673 +-
drivers/nfc/Kconfig | 24 +-
drivers/nfc/Makefile | 3 +
drivers/nfc/pn533.c | 1632 +++++
drivers/s390/net/ctcm_mpc.h | 1 +
drivers/s390/net/qeth_core.h | 2 +-
drivers/s390/net/qeth_core_main.c | 1 -
drivers/s390/net/qeth_l3_main.c | 125 +-
drivers/scsi/bnx2fc/57xx_hsi_bnx2fc.h | 1162 ++--
drivers/scsi/bnx2fc/bnx2fc.h | 10 +-
drivers/scsi/bnx2fc/bnx2fc_constants.h | 139 +-
drivers/scsi/bnx2fc/bnx2fc_els.c | 7 +-
drivers/scsi/bnx2fc/bnx2fc_fcoe.c | 12 +-
drivers/scsi/bnx2fc/bnx2fc_hwi.c | 442 +-
drivers/scsi/bnx2fc/bnx2fc_io.c | 23 +-
drivers/scsi/bnx2fc/bnx2fc_tgt.c | 24 +-
drivers/scsi/bnx2i/57xx_iscsi_constants.h | 2 +-
drivers/scsi/bnx2i/57xx_iscsi_hsi.h | 12 +-
drivers/scsi/bnx2i/bnx2i.h | 2 +-
drivers/scsi/bnx2i/bnx2i_hwi.c | 8 +-
drivers/scsi/bnx2i/bnx2i_init.c | 21 +-
drivers/scsi/cxgbi/cxgb3i/cxgb3i.c | 2 +-
drivers/scsi/cxgbi/cxgb4i/cxgb4i.c | 2 +-
drivers/scsi/cxgbi/libcxgbi.c | 4 +-
drivers/ssb/driver_chipcommon_pmu.c | 4 +-
drivers/ssb/driver_gige.c | 13 +-
drivers/ssb/driver_pcicore.c | 10 +-
drivers/ssb/main.c | 33 +-
drivers/ssb/pci.c | 9 +-
drivers/ssb/pcihost_wrapper.c | 6 +-
drivers/ssb/scan.c | 3 +-
drivers/staging/brcm80211/brcmfmac/dhd_linux.c | 2 +
drivers/staging/brcm80211/brcmfmac/wl_iw.c | 1 +
drivers/staging/brcm80211/brcmsmac/wl_mac80211.c | 1 +
drivers/staging/brcm80211/brcmsmac/wl_mac80211.h | 2 +
drivers/staging/et131x/et131x_netdev.c | 1 -
drivers/staging/ft1000/ft1000-usb/ft1000_hw.c | 9 -
drivers/staging/pohmelfs/crypto.c | 1 +
drivers/staging/rtl8187se/ieee80211/ieee80211.h | 1 +
.../rtl8187se/ieee80211/ieee80211_softmac.c | 1 +
drivers/staging/rtl8187se/r8180.h | 1 +
drivers/staging/rtl8187se/r8180_core.c | 1 +
drivers/staging/rtl8192e/ieee80211/ieee80211.h | 1 +
drivers/staging/rtl8192e/r8192E.h | 1 +
drivers/staging/rtl8192e/r8192E_core.c | 2 +
drivers/staging/rtl8192u/ieee80211/ieee80211.h | 1 +
drivers/staging/wlags49_h2/wl_internal.h | 7 -
drivers/tty/serial/ifx6x60.c | 1 +
drivers/usb/gadget/f_phonet.c | 1 +
drivers/vhost/net.c | 91 +-
drivers/vhost/test.c | 5 +
drivers/vhost/vhost.c | 213 +-
drivers/vhost/vhost.h | 32 +
include/crypto/if_alg.h | 1 +
include/linux/arcdevice.h | 1 +
include/linux/ath9k_platform.h | 2 +
include/linux/audit.h | 7 +
include/linux/bcma/bcma.h | 26 +
include/linux/bcma/bcma_driver_chipcommon.h | 1 +
include/linux/bcma/bcma_driver_pci.h | 2 +
include/linux/cordic.h | 48 +
include/linux/crc8.h | 101 +
include/linux/dcbnl.h | 25 +-
include/linux/dccp.h | 1 +
include/linux/dma-direction.h | 13 +
include/linux/dma-mapping.h | 10 +-
include/linux/dmaengine.h | 4 +-
include/linux/etherdevice.h | 2 +-
include/linux/ethtool.h | 35 +-
include/linux/ieee80211.h | 18 +-
include/linux/if_ether.h | 5 +
include/linux/if_packet.h | 6 +
include/linux/if_vlan.h | 91 +-
include/linux/inet_lro.h | 19 -
include/linux/mii.h | 2 +
include/linux/netdevice.h | 55 +-
include/linux/netfilter/ipset/ip_set.h | 50 +-
include/linux/netfilter/ipset/ip_set_ahash.h | 154 +-
include/linux/netfilter/ipset/ip_set_hash.h | 4 +
include/linux/netfilter/ipset/ip_set_timeout.h | 5 +-
include/linux/netfilter/ipset/pfxlen.h | 11 +-
include/linux/netfilter/nfnetlink.h | 3 +
include/linux/netfilter/nfnetlink_queue.h | 1 +
include/linux/netfilter/xt_set.h | 15 +-
include/linux/netlink.h | 8 +-
include/linux/netpoll.h | 2 -
include/linux/nfc.h | 126 +
include/linux/nl80211.h | 42 +-
include/linux/pci_ids.h | 9 +
include/linux/random.h | 1 +
include/linux/rtnetlink.h | 2 +
include/linux/skbuff.h | 73 +-
include/linux/socket.h | 4 +-
include/linux/ssb/ssb.h | 2 +-
include/linux/stmmac.h | 25 +-
include/linux/tc_ematch/tc_em_meta.h | 2 +-
include/linux/tcp.h | 1 +
include/linux/virtio_net.h | 1 +
include/net/act_api.h | 6 +-
include/net/arp.h | 31 +-
include/net/bluetooth/bluetooth.h | 27 +-
include/net/bluetooth/hci.h | 77 +
include/net/bluetooth/hci_core.h | 96 +-
include/net/bluetooth/l2cap.h | 140 +-
include/net/bluetooth/mgmt.h | 12 +
include/net/bluetooth/rfcomm.h | 9 +-
include/net/bluetooth/smp.h | 47 +
include/net/caif/caif_hsi.h | 145 +
include/net/cfg80211.h | 38 +
include/net/dcbnl.h | 11 +-
include/net/dst.h | 41 +-
include/net/dst_ops.h | 1 +
include/net/genetlink.h | 32 +
include/net/inetpeer.h | 39 +-
include/net/ip.h | 10 +-
include/net/ip6_fib.h | 1 -
include/net/ip_vs.h | 34 +-
include/net/ipv6.h | 12 +-
include/net/mac80211.h | 261 +-
include/net/neighbour.h | 34 +-
include/net/net_namespace.h | 1 +
include/net/netlink.h | 24 +
include/net/nfc.h | 156 +
include/net/pkt_sched.h | 4 +-
include/net/rtnetlink.h | 7 +-
include/net/sch_generic.h | 12 +-
include/net/sctp/sctp.h | 15 +-
include/net/sctp/structs.h | 17 +
include/net/sctp/user.h | 1 +
include/net/snmp.h | 86 +-
include/net/sock.h | 2 +
include/net/tcp.h | 11 +-
include/net/wimax.h | 1 -
include/trace/events/sock.h | 68 +
include/trace/events/udp.h | 32 +
kernel/audit.c | 29 +
lib/Kconfig | 14 +
lib/Makefile | 3 +
lib/checksum.c | 13 +-
lib/cordic.c | 101 +
lib/crc8.c | 86 +
net/8021q/vlan.c | 19 +-
net/8021q/vlan.h | 31 +
net/8021q/vlan_core.c | 46 +-
net/8021q/vlan_dev.c | 7 +-
net/8021q/vlanproc.c | 6 +-
net/Kconfig | 1 +
net/Makefile | 1 +
net/TUNABLE | 50 -
net/appletalk/aarp.c | 138 +-
net/appletalk/ddp.c | 398 +-
net/atm/clip.c | 22 +-
net/atm/mpc.c | 2 +-
net/atm/pppoatm.c | 1 +
net/batman-adv/Kconfig | 1 +
net/batman-adv/aggregation.c | 73 +-
net/batman-adv/aggregation.h | 13 +-
net/batman-adv/bat_debugfs.c | 11 +-
net/batman-adv/bat_sysfs.c | 102 +-
net/batman-adv/bat_sysfs.h | 2 +
net/batman-adv/bitarray.c | 12 +-
net/batman-adv/bitarray.h | 10 +-
net/batman-adv/gateway_client.c | 268 +-
net/batman-adv/gateway_client.h | 3 +-
net/batman-adv/gateway_common.c | 25 +-
net/batman-adv/hard-interface.c | 46 +-
net/batman-adv/hard-interface.h | 20 +-
net/batman-adv/hash.c | 7 +-
net/batman-adv/hash.h | 6 +-
net/batman-adv/icmp_socket.c | 4 +-
net/batman-adv/main.c | 31 +-
net/batman-adv/main.h | 85 +-
net/batman-adv/originator.c | 36 +-
net/batman-adv/originator.h | 18 +-
net/batman-adv/packet.h | 142 +-
net/batman-adv/ring_buffer.c | 4 +-
net/batman-adv/ring_buffer.h | 2 +-
net/batman-adv/routing.c | 376 +-
net/batman-adv/routing.h | 15 +-
net/batman-adv/send.c | 147 +-
net/batman-adv/send.h | 14 +-
net/batman-adv/soft-interface.c | 66 +-
net/batman-adv/soft-interface.h | 5 +-
net/batman-adv/translation-table.c | 1566 ++++-
net/batman-adv/translation-table.h | 49 +-
net/batman-adv/types.h | 74 +-
net/batman-adv/unicast.c | 33 +-
net/batman-adv/unicast.h | 8 +-
net/batman-adv/vis.c | 104 +-
net/bluetooth/Kconfig | 9 +
net/bluetooth/Makefile | 2 +-
net/bluetooth/cmtp/capi.c | 3 +-
net/bluetooth/hci_conn.c | 79 +-
net/bluetooth/hci_core.c | 264 +-
net/bluetooth/hci_event.c | 289 +-
net/bluetooth/hci_sock.c | 70 +-
net/bluetooth/l2cap_core.c | 1052 ++--
net/bluetooth/l2cap_sock.c | 442 +-
net/bluetooth/lib.c | 23 +-
net/bluetooth/mgmt.c | 281 +-
net/bluetooth/rfcomm/sock.c | 6 +-
net/bluetooth/sco.c | 4 +-
net/bluetooth/smp.c | 702 ++
net/bridge/br_netfilter.c | 16 +-
net/bridge/br_netlink.c | 15 +-
net/caif/caif_dev.c | 1 -
net/caif/chnl_net.c | 2 +-
net/can/af_can.c | 5 +-
net/can/bcm.c | 1 +
net/ceph/crypto.c | 2 +-
net/core/dev.c | 26 +-
net/core/dst.c | 17 +-
net/core/ethtool.c | 313 +-
net/core/fib_rules.c | 6 +-
net/core/neighbour.c | 191 +-
net/core/net-sysfs.c | 2 -
net/core/net-traces.c | 2 +
net/core/net_namespace.c | 1 +
net/core/netpoll.c | 13 +-
net/core/rtnetlink.c | 64 +-
net/core/skbuff.c | 84 +-
net/core/sock.c | 11 +-
net/core/timestamping.c | 2 +
net/dcb/dcbnl.c | 677 ++-
net/dccp/ccid.c | 4 +-
net/dccp/ccids/ccid2.c | 109 +-
net/dccp/ccids/ccid2.h | 25 +-
net/dccp/input.c | 61 +-
net/dccp/output.c | 14 +-
net/decnet/af_decnet.c | 697 +-
net/decnet/dn_dev.c | 78 +-
net/decnet/dn_fib.c | 81 +-
net/decnet/dn_neigh.c | 42 +-
net/decnet/dn_nsp_in.c | 182 +-
net/decnet/dn_route.c | 143 +-
net/decnet/dn_table.c | 23 +-
net/decnet/netfilter/dn_rtmsg.c | 18 +-
net/decnet/sysctl_net_decnet.c | 17 +-
net/dsa/mv88e6131.c | 8 +-
net/econet/af_econet.c | 172 +-
net/ethernet/eth.c | 3 +-
net/ieee802154/af_ieee802154.c | 2 +-
net/ieee802154/dgram.c | 2 +-
net/ieee802154/nl-phy.c | 31 +
net/ipv4/af_inet.c | 52 +-
net/ipv4/arp.c | 41 +-
net/ipv4/devinet.c | 6 +-
net/ipv4/fib_frontend.c | 6 +-
net/ipv4/fib_trie.c | 12 +-
net/ipv4/gre.c | 1 -
net/ipv4/icmp.c | 14 +-
net/ipv4/inet_diag.c | 2 +-
net/ipv4/inet_lro.c | 74 +-
net/ipv4/inetpeer.c | 293 +-
net/ipv4/ip_fragment.c | 5 +-
net/ipv4/ip_gre.c | 2 +-
net/ipv4/ip_input.c | 4 +-
net/ipv4/ip_output.c | 16 +-
net/ipv4/ipconfig.c | 75 +-
net/ipv4/ipmr.c | 3 +-
net/ipv4/netfilter/ipt_CLUSTERIP.c | 26 +-
net/ipv4/netfilter/nf_defrag_ipv4.c | 2 +-
net/ipv4/netfilter/nf_nat_snmp_basic.c | 210 +-
net/ipv4/netfilter/nf_nat_standalone.c | 2 +-
net/ipv4/raw.c | 36 +-
net/ipv4/route.c | 94 +-
net/ipv4/syncookies.c | 1 +
net/ipv4/sysctl_net_ipv4.c | 14 -
net/ipv4/tcp_input.c | 46 +-
net/ipv4/tcp_ipv4.c | 11 +-
net/ipv4/tcp_minisocks.c | 6 +-
net/ipv4/udp.c | 2 +
net/ipv4/xfrm4_policy.c | 2 +-
net/ipv6/addrconf.c | 55 +-
net/ipv6/addrlabel.c | 9 +-
net/ipv6/ip6_fib.c | 5 +-
net/ipv6/ip6_output.c | 58 +-
net/ipv6/ip6mr.c | 3 +-
net/ipv6/ndisc.c | 16 +-
net/ipv6/raw.c | 145 +-
net/ipv6/route.c | 85 +-
net/ipv6/sit.c | 4 +-
net/ipv6/syncookies.c | 1 +
net/ipv6/tcp_ipv6.c | 5 +
net/ipv6/udp.c | 2 +-
net/irda/af_irda.c | 4 +-
net/irda/ircomm/ircomm_tty_attach.c | 2 +-
net/irda/irda_device.c | 2 +-
net/irda/iriap.c | 8 +-
net/irda/irlan/irlan_client.c | 10 +-
net/irda/irlan/irlan_common.c | 10 +-
net/irda/irlan/irlan_eth.c | 2 +-
net/irda/irlan/irlan_provider.c | 10 +-
net/irda/irqueue.c | 4 +-
net/irda/irttp.c | 18 +-
net/key/af_key.c | 20 +-
net/l2tp/l2tp_ip.c | 19 +-
net/lapb/lapb_iface.c | 30 +-
net/lapb/lapb_in.c | 881 ++--
net/mac80211/aes_ccm.c | 37 +-
net/mac80211/aes_ccm.h | 2 -
net/mac80211/aes_cmac.c | 10 +-
net/mac80211/aes_cmac.h | 2 +-
net/mac80211/agg-rx.c | 21 +-
net/mac80211/cfg.c | 62 +-
net/mac80211/debugfs_key.c | 13 +-
net/mac80211/driver-ops.h | 28 +
net/mac80211/driver-trace.h | 101 +
net/mac80211/ht.c | 6 +
net/mac80211/ieee80211_i.h | 36 +-
net/mac80211/iface.c | 7 +-
net/mac80211/key.c | 171 +-
net/mac80211/key.h | 32 +-
net/mac80211/mesh_pathtbl.c | 4 +-
net/mac80211/mlme.c | 111 +-
net/mac80211/pm.c | 51 +-
net/mac80211/rc80211_minstrel.c | 9 +
net/mac80211/rc80211_minstrel.h | 12 +
net/mac80211/rc80211_minstrel_ht.c | 7 +
net/mac80211/rx.c | 38 +-
net/mac80211/scan.c | 45 +-
net/mac80211/sta_info.h | 6 +-
net/mac80211/tkip.c | 108 +-
net/mac80211/tkip.h | 8 +-
net/mac80211/tx.c | 17 +-
net/mac80211/util.c | 90 +-
net/mac80211/wme.c | 3 +-
net/mac80211/wme.h | 5 -
net/mac80211/work.c | 2 +-
net/mac80211/wpa.c | 94 +-
net/netfilter/ipset/Kconfig | 10 +
net/netfilter/ipset/Makefile | 1 +
net/netfilter/ipset/ip_set_bitmap_ip.c | 35 +-
net/netfilter/ipset/ip_set_bitmap_ipmac.c | 38 +-
net/netfilter/ipset/ip_set_bitmap_port.c | 31 +-
net/netfilter/ipset/ip_set_core.c | 166 +-
net/netfilter/ipset/ip_set_hash_ip.c | 49 +-
net/netfilter/ipset/ip_set_hash_ipport.c | 69 +-
net/netfilter/ipset/ip_set_hash_ipportip.c | 73 +-
net/netfilter/ipset/ip_set_hash_ipportnet.c | 137 +-
net/netfilter/ipset/ip_set_hash_net.c | 88 +-
net/netfilter/ipset/ip_set_hash_netiface.c | 786 +++
net/netfilter/ipset/ip_set_hash_netport.c | 119 +-
net/netfilter/ipset/ip_set_list_set.c | 106 +-
net/netfilter/ipset/pfxlen.c | 23 +-
net/netfilter/ipvs/ip_vs_app.c | 14 +-
net/netfilter/ipvs/ip_vs_conn.c | 4 +-
net/netfilter/ipvs/ip_vs_core.c | 78 +-
net/netfilter/ipvs/ip_vs_ctl.c | 28 +-
net/netfilter/ipvs/ip_vs_est.c | 13 +-
net/netfilter/ipvs/ip_vs_ftp.c | 52 +-
net/netfilter/ipvs/ip_vs_proto.c | 4 +-
net/netfilter/ipvs/ip_vs_sync.c | 13 +-
net/netfilter/nf_conntrack_netlink.c | 4 +-
net/netfilter/nfnetlink.c | 40 +-
net/netfilter/nfnetlink_queue.c | 170 +-
net/netfilter/xt_AUDIT.c | 5 +
net/netfilter/xt_CT.c | 11 +-
net/netfilter/xt_HL.c | 64 +-
net/netfilter/xt_hl.c | 32 +-
net/netfilter/xt_set.c | 153 +-
net/netlabel/netlabel_unlabeled.c | 10 +-
net/netlink/af_netlink.c | 20 +-
net/netlink/genetlink.c | 2 +-
net/netrom/nr_route.c | 22 +-
net/nfc/Kconfig | 16 +
net/nfc/Makefile | 7 +
net/nfc/af_nfc.c | 98 +
net/nfc/core.c | 468 ++
net/nfc/netlink.c | 537 ++
net/nfc/nfc.h | 117 +
net/nfc/rawsock.c | 354 ++
net/packet/af_packet.c | 438 ++-
net/phonet/pn_netlink.c | 13 +-
net/rds/bind.c | 4 +-
net/rds/ib.h | 1 +
net/rds/ib_cm.c | 6 +-
net/rds/ib_send.c | 4 +-
net/rds/iw.h | 1 +
net/rds/iw_cm.c | 9 +-
net/rds/iw_rdma.c | 9 +-
net/rds/iw_send.c | 4 +-
net/rds/send.c | 7 +-
net/rds/tcp_stats.c | 2 +-
net/rose/rose_link.c | 7 -
net/rose/rose_route.c | 5 -
net/sched/act_api.c | 11 +-
net/sched/act_csum.c | 2 +-
net/sched/act_gact.c | 3 +-
net/sched/act_ipt.c | 2 +-
net/sched/act_mirred.c | 2 +-
net/sched/act_nat.c | 2 +-
net/sched/act_pedit.c | 2 +-
net/sched/act_police.c | 2 +-
net/sched/act_simple.c | 3 +-
net/sched/act_skbedit.c | 2 +-
net/sched/cls_api.c | 12 +-
net/sched/cls_basic.c | 2 +-
net/sched/cls_cgroup.c | 2 +-
net/sched/cls_flow.c | 6 +-
net/sched/cls_fw.c | 2 +-
net/sched/cls_route.c | 2 +-
net/sched/cls_rsvp.h | 4 +-
net/sched/cls_tcindex.c | 2 +-
net/sched/cls_u32.c | 2 +-
net/sched/em_meta.c | 7 -
net/sched/sch_api.c | 18 +-
net/sched/sch_atm.c | 1 +
net/sched/sch_choke.c | 2 +-
net/sched/sch_generic.c | 10 +-
net/sched/sch_netem.c | 1 +
net/sched/sch_sfq.c | 2 +-
net/sched/sch_teql.c | 4 +-
net/sctp/associola.c | 6 +
net/sctp/bind_addr.c | 17 +-
net/sctp/input.c | 3 +-
net/sctp/ipv6.c | 2 +
net/sctp/outqueue.c | 13 +
net/sctp/protocol.c | 152 +-
net/sctp/sm_make_chunk.c | 55 +-
net/sctp/sm_sideeffect.c | 2 +-
net/sctp/sm_statefuns.c | 51 +-
net/sctp/socket.c | 200 +-
net/sctp/sysctl.c | 7 +
net/sunrpc/auth.c | 2 +-
net/sunrpc/auth_gss/auth_gss.c | 46 +-
net/sunrpc/clnt.c | 25 +-
net/sunrpc/rpc_pipe.c | 14 +-
net/sunrpc/xprtrdma/svc_rdma_transport.c | 1 +
net/sunrpc/xprtrdma/verbs.c | 1 +
net/tipc/bcast.c | 6 +-
net/tipc/bearer.c | 1 -
net/tipc/bearer.h | 2 -
net/tipc/core.h | 6 -
net/tipc/link.c | 6 +-
net/tipc/msg.c | 6 +-
net/tipc/msg.h | 34 +-
net/tipc/name_distr.c | 6 +-
net/tipc/name_table.c | 289 +-
net/tipc/name_table.h | 14 +-
net/tipc/port.c | 284 +-
net/tipc/socket.c | 3 -
net/wireless/mlme.c | 15 +-
net/wireless/nl80211.c | 232 +-
net/wireless/nl80211.h | 4 +
net/wireless/scan.c | 7 +-
net/x25/af_x25.c | 473 +-
net/x25/x25_dev.c | 44 +-
net/x25/x25_in.c | 118 +-
net/x25/x25_link.c | 87 +-
net/x25/x25_subr.c | 78 +-
net/xfrm/xfrm_policy.c | 9 +-
net/xfrm/xfrm_user.c | 3 +-
security/apparmor/lib.c | 1 +
1296 files changed, 94607 insertions(+), 36995 deletions(-)
create mode 100644 Documentation/networking/netdev-features.txt
create mode 100644 Documentation/networking/nfc.txt
create mode 100644 arch/powerpc/net/Makefile
create mode 100644 arch/powerpc/net/bpf_jit.h
create mode 100644 arch/powerpc/net/bpf_jit_64.S
create mode 100644 arch/powerpc/net/bpf_jit_comp.c
create mode 100644 drivers/bcma/driver_pci_host.c
create mode 100644 drivers/bcma/sprom.c
create mode 100644 drivers/net/bnx2x/bnx2x_sp.c
create mode 100644 drivers/net/bnx2x/bnx2x_sp.h
create mode 100644 drivers/net/caif/caif_hsi.c
create mode 100644 drivers/net/ftgmac100.c
create mode 100644 drivers/net/ftgmac100.h
delete mode 100644 drivers/net/myri_sbus.c
delete mode 100644 drivers/net/myri_sbus.h
create mode 100644 drivers/net/wireless/ath/ath9k/ar9330_1p1_initvals.h
create mode 100644 drivers/net/wireless/ath/ath9k/ar9330_1p2_initvals.h
create mode 100644 drivers/net/wireless/b43/bus.c
create mode 100644 drivers/net/wireless/b43/bus.h
create mode 100644 drivers/net/wireless/b43/phy_ht.c
create mode 100644 drivers/net/wireless/b43/phy_ht.h
create mode 100644 drivers/net/wireless/b43/phy_lcn.c
create mode 100644 drivers/net/wireless/b43/phy_lcn.h
create mode 100644 drivers/net/wireless/b43/radio_2059.c
create mode 100644 drivers/net/wireless/b43/radio_2059.h
create mode 100644 drivers/net/wireless/b43/tables_phy_ht.c
create mode 100644 drivers/net/wireless/b43/tables_phy_ht.h
create mode 100644 drivers/net/wireless/b43/tables_phy_lcn.c
create mode 100644 drivers/net/wireless/b43/tables_phy_lcn.h
create mode 100644 drivers/net/wireless/iwlwifi/iwl-pci.c
create mode 100644 drivers/net/wireless/iwlwifi/iwl-pci.h
create mode 100644 drivers/net/wireless/iwlwifi/iwl-trans.c
create mode 100644 drivers/net/wireless/iwlwifi/iwl-trans.h
create mode 100644 drivers/net/wireless/mac80211_hwsim.h
create mode 100644 drivers/net/wireless/rtlwifi/rtl8192de/Makefile
create mode 100644 drivers/net/wireless/rtlwifi/rtl8192de/def.h
create mode 100644 drivers/net/wireless/rtlwifi/rtl8192de/dm.c
create mode 100644 drivers/net/wireless/rtlwifi/rtl8192de/dm.h
create mode 100644 drivers/net/wireless/rtlwifi/rtl8192de/fw.c
create mode 100644 drivers/net/wireless/rtlwifi/rtl8192de/fw.h
create mode 100644 drivers/net/wireless/rtlwifi/rtl8192de/hw.c
create mode 100644 drivers/net/wireless/rtlwifi/rtl8192de/hw.h
create mode 100644 drivers/net/wireless/rtlwifi/rtl8192de/led.c
create mode 100644 drivers/net/wireless/rtlwifi/rtl8192de/led.h
create mode 100644 drivers/net/wireless/rtlwifi/rtl8192de/phy.c
create mode 100644 drivers/net/wireless/rtlwifi/rtl8192de/phy.h
create mode 100644 drivers/net/wireless/rtlwifi/rtl8192de/reg.h
create mode 100644 drivers/net/wireless/rtlwifi/rtl8192de/rf.c
create mode 100644 drivers/net/wireless/rtlwifi/rtl8192de/rf.h
create mode 100644 drivers/net/wireless/rtlwifi/rtl8192de/sw.c
create mode 100644 drivers/net/wireless/rtlwifi/rtl8192de/sw.h
create mode 100644 drivers/net/wireless/rtlwifi/rtl8192de/table.c
create mode 100644 drivers/net/wireless/rtlwifi/rtl8192de/table.h
create mode 100644 drivers/net/wireless/rtlwifi/rtl8192de/trx.c
create mode 100644 drivers/net/wireless/rtlwifi/rtl8192de/trx.h
create mode 100644 drivers/nfc/pn533.c
create mode 100644 include/linux/cordic.h
create mode 100644 include/linux/crc8.h
create mode 100644 include/linux/dma-direction.h
create mode 100644 include/linux/nfc.h
create mode 100644 include/net/caif/caif_hsi.h
create mode 100644 include/net/nfc.h
create mode 100644 include/trace/events/sock.h
create mode 100644 include/trace/events/udp.h
create mode 100644 lib/cordic.c
create mode 100644 lib/crc8.c
delete mode 100644 net/TUNABLE
create mode 100644 net/bluetooth/smp.c
create mode 100644 net/netfilter/ipset/ip_set_hash_netiface.c
create mode 100644 net/nfc/Kconfig
create mode 100644 net/nfc/Makefile
create mode 100644 net/nfc/af_nfc.c
create mode 100644 net/nfc/core.c
create mode 100644 net/nfc/netlink.c
create mode 100644 net/nfc/nfc.h
create mode 100644 net/nfc/rawsock.c
^ permalink raw reply
* Re: [PATCH/RFC v2 0/13] enable SKB paged fragment lifetime visibility
From: Ian Campbell @ 2011-07-22 14:18 UTC (permalink / raw)
To: David Miller
Cc: netdev-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
linux-nfs-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
In-Reply-To: <20110722.071349.1486529438674839197.davem-fT/PcQaiUtIeIZ0/mPfg9Q@public.gmane.org>
On Fri, 2011-07-22 at 15:13 +0100, David Miller wrote:
> Well, Ian, because you put all of these "struct page *" MM layer
> const changes in here I can't just apply this series once you
> get it ready enough from a networking perspective.
>
> Why not do the const crap later, so it can be done independently
> of these changes and not be a dependency upon them?
Initially it was to help me find locations which needed consideration
(since it caused build failures) but I can flip it round now, sure.
> I know you want to pass const page structs down as far as possible,
> but that can wait for later, make the networking bits work on
> non-const pointers for now.
Will do.
Ian.
--
To unsubscribe from this list: send the line "unsubscribe linux-nfs" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply
* Re: [PATCH 08/13] net: convert drivers to paged frag API.
From: Ian Campbell @ 2011-07-22 14:16 UTC (permalink / raw)
To: David Miller
Cc: netdev-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
linux-nfs-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, Chas Williams,
linux-atm-general-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f
In-Reply-To: <20110722.071217.607687554920673786.davem-fT/PcQaiUtIeIZ0/mPfg9Q@public.gmane.org>
On Fri, 2011-07-22 at 15:12 +0100, David Miller wrote:
> From: Ian Campbell <ian.campbell-Sxgqhf6Nn4DQT0dZR+AlfA@public.gmane.org>
> Date: Fri, 22 Jul 2011 14:17:28 +0100
>
> > - put_dma(tx->index,eni_dev->dma,&j,(unsigned long)
> > - skb_shinfo(skb)->frags[i].page + skb_shinfo(skb)->frags[i].page_offset,
> > + put_dma(tx->index,eni_dev->dma,&j,
> > + (unsigned long)skb_frag_address(&skb_shinfo(skb)->frags[i]),
>
> This is not an equivalent transformation.
>
> skb_frag_address() does a page_address() on the frag page, but that is
> not what the code was doing here previously.
>
> It's possible the code was buggy, but you can't do a fix like that
> amidst what is supposed to be a semantically NOP transformation.
Ouch, you are absolutely right, I didn't spot that, sorry.
The original code does look pretty bogus though, indexing off a struct
page * like that -- CC'ing the ATM maintainer + list.
Ian.
--
To unsubscribe from this list: send the line "unsubscribe linux-nfs" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply
* Re: icmp_route_lookup returns wrong source address information
From: David Miller @ 2011-07-22 14:15 UTC (permalink / raw)
To: fw; +Cc: netdev
In-Reply-To: <20110722141531.GA12328@Chamillionaire.breakpoint.cc>
From: Florian Westphal <fw@strlen.de>
Date: Fri, 22 Jul 2011 16:15:31 +0200
> David Miller <davem@davemloft.net> wrote:
>> From: Florian Westphal <fw@strlen.de>
>> Date: Wed, 20 Jul 2011 21:22:58 +0200
>>
>> > Problem is that xfrm_decode_session_reverse() may rebuild fl4 from scratch.
>> >
>> > In my setup, "goto relookup_failed" will be hit a bit later on, and fl4->saddr will
>> > be set to iph->daddr...
>>
>> Indeed, we can't use this new fl4 until we commit to using 'rt2'.
>>
>> Please give this patch a try:
>>
>> --------------------
>> icmp: Fix regression in nexthop resolution during replies.
>>
>> icmp_route_lookup() uses the wrong flow parameters if the reverse
>> session route lookup isn't used.
>>
>> So do not commit to the re-decoded flow until we actually make a
>> final decision to use a real route saved in 'rt2'.
>
> Thanks, traceroute shows the expected 1st hop again
> with your patch applied.
Thanks for testing!
^ permalink raw reply
* Re: icmp_route_lookup returns wrong source address information
From: Florian Westphal @ 2011-07-22 14:15 UTC (permalink / raw)
To: David Miller; +Cc: netdev
In-Reply-To: <20110722.062302.350752564450519025.davem@davemloft.net>
David Miller <davem@davemloft.net> wrote:
> From: Florian Westphal <fw@strlen.de>
> Date: Wed, 20 Jul 2011 21:22:58 +0200
>
> > Problem is that xfrm_decode_session_reverse() may rebuild fl4 from scratch.
> >
> > In my setup, "goto relookup_failed" will be hit a bit later on, and fl4->saddr will
> > be set to iph->daddr...
>
> Indeed, we can't use this new fl4 until we commit to using 'rt2'.
>
> Please give this patch a try:
>
> --------------------
> icmp: Fix regression in nexthop resolution during replies.
>
> icmp_route_lookup() uses the wrong flow parameters if the reverse
> session route lookup isn't used.
>
> So do not commit to the re-decoded flow until we actually make a
> final decision to use a real route saved in 'rt2'.
Thanks, traceroute shows the expected 1st hop again
with your patch applied.
^ permalink raw reply
* Re: [PATCH/RFC v2 0/13] enable SKB paged fragment lifetime visibility
From: David Miller @ 2011-07-22 14:13 UTC (permalink / raw)
To: Ian.Campbell-Sxgqhf6Nn4DQT0dZR+AlfA
Cc: netdev-u79uwXL29TY76Z2rM5mHXA, linux-nfs-u79uwXL29TY76Z2rM5mHXA
In-Reply-To: <1311340095.12772.57.camel-o4Be2W7LfRlXesXXhkcM7miJhflN2719@public.gmane.org>
Well, Ian, because you put all of these "struct page *" MM layer
const changes in here I can't just apply this series once you
get it ready enough from a networking perspective.
Why not do the const crap later, so it can be done independently
of these changes and not be a dependency upon them?
I know you want to pass const page structs down as far as possible,
but that can wait for later, make the networking bits work on
non-const pointers for now.
--
To unsubscribe from this list: send the line "unsubscribe linux-nfs" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply
* Re: [PATCH 08/13] net: convert drivers to paged frag API.
From: David Miller @ 2011-07-22 14:12 UTC (permalink / raw)
To: ian.campbell-Sxgqhf6Nn4DQT0dZR+AlfA
Cc: netdev-u79uwXL29TY76Z2rM5mHXA, linux-nfs-u79uwXL29TY76Z2rM5mHXA
In-Reply-To: <1311340653-19336-8-git-send-email-ian.campbell-Sxgqhf6Nn4DQT0dZR+AlfA@public.gmane.org>
From: Ian Campbell <ian.campbell-Sxgqhf6Nn4DQT0dZR+AlfA@public.gmane.org>
Date: Fri, 22 Jul 2011 14:17:28 +0100
> - put_dma(tx->index,eni_dev->dma,&j,(unsigned long)
> - skb_shinfo(skb)->frags[i].page + skb_shinfo(skb)->frags[i].page_offset,
> + put_dma(tx->index,eni_dev->dma,&j,
> + (unsigned long)skb_frag_address(&skb_shinfo(skb)->frags[i]),
This is not an equivalent transformation.
skb_frag_address() does a page_address() on the frag page, but that is
not what the code was doing here previously.
It's possible the code was buggy, but you can't do a fix like that
amidst what is supposed to be a semantically NOP transformation.
--
To unsubscribe from this list: send the line "unsubscribe linux-nfs" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply
* Re: icmp_route_lookup returns wrong source address information
From: David Miller @ 2011-07-22 13:23 UTC (permalink / raw)
To: fw; +Cc: netdev
In-Reply-To: <20110720192258.GA21528@Chamillionaire.breakpoint.cc>
From: Florian Westphal <fw@strlen.de>
Date: Wed, 20 Jul 2011 21:22:58 +0200
> Problem is that xfrm_decode_session_reverse() may rebuild fl4 from scratch.
>
> In my setup, "goto relookup_failed" will be hit a bit later on, and fl4->saddr will
> be set to iph->daddr...
Indeed, we can't use this new fl4 until we commit to using 'rt2'.
Please give this patch a try:
--------------------
icmp: Fix regression in nexthop resolution during replies.
icmp_route_lookup() uses the wrong flow parameters if the reverse
session route lookup isn't used.
So do not commit to the re-decoded flow until we actually make a
final decision to use a real route saved in 'rt2'.
Reported-by: Florian Westphal <fw@strlen.de>
Signed-off-by: David S. Miller <davem@davemloft.net>
---
net/ipv4/icmp.c | 14 ++++++++------
1 files changed, 8 insertions(+), 6 deletions(-)
diff --git a/net/ipv4/icmp.c b/net/ipv4/icmp.c
index 5395e45..23ef31b 100644
--- a/net/ipv4/icmp.c
+++ b/net/ipv4/icmp.c
@@ -380,6 +380,7 @@ static struct rtable *icmp_route_lookup(struct net *net,
struct icmp_bxm *param)
{
struct rtable *rt, *rt2;
+ struct flowi4 fl4_dec;
int err;
memset(fl4, 0, sizeof(*fl4));
@@ -408,19 +409,19 @@ static struct rtable *icmp_route_lookup(struct net *net,
} else
return rt;
- err = xfrm_decode_session_reverse(skb_in, flowi4_to_flowi(fl4), AF_INET);
+ err = xfrm_decode_session_reverse(skb_in, flowi4_to_flowi(&fl4_dec), AF_INET);
if (err)
goto relookup_failed;
- if (inet_addr_type(net, fl4->saddr) == RTN_LOCAL) {
- rt2 = __ip_route_output_key(net, fl4);
+ if (inet_addr_type(net, fl4_dec.saddr) == RTN_LOCAL) {
+ rt2 = __ip_route_output_key(net, &fl4_dec);
if (IS_ERR(rt2))
err = PTR_ERR(rt2);
} else {
struct flowi4 fl4_2 = {};
unsigned long orefdst;
- fl4_2.daddr = fl4->saddr;
+ fl4_2.daddr = fl4_dec.saddr;
rt2 = ip_route_output_key(net, &fl4_2);
if (IS_ERR(rt2)) {
err = PTR_ERR(rt2);
@@ -428,7 +429,7 @@ static struct rtable *icmp_route_lookup(struct net *net,
}
/* Ugh! */
orefdst = skb_in->_skb_refdst; /* save old refdst */
- err = ip_route_input(skb_in, fl4->daddr, fl4->saddr,
+ err = ip_route_input(skb_in, fl4_dec.daddr, fl4_dec.saddr,
RT_TOS(tos), rt2->dst.dev);
dst_release(&rt2->dst);
@@ -440,10 +441,11 @@ static struct rtable *icmp_route_lookup(struct net *net,
goto relookup_failed;
rt2 = (struct rtable *) xfrm_lookup(net, &rt2->dst,
- flowi4_to_flowi(fl4), NULL,
+ flowi4_to_flowi(&fl4_dec), NULL,
XFRM_LOOKUP_ICMP);
if (!IS_ERR(rt2)) {
dst_release(&rt->dst);
+ memcpy(fl4, &fl4_dec, sizeof(*fl4));
rt = rt2;
} else if (PTR_ERR(rt2) == -EPERM) {
if (rt)
--
1.7.6
^ permalink raw reply related
* [PATCH 13/13] sunrpc: use SKB fragment destructors to delay completion until page is released by network stack.
From: Ian Campbell @ 2011-07-22 13:17 UTC (permalink / raw)
To: netdev, linux-nfs
Cc: Ian Campbell, Trond Myklebust, David S. Miller, Neil Brown,
J. Bruce Fields
In-Reply-To: <1311340095.12772.57.camel@zakaz.uk.xensource.com>
This prevents an issue where an ACK is delayed, a retransmit is queued (either
at the RPC or TCP level) and the ACK arrives before the retransmission hits the
wire. If this happens to an NFS WRITE RPC then the write() system call
completes and the userspace process can continue, potentially modifying data
referenced by the retransmission before the retransmission occurs.
Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
Cc: Trond Myklebust <Trond.Myklebust@netapp.com>
Cc: "David S. Miller" <davem@davemloft.net>
Cc: Neil Brown <neilb@suse.de>
Cc: "J. Bruce Fields" <bfields@fieldses.org>
Cc: linux-nfs@vger.kernel.org
Cc: netdev@vger.kernel.org
[since v1:
Push down from NFS layer into RPM layer
]
---
include/linux/sunrpc/xdr.h | 2 ++
include/linux/sunrpc/xprt.h | 5 ++++-
net/sunrpc/clnt.c | 27 ++++++++++++++++++++++-----
net/sunrpc/svcsock.c | 2 +-
net/sunrpc/xprt.c | 13 +++++++++++++
net/sunrpc/xprtsock.c | 2 +-
6 files changed, 43 insertions(+), 8 deletions(-)
diff --git a/include/linux/sunrpc/xdr.h b/include/linux/sunrpc/xdr.h
index a20970e..172f81e 100644
--- a/include/linux/sunrpc/xdr.h
+++ b/include/linux/sunrpc/xdr.h
@@ -16,6 +16,7 @@
#include <asm/byteorder.h>
#include <asm/unaligned.h>
#include <linux/scatterlist.h>
+#include <linux/skbuff.h>
/*
* Buffer adjustment
@@ -57,6 +58,7 @@ struct xdr_buf {
tail[1]; /* Appended after page data */
struct page ** pages; /* Array of contiguous pages */
+ struct skb_frag_destructor *destructor;
unsigned int page_base, /* Start of page data */
page_len, /* Length of page data */
flags; /* Flags for data disposition */
diff --git a/include/linux/sunrpc/xprt.h b/include/linux/sunrpc/xprt.h
index 81cce3b..0de6bc3 100644
--- a/include/linux/sunrpc/xprt.h
+++ b/include/linux/sunrpc/xprt.h
@@ -91,7 +91,10 @@ struct rpc_rqst {
/* A cookie used to track the
state of the transport
connection */
-
+ struct skb_frag_destructor destructor; /* SKB paged fragment
+ * destructor for
+ * transmitted pages*/
+
/*
* Partial send handling
*/
diff --git a/net/sunrpc/clnt.c b/net/sunrpc/clnt.c
index 8c91415..1145a19 100644
--- a/net/sunrpc/clnt.c
+++ b/net/sunrpc/clnt.c
@@ -61,6 +61,7 @@ static void call_reserve(struct rpc_task *task);
static void call_reserveresult(struct rpc_task *task);
static void call_allocate(struct rpc_task *task);
static void call_decode(struct rpc_task *task);
+static void call_complete(struct rpc_task *task);
static void call_bind(struct rpc_task *task);
static void call_bind_status(struct rpc_task *task);
static void call_transmit(struct rpc_task *task);
@@ -1114,6 +1115,8 @@ rpc_xdr_encode(struct rpc_task *task)
(char *)req->rq_buffer + req->rq_callsize,
req->rq_rcvsize);
+ req->rq_snd_buf.destructor = &req->destructor;
+
p = rpc_encode_header(task);
if (p == NULL) {
printk(KERN_INFO "RPC: couldn't encode RPC header, exit EIO\n");
@@ -1277,6 +1280,7 @@ call_connect_status(struct rpc_task *task)
static void
call_transmit(struct rpc_task *task)
{
+ struct rpc_rqst *req = task->tk_rqstp;
dprint_status(task);
task->tk_action = call_status;
@@ -1310,8 +1314,8 @@ call_transmit(struct rpc_task *task)
call_transmit_status(task);
if (rpc_reply_expected(task))
return;
- task->tk_action = rpc_exit_task;
- rpc_wake_up_queued_task(&task->tk_xprt->pending, task);
+ task->tk_action = call_complete;
+ skb_frag_destructor_unref(&req->destructor);
}
/*
@@ -1384,7 +1388,8 @@ call_bc_transmit(struct rpc_task *task)
return;
}
- task->tk_action = rpc_exit_task;
+ task->tk_action = call_complete;
+ skb_frag_destructor_unref(&req->destructor);
if (task->tk_status < 0) {
printk(KERN_NOTICE "RPC: Could not send backchannel reply "
"error: %d\n", task->tk_status);
@@ -1424,7 +1429,6 @@ call_bc_transmit(struct rpc_task *task)
"error: %d\n", task->tk_status);
break;
}
- rpc_wake_up_queued_task(&req->rq_xprt->pending, task);
}
#endif /* CONFIG_NFS_V4_1 */
@@ -1591,12 +1595,14 @@ call_decode(struct rpc_task *task)
return;
}
- task->tk_action = rpc_exit_task;
+ task->tk_action = call_complete;
if (decode) {
task->tk_status = rpcauth_unwrap_resp(task, decode, req, p,
task->tk_msg.rpc_resp);
}
+ rpc_sleep_on(&req->rq_xprt->pending, task, NULL);
+ skb_frag_destructor_unref(&req->destructor);
dprintk("RPC: %5u call_decode result %d\n", task->tk_pid,
task->tk_status);
return;
@@ -1611,6 +1617,17 @@ out_retry:
}
}
+/*
+ * 8. Wait for pages to be released by the network stack.
+ */
+static void
+call_complete(struct rpc_task *task)
+{
+ struct rpc_rqst *req = task->tk_rqstp;
+ dprintk("RPC: %5u call_complete result %d\n", task->tk_pid, task->tk_status);
+ task->tk_action = rpc_exit_task;
+}
+
static __be32 *
rpc_encode_header(struct rpc_task *task)
{
diff --git a/net/sunrpc/svcsock.c b/net/sunrpc/svcsock.c
index a80b1d3..40c2420 100644
--- a/net/sunrpc/svcsock.c
+++ b/net/sunrpc/svcsock.c
@@ -194,7 +194,7 @@ int svc_send_common(struct socket *sock, struct xdr_buf *xdr,
while (pglen > 0) {
if (slen == size)
flags = 0;
- result = kernel_sendpage(sock, *ppage, NULL, base, size, flags);
+ result = kernel_sendpage(sock, *ppage, xdr->destructor, base, size, flags);
if (result > 0)
len += result;
if (result != size)
diff --git a/net/sunrpc/xprt.c b/net/sunrpc/xprt.c
index ce5eb68..62f52a3 100644
--- a/net/sunrpc/xprt.c
+++ b/net/sunrpc/xprt.c
@@ -1017,6 +1017,16 @@ static inline void xprt_init_xid(struct rpc_xprt *xprt)
xprt->xid = net_random();
}
+static int xprt_complete_skb_pages(void *calldata)
+{
+ struct rpc_task *task = calldata;
+ struct rpc_rqst *req = task->tk_rqstp;
+
+ dprintk("RPC: %5u completing skb pages\n", task->tk_pid);
+ rpc_wake_up_queued_task(&req->rq_xprt->pending, task);
+ return 0;
+}
+
static void xprt_request_init(struct rpc_task *task, struct rpc_xprt *xprt)
{
struct rpc_rqst *req = task->tk_rqstp;
@@ -1028,6 +1038,9 @@ static void xprt_request_init(struct rpc_task *task, struct rpc_xprt *xprt)
req->rq_xid = xprt_alloc_xid(xprt);
req->rq_release_snd_buf = NULL;
xprt_reset_majortimeo(req);
+ atomic_set(&req->destructor.ref, 1);
+ req->destructor.destroy = &xprt_complete_skb_pages;
+ req->destructor.data = task;
dprintk("RPC: %5u reserved req %p xid %08x\n", task->tk_pid,
req, ntohl(req->rq_xid));
}
diff --git a/net/sunrpc/xprtsock.c b/net/sunrpc/xprtsock.c
index d027621..ca1643b 100644
--- a/net/sunrpc/xprtsock.c
+++ b/net/sunrpc/xprtsock.c
@@ -397,7 +397,7 @@ static int xs_send_pagedata(struct socket *sock, struct xdr_buf *xdr, unsigned i
remainder -= len;
if (remainder != 0 || more)
flags |= MSG_MORE;
- err = sock->ops->sendpage(sock, *ppage, NULL, base, len, flags);
+ err = sock->ops->sendpage(sock, *ppage, xdr->destructor, base, len, flags);
if (remainder == 0 || err != len)
break;
sent += err;
--
1.7.2.5
^ permalink raw reply related
* [PATCH 12/13] net: add paged frag destructor support to kernel_sendpage.
From: Ian Campbell @ 2011-07-22 13:17 UTC (permalink / raw)
To: netdev, linux-nfs
Cc: Ian Campbell, David S. Miller, Alexey Kuznetsov,
Pekka Savola (ipv6), James Morris, Hideaki YOSHIFUJI,
Patrick McHardy, Trond Myklebust, Greg Kroah-Hartman, drbd-user,
devel, cluster-devel, ocfs2-devel, ceph-devel, rds-devel
In-Reply-To: <1311340095.12772.57.camel@zakaz.uk.xensource.com>
Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
Cc: "David S. Miller" <davem@davemloft.net>
Cc: Alexey Kuznetsov <kuznet@ms2.inr.ac.ru>
Cc: "Pekka Savola (ipv6)" <pekkas@netcore.fi>
Cc: James Morris <jmorris@namei.org>
Cc: Hideaki YOSHIFUJI <yoshfuji@linux-ipv6.org>
Cc: Patrick McHardy <kaber@trash.net>
Cc: Trond Myklebust <Trond.Myklebust@netapp.com>
Cc: Greg Kroah-Hartman <gregkh@suse.de>
Cc: drbd-user@lists.linbit.com
Cc: devel@driverdev.osuosl.org
Cc: cluster-devel@redhat.com
Cc: ocfs2-devel@oss.oracle.com
Cc: netdev@vger.kernel.org
Cc: ceph-devel@vger.kernel.org
Cc: rds-devel@oss.oracle.com
Cc: linux-nfs@vger.kernel.org
[since v1:
Drop sendpage_destructor and just add an argument to sendpage protocol hooks
]
---
drivers/block/drbd/drbd_main.c | 1 +
drivers/staging/pohmelfs/trans.c | 2 +-
fs/dlm/lowcomms.c | 2 +-
fs/ocfs2/cluster/tcp.c | 1 +
include/linux/net.h | 6 +++++-
include/net/inet_common.h | 4 +++-
include/net/ip.h | 4 +++-
include/net/sock.h | 2 ++
include/net/tcp.h | 4 +++-
net/ceph/messenger.c | 2 +-
net/core/sock.c | 6 +++++-
net/ipv4/af_inet.c | 9 ++++++---
net/ipv4/ip_output.c | 7 ++++---
net/ipv4/tcp.c | 25 ++++++++++++++++---------
net/ipv4/udp.c | 11 ++++++-----
net/ipv4/udp_impl.h | 5 +++--
net/rds/tcp_send.c | 1 +
net/socket.c | 11 +++++++----
net/sunrpc/svcsock.c | 6 +++---
net/sunrpc/xprtsock.c | 2 +-
20 files changed, 73 insertions(+), 38 deletions(-)
diff --git a/drivers/block/drbd/drbd_main.c b/drivers/block/drbd/drbd_main.c
index 0358e55..49c7346 100644
--- a/drivers/block/drbd/drbd_main.c
+++ b/drivers/block/drbd/drbd_main.c
@@ -2584,6 +2584,7 @@ static int _drbd_send_page(struct drbd_conf *mdev, struct page *page,
set_fs(KERNEL_DS);
do {
sent = mdev->data.socket->ops->sendpage(mdev->data.socket, page,
+ NULL,
offset, len,
msg_flags);
if (sent == -EAGAIN) {
diff --git a/drivers/staging/pohmelfs/trans.c b/drivers/staging/pohmelfs/trans.c
index 36a2535..b5d8411 100644
--- a/drivers/staging/pohmelfs/trans.c
+++ b/drivers/staging/pohmelfs/trans.c
@@ -104,7 +104,7 @@ static int netfs_trans_send_pages(struct netfs_trans *t, struct netfs_state *st)
msg.msg_flags = MSG_WAITALL | (attached_pages == 1 ? 0 :
MSG_MORE);
- err = kernel_sendpage(st->socket, page, 0, size, msg.msg_flags);
+ err = kernel_sendpage(st->socket, page, NULL, 0, size, msg.msg_flags);
if (err <= 0) {
printk("%s: %d/%d failed to send transaction page: t: %p, gen: %u, size: %u, err: %d.\n",
__func__, i, t->page_num, t, t->gen, size, err);
diff --git a/fs/dlm/lowcomms.c b/fs/dlm/lowcomms.c
index 5e2c71f..64933ff 100644
--- a/fs/dlm/lowcomms.c
+++ b/fs/dlm/lowcomms.c
@@ -1341,7 +1341,7 @@ static void send_to_sock(struct connection *con)
ret = 0;
if (len) {
- ret = kernel_sendpage(con->sock, e->page, offset, len,
+ ret = kernel_sendpage(con->sock, e->page, NULL, offset, len,
msg_flags);
if (ret == -EAGAIN || ret == 0) {
if (ret == -EAGAIN &&
diff --git a/fs/ocfs2/cluster/tcp.c b/fs/ocfs2/cluster/tcp.c
index db5ee4b..81366a0 100644
--- a/fs/ocfs2/cluster/tcp.c
+++ b/fs/ocfs2/cluster/tcp.c
@@ -982,6 +982,7 @@ static void o2net_sendpage(struct o2net_sock_container *sc,
mutex_lock(&sc->sc_send_lock);
ret = sc->sc_sock->ops->sendpage(sc->sc_sock,
virt_to_page(kmalloced_virt),
+ NULL,
(long)kmalloced_virt & ~PAGE_MASK,
size, MSG_DONTWAIT);
mutex_unlock(&sc->sc_send_lock);
diff --git a/include/linux/net.h b/include/linux/net.h
index b299230..db562ba 100644
--- a/include/linux/net.h
+++ b/include/linux/net.h
@@ -157,6 +157,7 @@ struct kiocb;
struct sockaddr;
struct msghdr;
struct module;
+struct skb_frag_destructor;
struct proto_ops {
int family;
@@ -203,6 +204,7 @@ struct proto_ops {
int (*mmap) (struct file *file, struct socket *sock,
struct vm_area_struct * vma);
ssize_t (*sendpage) (struct socket *sock, struct page *page,
+ struct skb_frag_destructor *destroy,
int offset, size_t size, int flags);
ssize_t (*splice_read)(struct socket *sock, loff_t *ppos,
struct pipe_inode_info *pipe, size_t len, unsigned int flags);
@@ -273,7 +275,9 @@ extern int kernel_getsockopt(struct socket *sock, int level, int optname,
char *optval, int *optlen);
extern int kernel_setsockopt(struct socket *sock, int level, int optname,
char *optval, unsigned int optlen);
-extern int kernel_sendpage(struct socket *sock, struct page *page, int offset,
+extern int kernel_sendpage(struct socket *sock, struct page *page,
+ struct skb_frag_destructor *destroy,
+ int offset,
size_t size, int flags);
extern int kernel_sock_ioctl(struct socket *sock, int cmd, unsigned long arg);
extern int kernel_sock_shutdown(struct socket *sock,
diff --git a/include/net/inet_common.h b/include/net/inet_common.h
index 22fac98..91cd8d0 100644
--- a/include/net/inet_common.h
+++ b/include/net/inet_common.h
@@ -21,7 +21,9 @@ extern int inet_dgram_connect(struct socket *sock, struct sockaddr * uaddr,
extern int inet_accept(struct socket *sock, struct socket *newsock, int flags);
extern int inet_sendmsg(struct kiocb *iocb, struct socket *sock,
struct msghdr *msg, size_t size);
-extern ssize_t inet_sendpage(struct socket *sock, struct page *page, int offset,
+extern ssize_t inet_sendpage(struct socket *sock, struct page *page,
+ struct skb_frag_destructor *frag,
+ int offset,
size_t size, int flags);
extern int inet_recvmsg(struct kiocb *iocb, struct socket *sock,
struct msghdr *msg, size_t size, int flags);
diff --git a/include/net/ip.h b/include/net/ip.h
index 66dd491..887a834 100644
--- a/include/net/ip.h
+++ b/include/net/ip.h
@@ -114,7 +114,9 @@ extern int ip_append_data(struct sock *sk, struct flowi4 *fl4,
struct rtable **rt,
unsigned int flags);
extern int ip_generic_getfrag(void *from, char *to, int offset, int len, int odd, struct sk_buff *skb);
-extern ssize_t ip_append_page(struct sock *sk, struct flowi4 *fl4, struct page *page,
+extern ssize_t ip_append_page(struct sock *sk, struct flowi4 *fl4,
+ struct page *page,
+ struct skb_frag_destructor *destroy,
int offset, size_t size, int flags);
extern struct sk_buff *__ip_make_skb(struct sock *sk,
struct flowi4 *fl4,
diff --git a/include/net/sock.h b/include/net/sock.h
index c0b938c..c1ab674 100644
--- a/include/net/sock.h
+++ b/include/net/sock.h
@@ -763,6 +763,7 @@ struct proto {
size_t len, int noblock, int flags,
int *addr_len);
int (*sendpage)(struct sock *sk, struct page *page,
+ struct skb_frag_destructor *destroy,
int offset, size_t size, int flags);
int (*bind)(struct sock *sk,
struct sockaddr *uaddr, int addr_len);
@@ -1152,6 +1153,7 @@ extern int sock_no_mmap(struct file *file,
struct vm_area_struct *vma);
extern ssize_t sock_no_sendpage(struct socket *sock,
struct page *page,
+ struct skb_frag_destructor *destroy,
int offset, size_t size,
int flags);
diff --git a/include/net/tcp.h b/include/net/tcp.h
index cda30ea..1f43c0d 100644
--- a/include/net/tcp.h
+++ b/include/net/tcp.h
@@ -317,7 +317,9 @@ extern void *tcp_v4_tw_get_peer(struct sock *sk);
extern int tcp_v4_tw_remember_stamp(struct inet_timewait_sock *tw);
extern int tcp_sendmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg,
size_t size);
-extern int tcp_sendpage(struct sock *sk, struct page *page, int offset,
+extern int tcp_sendpage(struct sock *sk, struct page *page,
+ struct skb_frag_destructor *destroy,
+ int offset,
size_t size, int flags);
extern int tcp_ioctl(struct sock *sk, int cmd, unsigned long arg);
extern int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb,
diff --git a/net/ceph/messenger.c b/net/ceph/messenger.c
index 78b55f4..ec7955b 100644
--- a/net/ceph/messenger.c
+++ b/net/ceph/messenger.c
@@ -852,7 +852,7 @@ static int write_partial_msg_pages(struct ceph_connection *con)
cpu_to_le32(crc32c(tmpcrc, base, len));
con->out_msg_pos.did_page_crc = 1;
}
- ret = kernel_sendpage(con->sock, page,
+ ret = kernel_sendpage(con->sock, page, NULL,
con->out_msg_pos.page_pos + page_shift,
len,
MSG_DONTWAIT | MSG_NOSIGNAL |
diff --git a/net/core/sock.c b/net/core/sock.c
index be55676..87d04db 100644
--- a/net/core/sock.c
+++ b/net/core/sock.c
@@ -1858,7 +1858,9 @@ int sock_no_mmap(struct file *file, struct socket *sock, struct vm_area_struct *
}
EXPORT_SYMBOL(sock_no_mmap);
-ssize_t sock_no_sendpage(struct socket *sock, struct page *page, int offset, size_t size, int flags)
+ssize_t sock_no_sendpage(struct socket *sock, struct page *page,
+ struct skb_frag_destructor *destroy,
+ int offset, size_t size, int flags)
{
ssize_t res;
struct msghdr msg = {.msg_flags = flags};
@@ -1868,6 +1870,8 @@ ssize_t sock_no_sendpage(struct socket *sock, struct page *page, int offset, siz
iov.iov_len = size;
res = kernel_sendmsg(sock, &msg, &iov, 1, size);
kunmap(page);
+ /* kernel_sendmsg copies so we can destroy immediately */
+ skb_frag_destructor_unref(destroy);
return res;
}
EXPORT_SYMBOL(sock_no_sendpage);
diff --git a/net/ipv4/af_inet.c b/net/ipv4/af_inet.c
index ef1528a..45c0876 100644
--- a/net/ipv4/af_inet.c
+++ b/net/ipv4/af_inet.c
@@ -740,7 +740,9 @@ int inet_sendmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *msg,
}
EXPORT_SYMBOL(inet_sendmsg);
-ssize_t inet_sendpage(struct socket *sock, struct page *page, int offset,
+ssize_t inet_sendpage(struct socket *sock, struct page *page,
+ struct skb_frag_destructor *destroy,
+ int offset,
size_t size, int flags)
{
struct sock *sk = sock->sk;
@@ -753,8 +755,9 @@ ssize_t inet_sendpage(struct socket *sock, struct page *page, int offset,
return -EAGAIN;
if (sk->sk_prot->sendpage)
- return sk->sk_prot->sendpage(sk, page, offset, size, flags);
- return sock_no_sendpage(sock, page, offset, size, flags);
+ return sk->sk_prot->sendpage(sk, page, destroy,
+ offset, size, flags);
+ return sock_no_sendpage(sock, page, destroy, offset, size, flags);
}
EXPORT_SYMBOL(inet_sendpage);
diff --git a/net/ipv4/ip_output.c b/net/ipv4/ip_output.c
index c4326fb..b35b728 100644
--- a/net/ipv4/ip_output.c
+++ b/net/ipv4/ip_output.c
@@ -1111,6 +1111,7 @@ int ip_append_data(struct sock *sk, struct flowi4 *fl4,
}
ssize_t ip_append_page(struct sock *sk, struct flowi4 *fl4, struct page *page,
+ struct skb_frag_destructor *destroy,
int offset, size_t size, int flags)
{
struct inet_sock *inet = inet_sk(sk);
@@ -1224,11 +1225,11 @@ ssize_t ip_append_page(struct sock *sk, struct flowi4 *fl4, struct page *page,
i = skb_shinfo(skb)->nr_frags;
if (len > size)
len = size;
- if (skb_can_coalesce(skb, i, page, NULL, offset)) {
+ if (skb_can_coalesce(skb, i, page, destroy, offset)) {
skb_shinfo(skb)->frags[i-1].size += len;
} else if (i < MAX_SKB_FRAGS) {
- get_page(page);
- skb_fill_page_desc(skb, i, page, NULL, offset, len);
+ skb_fill_page_desc(skb, i, page, destroy, offset, len);
+ skb_frag_ref(skb, i);
} else {
err = -EMSGSIZE;
goto error;
diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c
index a1a0ccd..2f590e5 100644
--- a/net/ipv4/tcp.c
+++ b/net/ipv4/tcp.c
@@ -757,7 +757,10 @@ static int tcp_send_mss(struct sock *sk, int *size_goal, int flags)
return mss_now;
}
-static ssize_t do_tcp_sendpages(struct sock *sk, struct page **pages, int poffset,
+static ssize_t do_tcp_sendpages(struct sock *sk,
+ struct page **pages,
+ struct skb_frag_destructor **destructors,
+ int poffset,
size_t psize, int flags)
{
struct tcp_sock *tp = tcp_sk(sk);
@@ -783,6 +786,8 @@ static ssize_t do_tcp_sendpages(struct sock *sk, struct page **pages, int poffse
while (psize > 0) {
struct sk_buff *skb = tcp_write_queue_tail(sk);
struct page *page = pages[poffset / PAGE_SIZE];
+ struct skb_frag_destructor *destroy =
+ destructors ? destructors[poffset / PAGE_SIZE] : NULL;
int copy, i, can_coalesce;
int offset = poffset % PAGE_SIZE;
int size = min_t(size_t, psize, PAGE_SIZE - offset);
@@ -804,7 +809,7 @@ new_segment:
copy = size;
i = skb_shinfo(skb)->nr_frags;
- can_coalesce = skb_can_coalesce(skb, i, page, NULL, offset);
+ can_coalesce = skb_can_coalesce(skb, i, page, destroy, offset);
if (!can_coalesce && i >= MAX_SKB_FRAGS) {
tcp_mark_push(tp, skb);
goto new_segment;
@@ -815,8 +820,8 @@ new_segment:
if (can_coalesce) {
skb_shinfo(skb)->frags[i - 1].size += copy;
} else {
- get_page(page);
- skb_fill_page_desc(skb, i, page, NULL, offset, copy);
+ skb_fill_page_desc(skb, i, page, destroy, offset, copy);
+ skb_frag_ref(skb, i);
}
skb->len += copy;
@@ -871,18 +876,20 @@ out_err:
return sk_stream_error(sk, flags, err);
}
-int tcp_sendpage(struct sock *sk, struct page *page, int offset,
- size_t size, int flags)
+int tcp_sendpage(struct sock *sk, struct page *page,
+ struct skb_frag_destructor *destroy,
+ int offset, size_t size, int flags)
{
ssize_t res;
if (!(sk->sk_route_caps & NETIF_F_SG) ||
!(sk->sk_route_caps & NETIF_F_ALL_CSUM))
- return sock_no_sendpage(sk->sk_socket, page, offset, size,
- flags);
+ return sock_no_sendpage(sk->sk_socket, page, destroy,
+ offset, size, flags);
lock_sock(sk);
- res = do_tcp_sendpages(sk, &page, offset, size, flags);
+ res = do_tcp_sendpages(sk, &page, &destroy,
+ offset, size, flags);
release_sock(sk);
return res;
}
diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c
index 198f75b..ebdc8ea 100644
--- a/net/ipv4/udp.c
+++ b/net/ipv4/udp.c
@@ -1027,8 +1027,9 @@ do_confirm:
}
EXPORT_SYMBOL(udp_sendmsg);
-int udp_sendpage(struct sock *sk, struct page *page, int offset,
- size_t size, int flags)
+int udp_sendpage(struct sock *sk, struct page *page,
+ struct skb_frag_destructor *destroy,
+ int offset, size_t size, int flags)
{
struct inet_sock *inet = inet_sk(sk);
struct udp_sock *up = udp_sk(sk);
@@ -1056,11 +1057,11 @@ int udp_sendpage(struct sock *sk, struct page *page, int offset,
}
ret = ip_append_page(sk, &inet->cork.fl.u.ip4,
- page, offset, size, flags);
+ page, destroy, offset, size, flags);
if (ret == -EOPNOTSUPP) {
release_sock(sk);
- return sock_no_sendpage(sk->sk_socket, page, offset,
- size, flags);
+ return sock_no_sendpage(sk->sk_socket, page, destroy,
+ offset, size, flags);
}
if (ret < 0) {
udp_flush_pending_frames(sk);
diff --git a/net/ipv4/udp_impl.h b/net/ipv4/udp_impl.h
index aaad650..4923d82 100644
--- a/net/ipv4/udp_impl.h
+++ b/net/ipv4/udp_impl.h
@@ -23,8 +23,9 @@ extern int compat_udp_getsockopt(struct sock *sk, int level, int optname,
#endif
extern int udp_recvmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg,
size_t len, int noblock, int flags, int *addr_len);
-extern int udp_sendpage(struct sock *sk, struct page *page, int offset,
- size_t size, int flags);
+extern int udp_sendpage(struct sock *sk, struct page *page,
+ struct skb_frag_destructor *destroy,
+ int offset, size_t size, int flags);
extern int udp_queue_rcv_skb(struct sock * sk, struct sk_buff *skb);
extern void udp_destroy_sock(struct sock *sk);
diff --git a/net/rds/tcp_send.c b/net/rds/tcp_send.c
index 1b4fd68..e0f03be 100644
--- a/net/rds/tcp_send.c
+++ b/net/rds/tcp_send.c
@@ -121,6 +121,7 @@ int rds_tcp_xmit(struct rds_connection *conn, struct rds_message *rm,
sg_page(&rm->data.op_sg[sg]),
rm->data.op_sg[sg].offset + off,
rm->data.op_sg[sg].length - off,
+ NULL,
MSG_DONTWAIT|MSG_NOSIGNAL);
rdsdebug("tcp sendpage %p:%u:%u ret %d\n", (void *)sg_page(&rm->data.op_sg[sg]),
rm->data.op_sg[sg].offset + off, rm->data.op_sg[sg].length - off,
diff --git a/net/socket.c b/net/socket.c
index 02dc82d..4b77658 100644
--- a/net/socket.c
+++ b/net/socket.c
@@ -795,7 +795,7 @@ static ssize_t sock_sendpage(struct file *file, struct page *page,
if (more)
flags |= MSG_MORE;
- return kernel_sendpage(sock, page, offset, size, flags);
+ return kernel_sendpage(sock, page, NULL, offset, size, flags);
}
static ssize_t sock_splice_read(struct file *file, loff_t *ppos,
@@ -3343,15 +3343,18 @@ int kernel_setsockopt(struct socket *sock, int level, int optname,
}
EXPORT_SYMBOL(kernel_setsockopt);
-int kernel_sendpage(struct socket *sock, struct page *page, int offset,
+int kernel_sendpage(struct socket *sock, struct page *page,
+ struct skb_frag_destructor *destroy,
+ int offset,
size_t size, int flags)
{
sock_update_classid(sock->sk);
if (sock->ops->sendpage)
- return sock->ops->sendpage(sock, page, offset, size, flags);
+ return sock->ops->sendpage(sock, page, destroy,
+ offset, size, flags);
- return sock_no_sendpage(sock, page, offset, size, flags);
+ return sock_no_sendpage(sock, page, destroy, offset, size, flags);
}
EXPORT_SYMBOL(kernel_sendpage);
diff --git a/net/sunrpc/svcsock.c b/net/sunrpc/svcsock.c
index af04f77..a80b1d3 100644
--- a/net/sunrpc/svcsock.c
+++ b/net/sunrpc/svcsock.c
@@ -181,7 +181,7 @@ int svc_send_common(struct socket *sock, struct xdr_buf *xdr,
/* send head */
if (slen == xdr->head[0].iov_len)
flags = 0;
- len = kernel_sendpage(sock, headpage, headoffset,
+ len = kernel_sendpage(sock, headpage, NULL, headoffset,
xdr->head[0].iov_len, flags);
if (len != xdr->head[0].iov_len)
goto out;
@@ -194,7 +194,7 @@ int svc_send_common(struct socket *sock, struct xdr_buf *xdr,
while (pglen > 0) {
if (slen == size)
flags = 0;
- result = kernel_sendpage(sock, *ppage, base, size, flags);
+ result = kernel_sendpage(sock, *ppage, NULL, base, size, flags);
if (result > 0)
len += result;
if (result != size)
@@ -208,7 +208,7 @@ int svc_send_common(struct socket *sock, struct xdr_buf *xdr,
/* send tail */
if (xdr->tail[0].iov_len) {
- result = kernel_sendpage(sock, tailpage, tailoffset,
+ result = kernel_sendpage(sock, tailpage, NULL, tailoffset,
xdr->tail[0].iov_len, 0);
if (result > 0)
len += result;
diff --git a/net/sunrpc/xprtsock.c b/net/sunrpc/xprtsock.c
index 72abb73..d027621 100644
--- a/net/sunrpc/xprtsock.c
+++ b/net/sunrpc/xprtsock.c
@@ -397,7 +397,7 @@ static int xs_send_pagedata(struct socket *sock, struct xdr_buf *xdr, unsigned i
remainder -= len;
if (remainder != 0 || more)
flags |= MSG_MORE;
- err = sock->ops->sendpage(sock, *ppage, base, len, flags);
+ err = sock->ops->sendpage(sock, *ppage, NULL, base, len, flags);
if (remainder == 0 || err != len)
break;
sent += err;
--
1.7.2.5
^ permalink raw reply related
* [PATCH 11/13] net: only allow paged fragments with the same destructor to be coalesced.
From: Ian Campbell @ 2011-07-22 13:17 UTC (permalink / raw)
To: netdev, linux-nfs
Cc: Ian Campbell, David S. Miller, Alexey Kuznetsov,
Pekka Savola (ipv6), James Morris, Hideaki YOSHIFUJI,
Patrick McHardy, Eric Dumazet, Michał Mirosław
In-Reply-To: <1311340095.12772.57.camel@zakaz.uk.xensource.com>
Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
Cc: "David S. Miller" <davem@davemloft.net>
Cc: Alexey Kuznetsov <kuznet@ms2.inr.ac.ru>
Cc: "Pekka Savola (ipv6)" <pekkas@netcore.fi>
Cc: James Morris <jmorris@namei.org>
Cc: Hideaki YOSHIFUJI <yoshfuji@linux-ipv6.org>
Cc: Patrick McHardy <kaber@trash.net>
Cc: Eric Dumazet <eric.dumazet@gmail.com>
Cc: "Michał Mirosław" <mirq-linux@rere.qmqm.pl>
Cc: netdev@vger.kernel.org
---
include/linux/skbuff.h | 7 +++++--
net/core/skbuff.c | 1 +
net/ipv4/ip_output.c | 2 +-
net/ipv4/tcp.c | 2 +-
4 files changed, 8 insertions(+), 4 deletions(-)
diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h
index faee8d3..fb64a0e 100644
--- a/include/linux/skbuff.h
+++ b/include/linux/skbuff.h
@@ -1931,13 +1931,16 @@ static inline int skb_add_data(struct sk_buff *skb,
}
static inline int skb_can_coalesce(struct sk_buff *skb, int i,
- const struct page *page, int off)
+ const struct page *page,
+ const struct skb_frag_destructor *destroy,
+ int off)
{
if (i) {
struct skb_frag_struct *frag = &skb_shinfo(skb)->frags[i - 1];
return page == skb_frag_page(frag) &&
- off == frag->page_offset + frag->size;
+ off == frag->page_offset + frag->size &&
+ frag->page.destructor == destroy;
}
return 0;
}
diff --git a/net/core/skbuff.c b/net/core/skbuff.c
index 101c9cc..3d89b1a 100644
--- a/net/core/skbuff.c
+++ b/net/core/skbuff.c
@@ -2152,6 +2152,7 @@ int skb_shift(struct sk_buff *tgt, struct sk_buff *skb, int shiftlen)
*/
if (!to ||
!skb_can_coalesce(tgt, to, skb_frag_page(fragfrom),
+ fragfrom->page.destructor,
fragfrom->page_offset)) {
merge = -1;
} else {
diff --git a/net/ipv4/ip_output.c b/net/ipv4/ip_output.c
index 5946de2..c4326fb 100644
--- a/net/ipv4/ip_output.c
+++ b/net/ipv4/ip_output.c
@@ -1224,7 +1224,7 @@ ssize_t ip_append_page(struct sock *sk, struct flowi4 *fl4, struct page *page,
i = skb_shinfo(skb)->nr_frags;
if (len > size)
len = size;
- if (skb_can_coalesce(skb, i, page, offset)) {
+ if (skb_can_coalesce(skb, i, page, NULL, offset)) {
skb_shinfo(skb)->frags[i-1].size += len;
} else if (i < MAX_SKB_FRAGS) {
get_page(page);
diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c
index 2f0e985..a1a0ccd 100644
--- a/net/ipv4/tcp.c
+++ b/net/ipv4/tcp.c
@@ -1008,7 +1008,7 @@ new_segment:
struct page *page = TCP_PAGE(sk);
int off = TCP_OFF(sk);
- if (skb_can_coalesce(skb, i, page, off) &&
+ if (skb_can_coalesce(skb, i, page, NULL, off) &&
off != PAGE_SIZE) {
/* We can extend the last page
* fragment. */
--
1.7.2.5
^ permalink raw reply related
* [PATCH 10/13] net: add paged frag destructor to skb_fill_page_desc()
From: Ian Campbell @ 2011-07-22 13:17 UTC (permalink / raw)
To: netdev, linux-nfs
Cc: Ian Campbell, David S. Miller, James E.J. Bottomley,
Alexey Kuznetsov, Pekka Savola (ipv6), James Morris,
Hideaki YOSHIFUJI, Patrick McHardy, linux-rdma, linux-s390,
linux-scsi, devel
In-Reply-To: <1311340095.12772.57.camel@zakaz.uk.xensource.com>
Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
Cc: "David S. Miller" <davem@davemloft.net>
Cc: "James E.J. Bottomley" <JBottomley@parallels.com>
Cc: Alexey Kuznetsov <kuznet@ms2.inr.ac.ru>
Cc: "Pekka Savola (ipv6)" <pekkas@netcore.fi>
Cc: James Morris <jmorris@namei.org>
Cc: Hideaki YOSHIFUJI <yoshfuji@linux-ipv6.org>
Cc: Patrick McHardy <kaber@trash.net>
Cc: netdev@vger.kernel.org
Cc: linux-rdma@vger.kernel.org
Cc: linux-s390@vger.kernel.org
Cc: linux-scsi@vger.kernel.org
Cc: devel@open-fcoe.org
---
drivers/block/aoe/aoecmd.c | 6 ++++--
drivers/infiniband/ulp/ipoib/ipoib_cm.c | 4 ++--
drivers/infiniband/ulp/ipoib/ipoib_ib.c | 2 +-
drivers/net/bnx2.c | 3 ++-
drivers/net/bnx2x/bnx2x_cmn.c | 2 +-
drivers/net/cxgb3/sge.c | 4 ++--
drivers/net/e1000/e1000_main.c | 25 +++++++++++++++++--------
drivers/net/e1000e/netdev.c | 28 +++++++++++++++++++---------
drivers/net/ftmac100.c | 2 +-
drivers/net/igb/igb_main.c | 5 ++---
drivers/net/igbvf/netdev.c | 5 ++---
drivers/net/ixgbe/ixgbe_main.c | 2 +-
drivers/net/ixgbevf/ixgbevf_main.c | 2 +-
drivers/net/qlge/qlge_main.c | 24 +++++++++++-------------
drivers/net/sky2.c | 2 +-
drivers/s390/net/qeth_core_main.c | 7 ++++---
drivers/scsi/cxgbi/libcxgbi.c | 8 ++++----
drivers/scsi/fcoe/fcoe_transport.c | 2 +-
drivers/scsi/libfc/fc_fcp.c | 5 ++++-
drivers/target/tcm_fc/tfc_io.c | 5 ++++-
include/linux/skbuff.h | 12 ++++++++----
net/core/skbuff.c | 4 ++--
net/core/sock.c | 2 +-
net/ipv4/ip_output.c | 7 ++++---
net/ipv4/tcp.c | 7 ++++---
net/ipv6/ip6_output.c | 7 +++++--
net/packet/af_packet.c | 2 +-
27 files changed, 109 insertions(+), 75 deletions(-)
diff --git a/drivers/block/aoe/aoecmd.c b/drivers/block/aoe/aoecmd.c
index de0435e..05c13a0 100644
--- a/drivers/block/aoe/aoecmd.c
+++ b/drivers/block/aoe/aoecmd.c
@@ -252,7 +252,8 @@ aoecmd_ata_rw(struct aoedev *d)
ah->lba3 |= 0xe0; /* LBA bit + obsolete 0xa0 */
}
if (bio_data_dir(buf->bio) == WRITE) {
- skb_fill_page_desc(skb, 0, bv->bv_page, buf->bv_off, bcnt);
+ skb_fill_page_desc(skb, 0, bv->bv_page, NULL, buf->bv_off,
+ bcnt);
ah->aflags |= AOEAFL_WRITE;
skb->len += bcnt;
skb->data_len = bcnt;
@@ -369,7 +370,8 @@ resend(struct aoedev *d, struct aoetgt *t, struct frame *f)
ah->scnt = n >> 9;
if (ah->aflags & AOEAFL_WRITE) {
skb_fill_page_desc(skb, 0, virt_to_page(f->bufaddr),
- offset_in_page(f->bufaddr), n);
+ NULL, offset_in_page(f->bufaddr),
+ n);
skb->len = sizeof *h + sizeof *ah + n;
skb->data_len = n;
}
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_cm.c b/drivers/infiniband/ulp/ipoib/ipoib_cm.c
index 1f20e40..0d12366 100644
--- a/drivers/infiniband/ulp/ipoib/ipoib_cm.c
+++ b/drivers/infiniband/ulp/ipoib/ipoib_cm.c
@@ -167,7 +167,7 @@ static struct sk_buff *ipoib_cm_alloc_rx_skb(struct net_device *dev,
if (!page)
goto partial_error;
- skb_fill_page_desc(skb, i, page, 0, PAGE_SIZE);
+ skb_fill_page_desc(skb, i, page, NULL, 0, PAGE_SIZE);
mapping[i + 1] = ib_dma_map_page(priv->ca,
__skb_frag_page(&skb_shinfo(skb)->frags[i]),
@@ -539,7 +539,7 @@ static void skb_put_frags(struct sk_buff *skb, unsigned int hdr_space,
if (length == 0) {
/* don't need this page */
skb_fill_page_desc(toskb, i, __skb_frag_page(frag),
- 0, PAGE_SIZE);/* XXX */
+ NULL, 0, PAGE_SIZE);/* XXX */
--skb_shinfo(skb)->nr_frags;
} else {
size = min(length, (unsigned) PAGE_SIZE);
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_ib.c b/drivers/infiniband/ulp/ipoib/ipoib_ib.c
index f6ef6c2..96657c2 100644
--- a/drivers/infiniband/ulp/ipoib/ipoib_ib.c
+++ b/drivers/infiniband/ulp/ipoib/ipoib_ib.c
@@ -180,7 +180,7 @@ static struct sk_buff *ipoib_alloc_rx_skb(struct net_device *dev, int id)
struct page *page = alloc_page(GFP_ATOMIC);
if (!page)
goto partial_error;
- skb_fill_page_desc(skb, 0, page, 0, PAGE_SIZE);
+ skb_fill_page_desc(skb, 0, page, NULL, 0, PAGE_SIZE);
mapping[1] =
ib_dma_map_page(priv->ca,
__skb_frag_page(&skb_shinfo(skb)->frags[0]),
diff --git a/drivers/net/bnx2.c b/drivers/net/bnx2.c
index ff90b13..101bac8 100644
--- a/drivers/net/bnx2.c
+++ b/drivers/net/bnx2.c
@@ -3014,7 +3014,8 @@ bnx2_rx_skb(struct bnx2 *bp, struct bnx2_rx_ring_info *rxr, struct sk_buff *skb,
if (i == pages - 1)
frag_len -= 4;
- skb_fill_page_desc(skb, i, rx_pg->page, 0, frag_len);
+ skb_fill_page_desc(skb, i, rx_pg->page, NULL, 0,
+ frag_len);
rx_pg->page = NULL;
err = bnx2_alloc_rx_page(bp, rxr,
diff --git a/drivers/net/bnx2x/bnx2x_cmn.c b/drivers/net/bnx2x/bnx2x_cmn.c
index dee09d7..5521077 100644
--- a/drivers/net/bnx2x/bnx2x_cmn.c
+++ b/drivers/net/bnx2x/bnx2x_cmn.c
@@ -394,7 +394,7 @@ static int bnx2x_fill_frag_skb(struct bnx2x *bp, struct bnx2x_fastpath *fp,
SGE_PAGE_SIZE*PAGES_PER_SGE, DMA_FROM_DEVICE);
/* Add one frag and update the appropriate fields in the skb */
- skb_fill_page_desc(skb, j, old_rx_pg.page, 0, frag_len);
+ skb_fill_page_desc(skb, j, old_rx_pg.page, NULL, 0, frag_len);
skb->data_len += frag_len;
skb->truesize += frag_len;
diff --git a/drivers/net/cxgb3/sge.c b/drivers/net/cxgb3/sge.c
index 3f73a5c..6e90ca6 100644
--- a/drivers/net/cxgb3/sge.c
+++ b/drivers/net/cxgb3/sge.c
@@ -889,7 +889,7 @@ recycle:
if (!skb) {
__skb_put(newskb, SGE_RX_PULL_LEN);
memcpy(newskb->data, sd->pg_chunk.va, SGE_RX_PULL_LEN);
- skb_fill_page_desc(newskb, 0, sd->pg_chunk.page,
+ skb_fill_page_desc(newskb, 0, sd->pg_chunk.page, NULL,
sd->pg_chunk.offset + SGE_RX_PULL_LEN,
len - SGE_RX_PULL_LEN);
newskb->len = len;
@@ -897,7 +897,7 @@ recycle:
newskb->truesize += newskb->data_len;
} else {
skb_fill_page_desc(newskb, skb_shinfo(newskb)->nr_frags,
- sd->pg_chunk.page,
+ sd->pg_chunk.page, NULL,
sd->pg_chunk.offset, len);
newskb->len += len;
newskb->data_len += len;
diff --git a/drivers/net/e1000/e1000_main.c b/drivers/net/e1000/e1000_main.c
index e902cd0..93a6898 100644
--- a/drivers/net/e1000/e1000_main.c
+++ b/drivers/net/e1000/e1000_main.c
@@ -3808,13 +3808,17 @@ static bool e1000_clean_jumbo_rx_irq(struct e1000_adapter *adapter,
if (!rxtop) {
/* this is the beginning of a chain */
rxtop = skb;
- skb_fill_page_desc(rxtop, 0, buffer_info->page,
- 0, length);
+ skb_fill_page_desc(rxtop, 0,
+ buffer_info->page, NULL,
+ 0, length);
} else {
/* this is the middle of a chain */
skb_fill_page_desc(rxtop,
- skb_shinfo(rxtop)->nr_frags,
- buffer_info->page, 0, length);
+ skb_shinfo(rxtop)->nr_frags,
+ buffer_info->page,
+ NULL,
+ 0,
+ length);
/* re-use the skb, only consumed the page */
buffer_info->skb = skb;
}
@@ -3824,8 +3828,11 @@ static bool e1000_clean_jumbo_rx_irq(struct e1000_adapter *adapter,
if (rxtop) {
/* end of the chain */
skb_fill_page_desc(rxtop,
- skb_shinfo(rxtop)->nr_frags,
- buffer_info->page, 0, length);
+ skb_shinfo(rxtop)->nr_frags,
+ buffer_info->page,
+ NULL,
+ 0,
+ length);
/* re-use the current skb, we only consumed the
* page */
buffer_info->skb = skb;
@@ -3848,8 +3855,10 @@ static bool e1000_clean_jumbo_rx_irq(struct e1000_adapter *adapter,
skb_put(skb, length);
} else {
skb_fill_page_desc(skb, 0,
- buffer_info->page, 0,
- length);
+ buffer_info->page,
+ NULL,
+ 0,
+ length);
e1000_consume_page(buffer_info, skb,
length);
}
diff --git a/drivers/net/e1000e/netdev.c b/drivers/net/e1000e/netdev.c
index 30f8a5c..28da1a7 100644
--- a/drivers/net/e1000e/netdev.c
+++ b/drivers/net/e1000e/netdev.c
@@ -1196,7 +1196,8 @@ static bool e1000_clean_rx_irq_ps(struct e1000_adapter *adapter,
dma_unmap_page(&pdev->dev, ps_page->dma, PAGE_SIZE,
DMA_FROM_DEVICE);
ps_page->dma = 0;
- skb_fill_page_desc(skb, j, ps_page->page, 0, length);
+ skb_fill_page_desc(skb, j, ps_page->page, NULL, 0,
+ length);
ps_page->page = NULL;
skb->len += length;
skb->data_len += length;
@@ -1336,13 +1337,17 @@ static bool e1000_clean_jumbo_rx_irq(struct e1000_adapter *adapter,
if (!rxtop) {
/* this is the beginning of a chain */
rxtop = skb;
- skb_fill_page_desc(rxtop, 0, buffer_info->page,
- 0, length);
+ skb_fill_page_desc(rxtop, 0,
+ buffer_info->page, NULL,
+ 0, length);
} else {
/* this is the middle of a chain */
skb_fill_page_desc(rxtop,
- skb_shinfo(rxtop)->nr_frags,
- buffer_info->page, 0, length);
+ skb_shinfo(rxtop)->nr_frags,
+ buffer_info->page,
+ NULL,
+ 0,
+ length);
/* re-use the skb, only consumed the page */
buffer_info->skb = skb;
}
@@ -1352,8 +1357,11 @@ static bool e1000_clean_jumbo_rx_irq(struct e1000_adapter *adapter,
if (rxtop) {
/* end of the chain */
skb_fill_page_desc(rxtop,
- skb_shinfo(rxtop)->nr_frags,
- buffer_info->page, 0, length);
+ skb_shinfo(rxtop)->nr_frags,
+ buffer_info->page,
+ NULL,
+ 0,
+ length);
/* re-use the current skb, we only consumed the
* page */
buffer_info->skb = skb;
@@ -1377,8 +1385,10 @@ static bool e1000_clean_jumbo_rx_irq(struct e1000_adapter *adapter,
skb_put(skb, length);
} else {
skb_fill_page_desc(skb, 0,
- buffer_info->page, 0,
- length);
+ buffer_info->page,
+ NULL,
+ 0,
+ length);
e1000_consume_page(buffer_info, skb,
length);
}
diff --git a/drivers/net/ftmac100.c b/drivers/net/ftmac100.c
index 9bd7746..d8497dd 100644
--- a/drivers/net/ftmac100.c
+++ b/drivers/net/ftmac100.c
@@ -436,7 +436,7 @@ static bool ftmac100_rx_packet(struct ftmac100 *priv, int *processed)
length = ftmac100_rxdes_frame_length(rxdes);
page = ftmac100_rxdes_get_page(rxdes);
- skb_fill_page_desc(skb, 0, page, 0, length);
+ skb_fill_page_desc(skb, 0, page, NULL, 0, length);
skb->len += length;
skb->data_len += length;
skb->truesize += length;
diff --git a/drivers/net/igb/igb_main.c b/drivers/net/igb/igb_main.c
index 17f94f4..ac48baf 100644
--- a/drivers/net/igb/igb_main.c
+++ b/drivers/net/igb/igb_main.c
@@ -5835,9 +5835,8 @@ static bool igb_clean_rx_irq_adv(struct igb_q_vector *q_vector,
buffer_info->page_dma = 0;
skb_fill_page_desc(skb, skb_shinfo(skb)->nr_frags,
- buffer_info->page,
- buffer_info->page_offset,
- length);
+ buffer_info->page, NULL,
+ buffer_info->page_offset, length);
if ((page_count(buffer_info->page) != 1) ||
(page_to_nid(buffer_info->page) != current_node))
diff --git a/drivers/net/igbvf/netdev.c b/drivers/net/igbvf/netdev.c
index 3f6655f..9360f0a 100644
--- a/drivers/net/igbvf/netdev.c
+++ b/drivers/net/igbvf/netdev.c
@@ -300,9 +300,8 @@ static bool igbvf_clean_rx_irq(struct igbvf_adapter *adapter,
buffer_info->page_dma = 0;
skb_fill_page_desc(skb, skb_shinfo(skb)->nr_frags,
- buffer_info->page,
- buffer_info->page_offset,
- length);
+ buffer_info->page, NULL,
+ buffer_info->page_offset, length);
if ((adapter->rx_buffer_len > (PAGE_SIZE / 2)) ||
(page_count(buffer_info->page) != 1))
diff --git a/drivers/net/ixgbe/ixgbe_main.c b/drivers/net/ixgbe/ixgbe_main.c
index 307cf06..d481bea 100644
--- a/drivers/net/ixgbe/ixgbe_main.c
+++ b/drivers/net/ixgbe/ixgbe_main.c
@@ -1409,7 +1409,7 @@ static void ixgbe_clean_rx_irq(struct ixgbe_q_vector *q_vector,
DMA_FROM_DEVICE);
rx_buffer_info->page_dma = 0;
skb_fill_page_desc(skb, skb_shinfo(skb)->nr_frags,
- rx_buffer_info->page,
+ rx_buffer_info->page, NULL,
rx_buffer_info->page_offset,
upper_len);
diff --git a/drivers/net/ixgbevf/ixgbevf_main.c b/drivers/net/ixgbevf/ixgbevf_main.c
index ad05ad9..347ae21 100644
--- a/drivers/net/ixgbevf/ixgbevf_main.c
+++ b/drivers/net/ixgbevf/ixgbevf_main.c
@@ -508,7 +508,7 @@ static bool ixgbevf_clean_rx_irq(struct ixgbevf_q_vector *q_vector,
PAGE_SIZE / 2, DMA_FROM_DEVICE);
rx_buffer_info->page_dma = 0;
skb_fill_page_desc(skb, skb_shinfo(skb)->nr_frags,
- rx_buffer_info->page,
+ rx_buffer_info->page, NULL,
rx_buffer_info->page_offset,
upper_len);
diff --git a/drivers/net/qlge/qlge_main.c b/drivers/net/qlge/qlge_main.c
index cc04e5b..d2a420c 100644
--- a/drivers/net/qlge/qlge_main.c
+++ b/drivers/net/qlge/qlge_main.c
@@ -1558,9 +1558,9 @@ static void ql_process_mac_rx_page(struct ql_adapter *qdev,
netif_printk(qdev, rx_status, KERN_DEBUG, qdev->ndev,
"%d bytes of headers and data in large. Chain page to new skb and pull tail.\n",
length);
- skb_fill_page_desc(skb, 0, lbq_desc->p.pg_chunk.page,
- lbq_desc->p.pg_chunk.offset+ETH_HLEN,
- length-ETH_HLEN);
+ skb_fill_page_desc(skb, 0, lbq_desc->p.pg_chunk.page, NULL,
+ lbq_desc->p.pg_chunk.offset + ETH_HLEN,
+ length - ETH_HLEN);
skb->len += length-ETH_HLEN;
skb->data_len += length-ETH_HLEN;
skb->truesize += length-ETH_HLEN;
@@ -1838,8 +1838,8 @@ static struct sk_buff *ql_build_rx_skb(struct ql_adapter *qdev,
"Chaining page at offset = %d, for %d bytes to skb.\n",
lbq_desc->p.pg_chunk.offset, length);
skb_fill_page_desc(skb, 0, lbq_desc->p.pg_chunk.page,
- lbq_desc->p.pg_chunk.offset,
- length);
+ NULL, lbq_desc->p.pg_chunk.offset,
+ length);
skb->len += length;
skb->data_len += length;
skb->truesize += length;
@@ -1865,10 +1865,9 @@ static struct sk_buff *ql_build_rx_skb(struct ql_adapter *qdev,
netif_printk(qdev, rx_status, KERN_DEBUG, qdev->ndev,
"%d bytes of headers and data in large. Chain page to new skb and pull tail.\n",
length);
- skb_fill_page_desc(skb, 0,
- lbq_desc->p.pg_chunk.page,
- lbq_desc->p.pg_chunk.offset,
- length);
+ skb_fill_page_desc(skb, 0, lbq_desc->p.pg_chunk.page,
+ NULL, lbq_desc->p.pg_chunk.offset,
+ length);
skb->len += length;
skb->data_len += length;
skb->truesize += length;
@@ -1920,10 +1919,9 @@ static struct sk_buff *ql_build_rx_skb(struct ql_adapter *qdev,
netif_printk(qdev, rx_status, KERN_DEBUG, qdev->ndev,
"Adding page %d to skb for %d bytes.\n",
i, size);
- skb_fill_page_desc(skb, i,
- lbq_desc->p.pg_chunk.page,
- lbq_desc->p.pg_chunk.offset,
- size);
+ skb_fill_page_desc(skb, i, lbq_desc->p.pg_chunk.page,
+ NULL, lbq_desc->p.pg_chunk.offset,
+ size);
skb->len += size;
skb->data_len += size;
skb->truesize += size;
diff --git a/drivers/net/sky2.c b/drivers/net/sky2.c
index e1cf142..80c88be 100644
--- a/drivers/net/sky2.c
+++ b/drivers/net/sky2.c
@@ -1388,7 +1388,7 @@ static struct sk_buff *sky2_rx_alloc(struct sky2_port *sky2)
if (!page)
goto free_partial;
- skb_fill_page_desc(skb, i, page, 0, PAGE_SIZE);
+ skb_fill_page_desc(skb, i, page, NULL, 0, PAGE_SIZE);
}
return skb;
diff --git a/drivers/s390/net/qeth_core_main.c b/drivers/s390/net/qeth_core_main.c
index dd08f7b..c50a5b7 100644
--- a/drivers/s390/net/qeth_core_main.c
+++ b/drivers/s390/net/qeth_core_main.c
@@ -4163,8 +4163,8 @@ static inline int qeth_create_skb_frag(struct qdio_buffer_element *element,
} else {
get_page(page);
memcpy(skb_put(*pskb, 64), element->addr + offset, 64);
- skb_fill_page_desc(*pskb, *pfrag, page, offset + 64,
- data_len - 64);
+ skb_fill_page_desc(*pskb, *pfrag, page, NULL,
+ offset + 64, data_len - 64);
(*pskb)->data_len += data_len - 64;
(*pskb)->len += data_len - 64;
(*pskb)->truesize += data_len - 64;
@@ -4172,7 +4172,8 @@ static inline int qeth_create_skb_frag(struct qdio_buffer_element *element,
}
} else {
get_page(page);
- skb_fill_page_desc(*pskb, *pfrag, page, offset, data_len);
+ skb_fill_page_desc(*pskb, *pfrag, page, NULL, offset,
+ data_len);
(*pskb)->data_len += data_len;
(*pskb)->len += data_len;
(*pskb)->truesize += data_len;
diff --git a/drivers/scsi/cxgbi/libcxgbi.c b/drivers/scsi/cxgbi/libcxgbi.c
index 8d16a74..94185f9 100644
--- a/drivers/scsi/cxgbi/libcxgbi.c
+++ b/drivers/scsi/cxgbi/libcxgbi.c
@@ -1977,8 +1977,8 @@ int cxgbi_conn_init_pdu(struct iscsi_task *task, unsigned int offset,
pg = virt_to_page(task->data);
get_page(pg);
- skb_fill_page_desc(skb, 0, pg, offset_in_page(task->data),
- count);
+ skb_fill_page_desc(skb, 0, pg, NULL,
+ offset_in_page(task->data), count);
skb->len += count;
skb->data_len += count;
skb->truesize += count;
@@ -1987,8 +1987,8 @@ int cxgbi_conn_init_pdu(struct iscsi_task *task, unsigned int offset,
if (padlen) {
i = skb_shinfo(skb)->nr_frags;
skb_fill_page_desc(skb, skb_shinfo(skb)->nr_frags,
- virt_to_page(padding), offset_in_page(padding),
- padlen);
+ virt_to_page(padding), NULL,
+ offset_in_page(padding), padlen);
skb->data_len += padlen;
skb->truesize += padlen;
diff --git a/drivers/scsi/fcoe/fcoe_transport.c b/drivers/scsi/fcoe/fcoe_transport.c
index 40243ce..e957823 100644
--- a/drivers/scsi/fcoe/fcoe_transport.c
+++ b/drivers/scsi/fcoe/fcoe_transport.c
@@ -266,7 +266,7 @@ int fcoe_get_paged_crc_eof(struct sk_buff *skb, int tlen,
}
get_page(page);
- skb_fill_page_desc(skb, skb_shinfo(skb)->nr_frags, page,
+ skb_fill_page_desc(skb, skb_shinfo(skb)->nr_frags, page, NULL,
fps->crc_eof_offset, tlen);
skb->len += tlen;
skb->data_len += tlen;
diff --git a/drivers/scsi/libfc/fc_fcp.c b/drivers/scsi/libfc/fc_fcp.c
index 9cd2149..6689515 100644
--- a/drivers/scsi/libfc/fc_fcp.c
+++ b/drivers/scsi/libfc/fc_fcp.c
@@ -640,7 +640,10 @@ static int fc_fcp_send_data(struct fc_fcp_pkt *fsp, struct fc_seq *seq,
get_page(page);
skb_fill_page_desc(fp_skb(fp),
skb_shinfo(fp_skb(fp))->nr_frags,
- page, off & ~PAGE_MASK, sg_bytes);
+ page,
+ NULL,
+ off & ~PAGE_MASK,
+ sg_bytes);
fp_skb(fp)->data_len += sg_bytes;
fr_len(fp) += sg_bytes;
fp_skb(fp)->truesize += PAGE_SIZE;
diff --git a/drivers/target/tcm_fc/tfc_io.c b/drivers/target/tcm_fc/tfc_io.c
index 8c4a240..53dc0ff 100644
--- a/drivers/target/tcm_fc/tfc_io.c
+++ b/drivers/target/tcm_fc/tfc_io.c
@@ -164,7 +164,10 @@ int ft_queue_data_in(struct se_cmd *se_cmd)
get_page(page);
skb_fill_page_desc(fp_skb(fp),
skb_shinfo(fp_skb(fp))->nr_frags,
- page, off_in_page, tlen);
+ page,
+ NULL,
+ off_in_page,
+ tlen);
fr_len(fp) += tlen;
fp_skb(fp)->data_len += tlen;
fp_skb(fp)->truesize +=
diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h
index 9818fe2..faee8d3 100644
--- a/include/linux/skbuff.h
+++ b/include/linux/skbuff.h
@@ -1134,12 +1134,14 @@ static inline int skb_pagelen(const struct sk_buff *skb)
* Does not take any additional reference on the fragment.
*/
static inline void __skb_fill_page_desc(struct sk_buff *skb, int i,
- struct page *page, int off, int size)
+ struct page *page,
+ struct skb_frag_destructor *destroy,
+ int off, int size)
{
skb_frag_t *frag = &skb_shinfo(skb)->frags[i];
frag->page.p = page;
- frag->page.destructor = NULL;
+ frag->page.destructor = destroy;
frag->page_offset = off;
frag->size = size;
}
@@ -1159,9 +1161,11 @@ static inline void __skb_fill_page_desc(struct sk_buff *skb, int i,
* Does not take any additional reference on the fragment.
*/
static inline void skb_fill_page_desc(struct sk_buff *skb, int i,
- struct page *page, int off, int size)
+ struct page *page,
+ struct skb_frag_destructor *destroy,
+ int off, int size)
{
- __skb_fill_page_desc(skb, i, page, off, size);
+ __skb_fill_page_desc(skb, i, page, destroy, off, size);
skb_shinfo(skb)->nr_frags = i + 1;
}
diff --git a/net/core/skbuff.c b/net/core/skbuff.c
index bdc6f6e..101c9cc 100644
--- a/net/core/skbuff.c
+++ b/net/core/skbuff.c
@@ -263,7 +263,7 @@ EXPORT_SYMBOL(__netdev_alloc_skb);
void skb_add_rx_frag(struct sk_buff *skb, int i, struct page *page, int off,
int size)
{
- skb_fill_page_desc(skb, i, page, off, size);
+ skb_fill_page_desc(skb, i, page, NULL, off, size);
skb->len += size;
skb->data_len += size;
skb->truesize += size;
@@ -2454,7 +2454,7 @@ int skb_append_datato_frags(struct sock *sk, struct sk_buff *skb,
return -ENOMEM;
/* initialize the next frag */
- skb_fill_page_desc(skb, frg_cnt, page, 0, 0);
+ skb_fill_page_desc(skb, frg_cnt, page, NULL, 0, 0);
skb->truesize += PAGE_SIZE;
atomic_add(PAGE_SIZE, &sk->sk_wmem_alloc);
diff --git a/net/core/sock.c b/net/core/sock.c
index 0fb2160..be55676 100644
--- a/net/core/sock.c
+++ b/net/core/sock.c
@@ -1540,7 +1540,7 @@ struct sk_buff *sock_alloc_send_pskb(struct sock *sk, unsigned long header_len,
}
__skb_fill_page_desc(skb, i,
- page, 0,
+ page, NULL, 0,
(data_len >= PAGE_SIZE ?
PAGE_SIZE :
data_len));
diff --git a/net/ipv4/ip_output.c b/net/ipv4/ip_output.c
index 3aa3c91..5946de2 100644
--- a/net/ipv4/ip_output.c
+++ b/net/ipv4/ip_output.c
@@ -987,7 +987,8 @@ alloc_new_skb:
err = -EMSGSIZE;
goto error;
}
- skb_fill_page_desc(skb, i, page, off, 0);
+ skb_fill_page_desc(skb, i, page,
+ NULL, off, 0);
frag = &skb_shinfo(skb)->frags[i];
__skb_frag_ref(frag);
}
@@ -1003,7 +1004,7 @@ alloc_new_skb:
cork->off = 0;
/* XXX no ref ? */
- skb_fill_page_desc(skb, i, page, 0, 0);
+ skb_fill_page_desc(skb, i, page, NULL, 0, 0);
frag = &skb_shinfo(skb)->frags[i];
} else {
err = -EMSGSIZE;
@@ -1227,7 +1228,7 @@ ssize_t ip_append_page(struct sock *sk, struct flowi4 *fl4, struct page *page,
skb_shinfo(skb)->frags[i-1].size += len;
} else if (i < MAX_SKB_FRAGS) {
get_page(page);
- skb_fill_page_desc(skb, i, page, offset, len);
+ skb_fill_page_desc(skb, i, page, NULL, offset, len);
} else {
err = -EMSGSIZE;
goto error;
diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c
index ac47ab3..2f0e985 100644
--- a/net/ipv4/tcp.c
+++ b/net/ipv4/tcp.c
@@ -804,7 +804,7 @@ new_segment:
copy = size;
i = skb_shinfo(skb)->nr_frags;
- can_coalesce = skb_can_coalesce(skb, i, page, offset);
+ can_coalesce = skb_can_coalesce(skb, i, page, NULL, offset);
if (!can_coalesce && i >= MAX_SKB_FRAGS) {
tcp_mark_push(tp, skb);
goto new_segment;
@@ -816,7 +816,7 @@ new_segment:
skb_shinfo(skb)->frags[i - 1].size += copy;
} else {
get_page(page);
- skb_fill_page_desc(skb, i, page, offset, copy);
+ skb_fill_page_desc(skb, i, page, NULL, offset, copy);
}
skb->len += copy;
@@ -1061,7 +1061,8 @@ new_segment:
skb_shinfo(skb)->frags[i - 1].size +=
copy;
} else {
- skb_fill_page_desc(skb, i, page, off, copy);
+ skb_fill_page_desc(skb, i, page,
+ NULL, off, copy);
if (TCP_PAGE(sk)) {
get_page(page);
} else if (off + copy < PAGE_SIZE) {
diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c
index fdd4f61..c019865 100644
--- a/net/ipv6/ip6_output.c
+++ b/net/ipv6/ip6_output.c
@@ -1446,7 +1446,10 @@ alloc_new_skb:
err = -EMSGSIZE;
goto error;
}
- skb_fill_page_desc(skb, i, page, sk->sk_sndmsg_off, 0);
+ skb_fill_page_desc(skb, i, page,
+ NULL,
+ sk->sk_sndmsg_off,
+ 0);
frag = &skb_shinfo(skb)->frags[i];
__skb_frag_ref(frag);
}
@@ -1462,7 +1465,7 @@ alloc_new_skb:
sk->sk_sndmsg_off = 0;
/* XXX no ref ? */
- skb_fill_page_desc(skb, i, page, 0, 0);
+ skb_fill_page_desc(skb, i, page, NULL, 0, 0);
frag = &skb_shinfo(skb)->frags[i];
} else {
err = -EMSGSIZE;
diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c
index c0c3cda..1053c28 100644
--- a/net/packet/af_packet.c
+++ b/net/packet/af_packet.c
@@ -960,7 +960,7 @@ static int tpacket_fill_skb(struct packet_sock *po, struct sk_buff *skb,
data += len;
flush_dcache_page(page);
get_page(page);
- skb_fill_page_desc(skb, nr_frags, page, offset, len);
+ skb_fill_page_desc(skb, nr_frags, page, NULL, offset, len);
to_write -= len;
offset = 0;
len_max = PAGE_SIZE;
--
1.7.2.5
^ permalink raw reply related
* [PATCH 09/13] net: add support for per-paged-fragment destructors
From: Ian Campbell @ 2011-07-22 13:17 UTC (permalink / raw)
To: netdev, linux-nfs
Cc: Ian Campbell, David S. Miller, James E.J. Bottomley,
Dimitris Michailidis, Casey Leedom, Yevgeny Petrilin,
Eric Dumazet, Michał Mirosław, linux-scsi
In-Reply-To: <1311340095.12772.57.camel@zakaz.uk.xensource.com>
Entities which care about the complete lifecycle of pages which they inject
into the network stack via an skb paged fragment can choose to set this
destructor in order to receive a callback when the stack is really finished
with a page (including all clones, retransmits, pull-ups etc etc).
This destructor will always be propagated alongside the struct page when
copying skb_frag_t->page. This is the reason I chose to embed the destructor in
a "struct { } page" within the skb_frag_t, rather than as a separate field,
since it allows existing code which propagates ->frags[N].page to Just
Work(tm).
When the destructor is present the page reference counting is done slightly
differently. No references are held by the network stack on the struct page (it
is up to the caller to manage this as necessary) instead the network stack will
track references via the count embedded in the destructor structure. When this
reference count reaches zero then the destructor will be called and the caller
can take the necesary steps to release the page (i.e. release the struct page
reference itself).
The intention is that callers can use this callback to delay completion to
_their_ callers until the network stack has completely released the page, in
order to prevent use-after-free or modification of data pages which are still
in use by the stack.
It is allowable (indeed expected) for a caller to share a single destructor
instance between multiple pages injected into the stack e.g. a group of pages
included in a single higher level operation might share a destructor which is
used to complete that higher level operation.
NB: a small number of drivers use skb_frag_t independently of struct sk_buff so
this patch is slightly larger than necessary. I did consider leaving skb_frag_t
alone and defining a new (but similar) structure to be used in the struct
sk_buff itself. This would also have the advantage of more clearly separating
the two uses, which is useful since there are now special reference counting
accessors for skb_frag_t within a struct sk_buff but not (necessarily) for
those used outside of an skb.
Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
Cc: "David S. Miller" <davem@davemloft.net>
Cc: "James E.J. Bottomley" <JBottomley@parallels.com>
Cc: Dimitris Michailidis <dm@chelsio.com>
Cc: Casey Leedom <leedom@chelsio.com>
Cc: Yevgeny Petrilin <yevgenyp@mellanox.co.il>
Cc: Eric Dumazet <eric.dumazet@gmail.com>
Cc: "Michał Mirosław" <mirq-linux@rere.qmqm.pl>
Cc: netdev@vger.kernel.org
Cc: linux-scsi@vger.kernel.org
---
drivers/net/cxgb4/sge.c | 14 +++++++-------
drivers/net/cxgb4vf/sge.c | 18 +++++++++---------
drivers/net/mlx4/en_rx.c | 2 +-
drivers/scsi/cxgbi/libcxgbi.c | 2 +-
include/linux/skbuff.h | 31 ++++++++++++++++++++++++++-----
net/core/skbuff.c | 17 +++++++++++++++++
6 files changed, 61 insertions(+), 23 deletions(-)
diff --git a/drivers/net/cxgb4/sge.c b/drivers/net/cxgb4/sge.c
index f1813b5..3e7c4b3 100644
--- a/drivers/net/cxgb4/sge.c
+++ b/drivers/net/cxgb4/sge.c
@@ -1416,7 +1416,7 @@ static inline void copy_frags(struct sk_buff *skb,
unsigned int n;
/* usually there's just one frag */
- skb_frag_set_page(skb, 0, gl->frags[0].page);
+ skb_frag_set_page(skb, 0, gl->frags[0].page.p); /* XXX */
ssi->frags[0].page_offset = gl->frags[0].page_offset + offset;
ssi->frags[0].size = gl->frags[0].size - offset;
ssi->nr_frags = gl->nfrags;
@@ -1425,7 +1425,7 @@ static inline void copy_frags(struct sk_buff *skb,
memcpy(&ssi->frags[1], &gl->frags[1], n * sizeof(skb_frag_t));
/* get a reference to the last page, we don't own it */
- get_page(gl->frags[n].page);
+ get_page(gl->frags[n].page.p); /* XXX */
}
/**
@@ -1482,7 +1482,7 @@ static void t4_pktgl_free(const struct pkt_gl *gl)
const skb_frag_t *p;
for (p = gl->frags, n = gl->nfrags - 1; n--; p++)
- put_page(p->page);
+ put_page(p->page.p); /* XXX */
}
/*
@@ -1635,7 +1635,7 @@ static void restore_rx_bufs(const struct pkt_gl *si, struct sge_fl *q,
else
q->cidx--;
d = &q->sdesc[q->cidx];
- d->page = si->frags[frags].page;
+ d->page = si->frags[frags].page.p; /* XXX */
d->dma_addr |= RX_UNMAPPED_BUF;
q->avail++;
}
@@ -1717,7 +1717,7 @@ static int process_responses(struct sge_rspq *q, int budget)
for (frags = 0, fp = si.frags; ; frags++, fp++) {
rsd = &rxq->fl.sdesc[rxq->fl.cidx];
bufsz = get_buf_size(rsd);
- fp->page = rsd->page;
+ fp->page.p = rsd->page; /* XXX */
fp->page_offset = q->offset;
fp->size = min(bufsz, len);
len -= fp->size;
@@ -1734,8 +1734,8 @@ static int process_responses(struct sge_rspq *q, int budget)
get_buf_addr(rsd),
fp->size, DMA_FROM_DEVICE);
- si.va = page_address(si.frags[0].page) +
- si.frags[0].page_offset;
+ si.va = page_address(si.frags[0].page.p) +
+ si.frags[0].page_offset; /* XXX */
prefetch(si.va);
diff --git a/drivers/net/cxgb4vf/sge.c b/drivers/net/cxgb4vf/sge.c
index f4c4480..0a0dda1 100644
--- a/drivers/net/cxgb4vf/sge.c
+++ b/drivers/net/cxgb4vf/sge.c
@@ -1397,7 +1397,7 @@ struct sk_buff *t4vf_pktgl_to_skb(const struct pkt_gl *gl,
skb_copy_to_linear_data(skb, gl->va, pull_len);
ssi = skb_shinfo(skb);
- skb_frag_set_page(skb, 0, gl->frags[0].page);
+ skb_frag_set_page(skb, 0, gl->frags[0].page.p); /* XXX */
ssi->frags[0].page_offset = gl->frags[0].page_offset + pull_len;
ssi->frags[0].size = gl->frags[0].size - pull_len;
if (gl->nfrags > 1)
@@ -1410,7 +1410,7 @@ struct sk_buff *t4vf_pktgl_to_skb(const struct pkt_gl *gl,
skb->truesize += skb->data_len;
/* Get a reference for the last page, we don't own it */
- get_page(gl->frags[gl->nfrags - 1].page);
+ get_page(gl->frags[gl->nfrags - 1].page.p); /* XXX */
}
out:
@@ -1430,7 +1430,7 @@ void t4vf_pktgl_free(const struct pkt_gl *gl)
frag = gl->nfrags - 1;
while (frag--)
- put_page(gl->frags[frag].page);
+ put_page(gl->frags[frag].page.p); /* XXX */
}
/**
@@ -1450,7 +1450,7 @@ static inline void copy_frags(struct sk_buff *skb,
unsigned int n;
/* usually there's just one frag */
- skb_frag_set_page(skb, 0, gl->frags[0].page);
+ skb_frag_set_page(skb, 0, gl->frags[0].page.p); /* XXX */
si->frags[0].page_offset = gl->frags[0].page_offset + offset;
si->frags[0].size = gl->frags[0].size - offset;
si->nr_frags = gl->nfrags;
@@ -1460,7 +1460,7 @@ static inline void copy_frags(struct sk_buff *skb,
memcpy(&si->frags[1], &gl->frags[1], n * sizeof(skb_frag_t));
/* get a reference to the last page, we don't own it */
- get_page(gl->frags[n].page);
+ get_page(gl->frags[n].page.p); /* XXX */
}
/**
@@ -1633,7 +1633,7 @@ static void restore_rx_bufs(const struct pkt_gl *gl, struct sge_fl *fl,
else
fl->cidx--;
sdesc = &fl->sdesc[fl->cidx];
- sdesc->page = gl->frags[frags].page;
+ sdesc->page = gl->frags[frags].page.p; /* XXX */
sdesc->dma_addr |= RX_UNMAPPED_BUF;
fl->avail++;
}
@@ -1721,7 +1721,7 @@ int process_responses(struct sge_rspq *rspq, int budget)
BUG_ON(rxq->fl.avail == 0);
sdesc = &rxq->fl.sdesc[rxq->fl.cidx];
bufsz = get_buf_size(sdesc);
- fp->page = sdesc->page;
+ fp->page.p = sdesc->page; /* XXX */
fp->page_offset = rspq->offset;
fp->size = min(bufsz, len);
len -= fp->size;
@@ -1739,8 +1739,8 @@ int process_responses(struct sge_rspq *rspq, int budget)
dma_sync_single_for_cpu(rspq->adapter->pdev_dev,
get_buf_addr(sdesc),
fp->size, DMA_FROM_DEVICE);
- gl.va = (page_address(gl.frags[0].page) +
- gl.frags[0].page_offset);
+ gl.va = (page_address(gl.frags[0].page.p) +
+ gl.frags[0].page_offset); /* XXX */
prefetch(gl.va);
/*
diff --git a/drivers/net/mlx4/en_rx.c b/drivers/net/mlx4/en_rx.c
index 21a89e0..c5d01ce 100644
--- a/drivers/net/mlx4/en_rx.c
+++ b/drivers/net/mlx4/en_rx.c
@@ -418,7 +418,7 @@ static int mlx4_en_complete_rx_desc(struct mlx4_en_priv *priv,
break;
/* Save page reference in skb */
- __skb_frag_set_page(&skb_frags_rx[nr], skb_frags[nr].page);
+ __skb_frag_set_page(&skb_frags_rx[nr], skb_frags[nr].page.p); /* XXX */
skb_frags_rx[nr].size = skb_frags[nr].size;
skb_frags_rx[nr].page_offset = skb_frags[nr].page_offset;
dma = be64_to_cpu(rx_desc->data[nr].addr);
diff --git a/drivers/scsi/cxgbi/libcxgbi.c b/drivers/scsi/cxgbi/libcxgbi.c
index 949ee48..8d16a74 100644
--- a/drivers/scsi/cxgbi/libcxgbi.c
+++ b/drivers/scsi/cxgbi/libcxgbi.c
@@ -1823,7 +1823,7 @@ static int sgl_read_to_frags(struct scatterlist *sg, unsigned int sgoffset,
return -EINVAL;
}
- frags[i].page = page;
+ frags[i].page.p = page;
frags[i].page_offset = sg->offset + sgoffset;
frags[i].size = copy;
i++;
diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h
index bc6bd24..9818fe2 100644
--- a/include/linux/skbuff.h
+++ b/include/linux/skbuff.h
@@ -135,8 +135,17 @@ struct sk_buff;
typedef struct skb_frag_struct skb_frag_t;
+struct skb_frag_destructor {
+ atomic_t ref;
+ int (*destroy)(void *data);
+ void *data;
+};
+
struct skb_frag_struct {
- struct page *page;
+ struct {
+ struct page *p;
+ struct skb_frag_destructor *destructor;
+ } page;
#if (BITS_PER_LONG > 32) || (PAGE_SIZE >= 65536)
__u32 page_offset;
__u32 size;
@@ -1129,7 +1138,8 @@ static inline void __skb_fill_page_desc(struct sk_buff *skb, int i,
{
skb_frag_t *frag = &skb_shinfo(skb)->frags[i];
- frag->page = page;
+ frag->page.p = page;
+ frag->page.destructor = NULL;
frag->page_offset = off;
frag->size = size;
}
@@ -1648,7 +1658,7 @@ static inline void netdev_free_page(struct net_device *dev, struct page *page)
*/
static inline struct page *__skb_frag_page(const skb_frag_t *frag)
{
- return frag->page;
+ return frag->page.p;
}
/**
@@ -1659,9 +1669,12 @@ static inline struct page *__skb_frag_page(const skb_frag_t *frag)
*/
static inline const struct page *skb_frag_page(const skb_frag_t *frag)
{
- return frag->page;
+ return frag->page.p;
}
+extern void skb_frag_destructor_ref(struct skb_frag_destructor *destroy);
+extern void skb_frag_destructor_unref(struct skb_frag_destructor *destroy);
+
/**
* __skb_frag_ref - take an addition reference on a paged fragment.
* @frag: the paged fragment
@@ -1670,6 +1683,10 @@ static inline const struct page *skb_frag_page(const skb_frag_t *frag)
*/
static inline void __skb_frag_ref(skb_frag_t *frag)
{
+ if (unlikely(frag->page.destructor)) {
+ skb_frag_destructor_ref(frag->page.destructor);
+ return;
+ }
get_page(__skb_frag_page(frag));
}
@@ -1693,6 +1710,10 @@ static inline void skb_frag_ref(struct sk_buff *skb, int f)
*/
static inline void __skb_frag_unref(skb_frag_t *frag)
{
+ if (unlikely(frag->page.destructor)) {
+ skb_frag_destructor_unref(frag->page.destructor);
+ return;
+ }
put_page(__skb_frag_page(frag));
}
@@ -1745,7 +1766,7 @@ static inline void *skb_frag_address_safe(const skb_frag_t *frag)
*/
static inline void __skb_frag_set_page(skb_frag_t *frag, struct page *page)
{
- frag->page = page;
+ frag->page.p = page;
__skb_frag_ref(frag);
}
diff --git a/net/core/skbuff.c b/net/core/skbuff.c
index 2133600..bdc6f6e 100644
--- a/net/core/skbuff.c
+++ b/net/core/skbuff.c
@@ -292,6 +292,23 @@ struct sk_buff *dev_alloc_skb(unsigned int length)
}
EXPORT_SYMBOL(dev_alloc_skb);
+void skb_frag_destructor_ref(struct skb_frag_destructor *destroy)
+{
+ BUG_ON(destroy == NULL);
+ atomic_inc(&destroy->ref);
+}
+EXPORT_SYMBOL(skb_frag_destructor_ref);
+
+void skb_frag_destructor_unref(struct skb_frag_destructor *destroy)
+{
+ if (destroy == NULL)
+ return;
+
+ if (atomic_dec_and_test(&destroy->ref))
+ destroy->destroy(destroy->data);
+}
+EXPORT_SYMBOL(skb_frag_destructor_unref);
+
static void skb_drop_list(struct sk_buff **listp)
{
struct sk_buff *list = *listp;
--
1.7.2.5
^ permalink raw reply related
* [PATCH 08/13] net: convert drivers to paged frag API.
From: Ian Campbell @ 2011-07-22 13:17 UTC (permalink / raw)
To: netdev, linux-nfs; +Cc: Ian Campbell
In-Reply-To: <1311340095.12772.57.camel@zakaz.uk.xensource.com>
Coccinelle was quite useful in the initial stages of this conversion but a) my
spatch was ugly as sin and b) I've done several rounds of updates since then so
they no longer actually represent the resultant changes anyway.
NB: should be split into individual patches to be acked by relevant driver
maintainers.
Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
[since v1:
Remove skb_frag_pci_map and switch everyone to skb_frag_dma_map (on
recommendation of Michał Mirosław, drivers should be switching to use the
DMA API directly instead of the PCI DMA API)
]
---
drivers/atm/eni.c | 4 +-
drivers/infiniband/hw/amso1100/c2.c | 8 ++----
drivers/infiniband/hw/nes/nes_nic.c | 20 +++++++++---------
drivers/infiniband/ulp/ipoib/ipoib_cm.c | 6 +++-
drivers/infiniband/ulp/ipoib/ipoib_ib.c | 6 +++-
drivers/net/3c59x.c | 4 +-
drivers/net/8139cp.c | 3 +-
drivers/net/acenic.c | 6 ++--
drivers/net/atl1c/atl1c_main.c | 9 +++----
drivers/net/atl1e/atl1e_main.c | 11 ++++-----
drivers/net/atlx/atl1.c | 10 ++++----
drivers/net/benet/be_main.c | 10 ++++----
drivers/net/bna/bnad.c | 4 +-
drivers/net/bnx2.c | 8 +++---
drivers/net/bnx2x/bnx2x_cmn.c | 3 +-
drivers/net/cassini.c | 15 ++++++-------
drivers/net/chelsio/sge.c | 5 +--
drivers/net/cxgb3/sge.c | 6 ++--
drivers/net/cxgb4/sge.c | 14 +++++++-----
drivers/net/cxgb4vf/sge.c | 13 ++++++-----
drivers/net/e1000/e1000_main.c | 9 +++----
drivers/net/e1000e/netdev.c | 7 ++---
drivers/net/enic/enic_main.c | 14 ++++++------
drivers/net/forcedeth.c | 12 +++++++---
drivers/net/gianfar.c | 10 ++++----
drivers/net/greth.c | 9 ++-----
drivers/net/ibmveth.c | 5 +--
drivers/net/igb/igb_main.c | 5 +---
drivers/net/igbvf/netdev.c | 5 +---
drivers/net/ixgb/ixgb_main.c | 6 ++--
drivers/net/ixgbe/ixgbe_main.c | 9 +++----
drivers/net/ixgbevf/ixgbevf_main.c | 10 +++-----
drivers/net/jme.c | 5 ++-
drivers/net/ksz884x.c | 3 +-
drivers/net/mlx4/en_rx.c | 22 +++++++++-----------
drivers/net/mlx4/en_tx.c | 20 +++--------------
drivers/net/mv643xx_eth.c | 8 +++---
drivers/net/myri10ge/myri10ge.c | 12 +++++-----
drivers/net/netxen/netxen_nic_main.c | 4 +-
drivers/net/niu.c | 4 +-
drivers/net/ns83820.c | 5 +--
drivers/net/pasemi_mac.c | 5 +--
drivers/net/qla3xxx.c | 5 +--
drivers/net/qlcnic/qlcnic_main.c | 4 +-
drivers/net/qlge/qlge_main.c | 8 ++----
drivers/net/r8169.c | 2 +-
drivers/net/s2io.c | 8 +++---
drivers/net/sfc/rx.c | 2 +-
drivers/net/sfc/tx.c | 13 +++--------
drivers/net/skge.c | 4 +-
drivers/net/sky2.c | 13 +++++------
drivers/net/starfire.c | 2 +-
drivers/net/stmmac/stmmac_main.c | 5 +--
drivers/net/sungem.c | 6 +---
drivers/net/sunhme.c | 5 +--
drivers/net/tehuti.c | 6 ++--
drivers/net/tg3.c | 6 +---
drivers/net/tsi108_eth.c | 7 +++--
drivers/net/typhoon.c | 3 +-
drivers/net/via-velocity.c | 7 +++--
drivers/net/virtio_net.c | 2 +-
drivers/net/vmxnet3/vmxnet3_drv.c | 8 +++---
drivers/net/vxge/vxge-main.c | 6 ++--
drivers/net/xen-netback/netback.c | 34 +++++++++++++++++++++----------
drivers/net/xen-netfront.c | 28 +++++++++++++++----------
drivers/scsi/bnx2fc/bnx2fc_fcoe.c | 2 +-
drivers/scsi/cxgbi/libcxgbi.c | 6 ++--
drivers/scsi/fcoe/fcoe.c | 2 +-
drivers/scsi/fcoe/fcoe_transport.c | 5 ++-
drivers/staging/et131x/et1310_tx.c | 11 ++++-----
drivers/staging/hv/netvsc_drv.c | 2 +-
71 files changed, 271 insertions(+), 295 deletions(-)
diff --git a/drivers/atm/eni.c b/drivers/atm/eni.c
index 3230ea0..60bc9c5 100644
--- a/drivers/atm/eni.c
+++ b/drivers/atm/eni.c
@@ -1133,8 +1133,8 @@ DPRINTK("doing direct send\n"); /* @@@ well, this doesn't work anyway */
skb->data,
skb_headlen(skb));
else
- put_dma(tx->index,eni_dev->dma,&j,(unsigned long)
- skb_shinfo(skb)->frags[i].page + skb_shinfo(skb)->frags[i].page_offset,
+ put_dma(tx->index,eni_dev->dma,&j,
+ (unsigned long)skb_frag_address(&skb_shinfo(skb)->frags[i]),
skb_shinfo(skb)->frags[i].size);
}
if (skb->len & 3)
diff --git a/drivers/infiniband/hw/amso1100/c2.c b/drivers/infiniband/hw/amso1100/c2.c
index 0cfc455..f1fff58 100644
--- a/drivers/infiniband/hw/amso1100/c2.c
+++ b/drivers/infiniband/hw/amso1100/c2.c
@@ -801,11 +801,9 @@ static int c2_xmit_frame(struct sk_buff *skb, struct net_device *netdev)
for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) {
skb_frag_t *frag = &skb_shinfo(skb)->frags[i];
maplen = frag->size;
- mapaddr =
- pci_map_page(c2dev->pcidev, frag->page,
- frag->page_offset, maplen,
- PCI_DMA_TODEVICE);
-
+ mapaddr = skb_frag_dma_map(&c2dev->pcidev->dev, frag,
+ 0, maplen,
+ PCI_DMA_TODEVICE);
elem = elem->next;
elem->skb = NULL;
elem->mapaddr = mapaddr;
diff --git a/drivers/infiniband/hw/nes/nes_nic.c b/drivers/infiniband/hw/nes/nes_nic.c
index d3a1c41..b60f10f 100644
--- a/drivers/infiniband/hw/nes/nes_nic.c
+++ b/drivers/infiniband/hw/nes/nes_nic.c
@@ -441,11 +441,11 @@ static int nes_nic_send(struct sk_buff *skb, struct net_device *netdev)
nesnic->tx_skb[nesnic->sq_head] = skb;
for (skb_fragment_index = 0; skb_fragment_index < skb_shinfo(skb)->nr_frags;
skb_fragment_index++) {
- bus_address = pci_map_page( nesdev->pcidev,
- skb_shinfo(skb)->frags[skb_fragment_index].page,
- skb_shinfo(skb)->frags[skb_fragment_index].page_offset,
- skb_shinfo(skb)->frags[skb_fragment_index].size,
- PCI_DMA_TODEVICE);
+ bus_address = skb_frag_dma_map(&nesdev->pcidev->dev,
+ &skb_shinfo(skb)->frags[skb_fragment_index],
+ 0,
+ skb_shinfo(skb)->frags[skb_fragment_index].size,
+ PCI_DMA_TODEVICE);
wqe_fragment_length[wqe_fragment_index] =
cpu_to_le16(skb_shinfo(skb)->frags[skb_fragment_index].size);
set_wqe_64bit_value(nic_sqe->wqe_words, NES_NIC_SQ_WQE_FRAG0_LOW_IDX+(2*wqe_fragment_index),
@@ -561,11 +561,11 @@ tso_sq_no_longer_full:
/* Map all the buffers */
for (tso_frag_count=0; tso_frag_count < skb_shinfo(skb)->nr_frags;
tso_frag_count++) {
- tso_bus_address[tso_frag_count] = pci_map_page( nesdev->pcidev,
- skb_shinfo(skb)->frags[tso_frag_count].page,
- skb_shinfo(skb)->frags[tso_frag_count].page_offset,
- skb_shinfo(skb)->frags[tso_frag_count].size,
- PCI_DMA_TODEVICE);
+ tso_bus_address[tso_frag_count] = skb_frag_dma_map(&nesdev->pcidev->dev,
+ &skb_shinfo(skb)->frags[tso_frag_count],
+ 0,
+ skb_shinfo(skb)->frags[tso_frag_count].size,
+ PCI_DMA_TODEVICE);
}
tso_frag_index = 0;
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_cm.c b/drivers/infiniband/ulp/ipoib/ipoib_cm.c
index 39913a0..1f20e40 100644
--- a/drivers/infiniband/ulp/ipoib/ipoib_cm.c
+++ b/drivers/infiniband/ulp/ipoib/ipoib_cm.c
@@ -169,7 +169,8 @@ static struct sk_buff *ipoib_cm_alloc_rx_skb(struct net_device *dev,
goto partial_error;
skb_fill_page_desc(skb, i, page, 0, PAGE_SIZE);
- mapping[i + 1] = ib_dma_map_page(priv->ca, skb_shinfo(skb)->frags[i].page,
+ mapping[i + 1] = ib_dma_map_page(priv->ca,
+ __skb_frag_page(&skb_shinfo(skb)->frags[i]),
0, PAGE_SIZE, DMA_FROM_DEVICE);
if (unlikely(ib_dma_mapping_error(priv->ca, mapping[i + 1])))
goto partial_error;
@@ -537,7 +538,8 @@ static void skb_put_frags(struct sk_buff *skb, unsigned int hdr_space,
if (length == 0) {
/* don't need this page */
- skb_fill_page_desc(toskb, i, frag->page, 0, PAGE_SIZE);
+ skb_fill_page_desc(toskb, i, __skb_frag_page(frag),
+ 0, PAGE_SIZE);/* XXX */
--skb_shinfo(skb)->nr_frags;
} else {
size = min(length, (unsigned) PAGE_SIZE);
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_ib.c b/drivers/infiniband/ulp/ipoib/ipoib_ib.c
index 81ae61d..f6ef6c2 100644
--- a/drivers/infiniband/ulp/ipoib/ipoib_ib.c
+++ b/drivers/infiniband/ulp/ipoib/ipoib_ib.c
@@ -182,7 +182,8 @@ static struct sk_buff *ipoib_alloc_rx_skb(struct net_device *dev, int id)
goto partial_error;
skb_fill_page_desc(skb, 0, page, 0, PAGE_SIZE);
mapping[1] =
- ib_dma_map_page(priv->ca, skb_shinfo(skb)->frags[0].page,
+ ib_dma_map_page(priv->ca,
+ __skb_frag_page(&skb_shinfo(skb)->frags[0]),
0, PAGE_SIZE, DMA_FROM_DEVICE);
if (unlikely(ib_dma_mapping_error(priv->ca, mapping[1])))
goto partial_error;
@@ -323,7 +324,8 @@ static int ipoib_dma_map_tx(struct ib_device *ca,
for (i = 0; i < skb_shinfo(skb)->nr_frags; ++i) {
skb_frag_t *frag = &skb_shinfo(skb)->frags[i];
- mapping[i + off] = ib_dma_map_page(ca, frag->page,
+ mapping[i + off] = ib_dma_map_page(ca,
+ __skb_frag_page(frag),
frag->page_offset, frag->size,
DMA_TO_DEVICE);
if (unlikely(ib_dma_mapping_error(ca, mapping[i + off])))
diff --git a/drivers/net/3c59x.c b/drivers/net/3c59x.c
index 8cc2256..fcd3820 100644
--- a/drivers/net/3c59x.c
+++ b/drivers/net/3c59x.c
@@ -2180,8 +2180,8 @@ boomerang_start_xmit(struct sk_buff *skb, struct net_device *dev)
vp->tx_ring[entry].frag[i+1].addr =
cpu_to_le32(pci_map_single(VORTEX_PCI(vp),
- (void*)page_address(frag->page) + frag->page_offset,
- frag->size, PCI_DMA_TODEVICE));
+ (void*)skb_frag_address(frag),
+ frag->size, PCI_DMA_TODEVICE));
if (i == skb_shinfo(skb)->nr_frags-1)
vp->tx_ring[entry].frag[i+1].length = cpu_to_le32(frag->size|LAST_FRAG);
diff --git a/drivers/net/8139cp.c b/drivers/net/8139cp.c
index 10c4505..c418aa3 100644
--- a/drivers/net/8139cp.c
+++ b/drivers/net/8139cp.c
@@ -815,8 +815,7 @@ static netdev_tx_t cp_start_xmit (struct sk_buff *skb,
len = this_frag->size;
mapping = dma_map_single(&cp->pdev->dev,
- ((void *) page_address(this_frag->page) +
- this_frag->page_offset),
+ skb_frag_address(this_frag),
len, PCI_DMA_TODEVICE);
eor = (entry == (CP_TX_RING_SIZE - 1)) ? RingEnd : 0;
diff --git a/drivers/net/acenic.c b/drivers/net/acenic.c
index d7c1bfe4..cc73b49 100644
--- a/drivers/net/acenic.c
+++ b/drivers/net/acenic.c
@@ -2528,9 +2528,9 @@ restart:
info = ap->skb->tx_skbuff + idx;
desc = ap->tx_ring + idx;
- mapping = pci_map_page(ap->pdev, frag->page,
- frag->page_offset, frag->size,
- PCI_DMA_TODEVICE);
+ mapping = skb_frag_dma_map(&ap->pdev->dev, frag, 0,
+ frag->size,
+ PCI_DMA_TODEVICE);
flagsize = (frag->size << 16);
if (skb->ip_summed == CHECKSUM_PARTIAL)
diff --git a/drivers/net/atl1c/atl1c_main.c b/drivers/net/atl1c/atl1c_main.c
index 1269ba5..ce6dbc5 100644
--- a/drivers/net/atl1c/atl1c_main.c
+++ b/drivers/net/atl1c/atl1c_main.c
@@ -2161,11 +2161,10 @@ static void atl1c_tx_map(struct atl1c_adapter *adapter,
buffer_info = atl1c_get_tx_buffer(adapter, use_tpd);
buffer_info->length = frag->size;
- buffer_info->dma =
- pci_map_page(adapter->pdev, frag->page,
- frag->page_offset,
- buffer_info->length,
- PCI_DMA_TODEVICE);
+ buffer_info->dma = skb_frag_dma_map(&adapter->pdev->dev,
+ frag, 0,
+ buffer_info->length,
+ PCI_DMA_TODEVICE);
ATL1C_SET_BUFFER_STATE(buffer_info, ATL1C_BUFFER_BUSY);
ATL1C_SET_PCIMAP_TYPE(buffer_info, ATL1C_PCIMAP_PAGE,
ATL1C_PCIMAP_TODEVICE);
diff --git a/drivers/net/atl1e/atl1e_main.c b/drivers/net/atl1e/atl1e_main.c
index 86a9122..b292c2a 100644
--- a/drivers/net/atl1e/atl1e_main.c
+++ b/drivers/net/atl1e/atl1e_main.c
@@ -1745,12 +1745,11 @@ static void atl1e_tx_map(struct atl1e_adapter *adapter,
MAX_TX_BUF_LEN : buf_len;
buf_len -= tx_buffer->length;
- tx_buffer->dma =
- pci_map_page(adapter->pdev, frag->page,
- frag->page_offset +
- (i * MAX_TX_BUF_LEN),
- tx_buffer->length,
- PCI_DMA_TODEVICE);
+ tx_buffer->dma = skb_frag_dma_map(&adapter->pdev->dev,
+ frag,
+ (i * MAX_TX_BUF_LEN),
+ tx_buffer->length,
+ PCI_DMA_TODEVICE);
ATL1E_SET_PCIMAP_TYPE(tx_buffer, ATL1E_TX_PCIMAP_PAGE);
use_tpd->buffer_addr = cpu_to_le64(tx_buffer->dma);
use_tpd->word2 = (use_tpd->word2 & (~TPD_BUFLEN_MASK)) |
diff --git a/drivers/net/atlx/atl1.c b/drivers/net/atlx/atl1.c
index cd5789f..d76229c 100644
--- a/drivers/net/atlx/atl1.c
+++ b/drivers/net/atlx/atl1.c
@@ -2283,11 +2283,11 @@ static void atl1_tx_map(struct atl1_adapter *adapter, struct sk_buff *skb,
buffer_info->length = (buf_len > ATL1_MAX_TX_BUF_LEN) ?
ATL1_MAX_TX_BUF_LEN : buf_len;
buf_len -= buffer_info->length;
- buffer_info->dma = pci_map_page(adapter->pdev,
- frag->page,
- frag->page_offset + (i * ATL1_MAX_TX_BUF_LEN),
- buffer_info->length, PCI_DMA_TODEVICE);
-
+ buffer_info->dma = skb_frag_dma_map(&adapter->pdev->dev,
+ frag,
+ (i * ATL1_MAX_TX_BUF_LEN),
+ buffer_info->length,
+ PCI_DMA_TODEVICE);
if (++next_to_use == tpd_ring->count)
next_to_use = 0;
}
diff --git a/drivers/net/benet/be_main.c b/drivers/net/benet/be_main.c
index a485f7f..3e4f643 100644
--- a/drivers/net/benet/be_main.c
+++ b/drivers/net/benet/be_main.c
@@ -715,8 +715,8 @@ static int make_tx_wrbs(struct be_adapter *adapter,
for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) {
struct skb_frag_struct *frag =
&skb_shinfo(skb)->frags[i];
- busaddr = dma_map_page(dev, frag->page, frag->page_offset,
- frag->size, DMA_TO_DEVICE);
+ busaddr = skb_frag_dma_map(dev, frag, 0,
+ frag->size, DMA_TO_DEVICE);
if (dma_mapping_error(dev, busaddr))
goto dma_err;
wrb = queue_head_node(txq);
@@ -1122,7 +1122,7 @@ static void skb_fill_rx_data(struct be_adapter *adapter, struct be_rx_obj *rxo,
skb->tail += curr_frag_len;
} else {
skb_shinfo(skb)->nr_frags = 1;
- skb_shinfo(skb)->frags[0].page = page_info->page;
+ skb_frag_set_page(skb, 0, page_info->page);
skb_shinfo(skb)->frags[0].page_offset =
page_info->page_offset + hdr_len;
skb_shinfo(skb)->frags[0].size = curr_frag_len - hdr_len;
@@ -1147,7 +1147,7 @@ static void skb_fill_rx_data(struct be_adapter *adapter, struct be_rx_obj *rxo,
if (page_info->page_offset == 0) {
/* Fresh page */
j++;
- skb_shinfo(skb)->frags[j].page = page_info->page;
+ skb_frag_set_page(skb, j, page_info->page);
skb_shinfo(skb)->frags[j].page_offset =
page_info->page_offset;
skb_shinfo(skb)->frags[j].size = 0;
@@ -1236,7 +1236,7 @@ static void be_rx_compl_process_gro(struct be_adapter *adapter,
if (i == 0 || page_info->page_offset == 0) {
/* First frag or Fresh page */
j++;
- skb_shinfo(skb)->frags[j].page = page_info->page;
+ skb_frag_set_page(skb, j, page_info->page);
skb_shinfo(skb)->frags[j].page_offset =
page_info->page_offset;
skb_shinfo(skb)->frags[j].size = 0;
diff --git a/drivers/net/bna/bnad.c b/drivers/net/bna/bnad.c
index 44e219c..31b0f16 100644
--- a/drivers/net/bna/bnad.c
+++ b/drivers/net/bna/bnad.c
@@ -2635,8 +2635,8 @@ bnad_start_xmit(struct sk_buff *skb, struct net_device *netdev)
BUG_ON(!(size <= BFI_TX_MAX_DATA_PER_VECTOR));
txqent->vector[vect_id].length = htons(size);
- dma_addr = dma_map_page(&bnad->pcidev->dev, frag->page,
- frag->page_offset, size, DMA_TO_DEVICE);
+ dma_addr = skb_frag_dma_map(&bnad->pcidev->dev, frag,
+ 0, size, DMA_TO_DEVICE);
dma_unmap_addr_set(&unmap_q->unmap_array[unmap_prod], dma_addr,
dma_addr);
BNA_SET_DMA_ADDR(dma_addr, &txqent->vector[vect_id].host_addr);
diff --git a/drivers/net/bnx2.c b/drivers/net/bnx2.c
index 57d3293..ff90b13 100644
--- a/drivers/net/bnx2.c
+++ b/drivers/net/bnx2.c
@@ -2880,8 +2880,8 @@ bnx2_reuse_rx_skb_pages(struct bnx2 *bp, struct bnx2_rx_ring_info *rxr,
shinfo = skb_shinfo(skb);
shinfo->nr_frags--;
- page = shinfo->frags[shinfo->nr_frags].page;
- shinfo->frags[shinfo->nr_frags].page = NULL;
+ page = __skb_frag_page(&shinfo->frags[shinfo->nr_frags]);
+ __skb_frag_set_page(&shinfo->frags[shinfo->nr_frags], NULL);
cons_rx_pg->page = page;
dev_kfree_skb(skb);
@@ -6461,8 +6461,8 @@ bnx2_start_xmit(struct sk_buff *skb, struct net_device *dev)
txbd = &txr->tx_desc_ring[ring_prod];
len = frag->size;
- mapping = dma_map_page(&bp->pdev->dev, frag->page, frag->page_offset,
- len, PCI_DMA_TODEVICE);
+ mapping = skb_frag_dma_map(&bp->pdev->dev, frag, 0, len,
+ PCI_DMA_TODEVICE);
if (dma_mapping_error(&bp->pdev->dev, mapping))
goto dma_error;
dma_unmap_addr_set(&txr->tx_buf_ring[ring_prod], mapping,
diff --git a/drivers/net/bnx2x/bnx2x_cmn.c b/drivers/net/bnx2x/bnx2x_cmn.c
index 28904433..dee09d7 100644
--- a/drivers/net/bnx2x/bnx2x_cmn.c
+++ b/drivers/net/bnx2x/bnx2x_cmn.c
@@ -2406,8 +2406,7 @@ netdev_tx_t bnx2x_start_xmit(struct sk_buff *skb, struct net_device *dev)
if (total_pkt_bd == NULL)
total_pkt_bd = &fp->tx_desc_ring[bd_prod].reg_bd;
- mapping = dma_map_page(&bp->pdev->dev, frag->page,
- frag->page_offset,
+ mapping = skb_frag_dma_map(&bp->pdev->dev, frag, 0,
frag->size, DMA_TO_DEVICE);
tx_data_bd->addr_hi = cpu_to_le32(U64_HI(mapping));
diff --git a/drivers/net/cassini.c b/drivers/net/cassini.c
index 22ce03e..903d88d 100644
--- a/drivers/net/cassini.c
+++ b/drivers/net/cassini.c
@@ -2047,8 +2047,8 @@ static int cas_rx_process_pkt(struct cas *cp, struct cas_rx_comp *rxc,
skb->truesize += hlen - swivel;
skb->len += hlen - swivel;
- get_page(page->buffer);
- frag->page = page->buffer;
+ __skb_frag_set_page(frag, page->buffer);
+ __skb_frag_ref(frag);
frag->page_offset = off;
frag->size = hlen - swivel;
@@ -2071,8 +2071,8 @@ static int cas_rx_process_pkt(struct cas *cp, struct cas_rx_comp *rxc,
skb->len += hlen;
frag++;
- get_page(page->buffer);
- frag->page = page->buffer;
+ __skb_frag_set_page(frag, page->buffer);
+ __skb_frag_ref(frag);
frag->page_offset = 0;
frag->size = hlen;
RX_USED_ADD(page, hlen + cp->crc_size);
@@ -2829,9 +2829,8 @@ static inline int cas_xmit_tx_ringN(struct cas *cp, int ring,
skb_frag_t *fragp = &skb_shinfo(skb)->frags[frag];
len = fragp->size;
- mapping = pci_map_page(cp->pdev, fragp->page,
- fragp->page_offset, len,
- PCI_DMA_TODEVICE);
+ mapping = skb_frag_dma_map(&cp->pdev->dev, fragp, 0, len,
+ PCI_DMA_TODEVICE);
tabort = cas_calc_tabort(cp, fragp->page_offset, len);
if (unlikely(tabort)) {
@@ -2842,7 +2841,7 @@ static inline int cas_xmit_tx_ringN(struct cas *cp, int ring,
ctrl, 0);
entry = TX_DESC_NEXT(ring, entry);
- addr = cas_page_map(fragp->page);
+ addr = cas_page_map(__skb_frag_page(fragp));
memcpy(tx_tiny_buf(cp, ring, entry),
addr + fragp->page_offset + len - tabort,
tabort);
diff --git a/drivers/net/chelsio/sge.c b/drivers/net/chelsio/sge.c
index 58380d2..39c06d9 100644
--- a/drivers/net/chelsio/sge.c
+++ b/drivers/net/chelsio/sge.c
@@ -1276,9 +1276,8 @@ static inline void write_tx_descs(struct adapter *adapter, struct sk_buff *skb,
ce = q->centries;
}
- mapping = pci_map_page(adapter->pdev, frag->page,
- frag->page_offset, frag->size,
- PCI_DMA_TODEVICE);
+ mapping = skb_frag_dma_map(&adapter->pdev->dev, frag, 0,
+ frag->size, PCI_DMA_TODEVICE);
desc_mapping = mapping;
desc_len = frag->size;
diff --git a/drivers/net/cxgb3/sge.c b/drivers/net/cxgb3/sge.c
index 76bf589..3f73a5c 100644
--- a/drivers/net/cxgb3/sge.c
+++ b/drivers/net/cxgb3/sge.c
@@ -979,8 +979,8 @@ static inline unsigned int make_sgl(const struct sk_buff *skb,
for (i = 0; i < nfrags; i++) {
skb_frag_t *frag = &skb_shinfo(skb)->frags[i];
- mapping = pci_map_page(pdev, frag->page, frag->page_offset,
- frag->size, PCI_DMA_TODEVICE);
+ mapping = skb_frag_dma_map(&pdev->dev, frag, 0, frag->size,
+ PCI_DMA_TODEVICE);
sgp->len[j] = cpu_to_be32(frag->size);
sgp->addr[j] = cpu_to_be64(mapping);
j ^= 1;
@@ -2133,7 +2133,7 @@ static void lro_add_page(struct adapter *adap, struct sge_qset *qs,
len -= offset;
rx_frag += nr_frags;
- rx_frag->page = sd->pg_chunk.page;
+ __skb_frag_set_page(rx_frag, sd->pg_chunk.page);
rx_frag->page_offset = sd->pg_chunk.offset + offset;
rx_frag->size = len;
diff --git a/drivers/net/cxgb4/sge.c b/drivers/net/cxgb4/sge.c
index 56adf44..f1813b5 100644
--- a/drivers/net/cxgb4/sge.c
+++ b/drivers/net/cxgb4/sge.c
@@ -215,8 +215,8 @@ static int map_skb(struct device *dev, const struct sk_buff *skb,
end = &si->frags[si->nr_frags];
for (fp = si->frags; fp < end; fp++) {
- *++addr = dma_map_page(dev, fp->page, fp->page_offset, fp->size,
- DMA_TO_DEVICE);
+ *++addr = skb_frag_dma_map(dev, fp, 0, fp->size,
+ DMA_TO_DEVICE);
if (dma_mapping_error(dev, *addr))
goto unwind;
}
@@ -1409,13 +1409,14 @@ int cxgb4_ofld_send(struct net_device *dev, struct sk_buff *skb)
}
EXPORT_SYMBOL(cxgb4_ofld_send);
-static inline void copy_frags(struct skb_shared_info *ssi,
+static inline void copy_frags(struct sk_buff *skb,
const struct pkt_gl *gl, unsigned int offset)
{
+ struct skb_shared_info *ssi = skb_shinfo(skb);
unsigned int n;
/* usually there's just one frag */
- ssi->frags[0].page = gl->frags[0].page;
+ skb_frag_set_page(skb, 0, gl->frags[0].page);
ssi->frags[0].page_offset = gl->frags[0].page_offset + offset;
ssi->frags[0].size = gl->frags[0].size - offset;
ssi->nr_frags = gl->nfrags;
@@ -1459,7 +1460,7 @@ struct sk_buff *cxgb4_pktgl_to_skb(const struct pkt_gl *gl,
__skb_put(skb, pull_len);
skb_copy_to_linear_data(skb, gl->va, pull_len);
- copy_frags(skb_shinfo(skb), gl, pull_len);
+ copy_frags(skb, gl, pull_len);
skb->len = gl->tot_len;
skb->data_len = skb->len - pull_len;
skb->truesize += skb->data_len;
@@ -1522,7 +1523,7 @@ static void do_gro(struct sge_eth_rxq *rxq, const struct pkt_gl *gl,
return;
}
- copy_frags(skb_shinfo(skb), gl, RX_PKT_PAD);
+ copy_frags(skb, gl, RX_PKT_PAD);
skb->len = gl->tot_len - RX_PKT_PAD;
skb->data_len = skb->len;
skb->truesize += skb->data_len;
@@ -1735,6 +1736,7 @@ static int process_responses(struct sge_rspq *q, int budget)
si.va = page_address(si.frags[0].page) +
si.frags[0].page_offset;
+
prefetch(si.va);
si.nfrags = frags + 1;
diff --git a/drivers/net/cxgb4vf/sge.c b/drivers/net/cxgb4vf/sge.c
index 5fd75fd..f4c4480 100644
--- a/drivers/net/cxgb4vf/sge.c
+++ b/drivers/net/cxgb4vf/sge.c
@@ -296,8 +296,8 @@ static int map_skb(struct device *dev, const struct sk_buff *skb,
si = skb_shinfo(skb);
end = &si->frags[si->nr_frags];
for (fp = si->frags; fp < end; fp++) {
- *++addr = dma_map_page(dev, fp->page, fp->page_offset, fp->size,
- DMA_TO_DEVICE);
+ *++addr = skb_frag_dma_map(dev, fp, 0, fp->size,
+ DMA_TO_DEVICE);
if (dma_mapping_error(dev, *addr))
goto unwind;
}
@@ -1397,7 +1397,7 @@ struct sk_buff *t4vf_pktgl_to_skb(const struct pkt_gl *gl,
skb_copy_to_linear_data(skb, gl->va, pull_len);
ssi = skb_shinfo(skb);
- ssi->frags[0].page = gl->frags[0].page;
+ skb_frag_set_page(skb, 0, gl->frags[0].page);
ssi->frags[0].page_offset = gl->frags[0].page_offset + pull_len;
ssi->frags[0].size = gl->frags[0].size - pull_len;
if (gl->nfrags > 1)
@@ -1442,14 +1442,15 @@ void t4vf_pktgl_free(const struct pkt_gl *gl)
* Copy an internal packet gather list into a Linux skb_shared_info
* structure.
*/
-static inline void copy_frags(struct skb_shared_info *si,
+static inline void copy_frags(struct sk_buff *skb,
const struct pkt_gl *gl,
unsigned int offset)
{
+ struct skb_shared_info *si = skb_shinfo(skb);
unsigned int n;
/* usually there's just one frag */
- si->frags[0].page = gl->frags[0].page;
+ skb_frag_set_page(skb, 0, gl->frags[0].page);
si->frags[0].page_offset = gl->frags[0].page_offset + offset;
si->frags[0].size = gl->frags[0].size - offset;
si->nr_frags = gl->nfrags;
@@ -1484,7 +1485,7 @@ static void do_gro(struct sge_eth_rxq *rxq, const struct pkt_gl *gl,
return;
}
- copy_frags(skb_shinfo(skb), gl, PKTSHIFT);
+ copy_frags(skb, gl, PKTSHIFT);
skb->len = gl->tot_len - PKTSHIFT;
skb->data_len = skb->len;
skb->truesize += skb->data_len;
diff --git a/drivers/net/e1000/e1000_main.c b/drivers/net/e1000/e1000_main.c
index 76e8af0..e902cd0 100644
--- a/drivers/net/e1000/e1000_main.c
+++ b/drivers/net/e1000/e1000_main.c
@@ -2861,7 +2861,7 @@ static int e1000_tx_map(struct e1000_adapter *adapter,
frag = &skb_shinfo(skb)->frags[f];
len = frag->size;
- offset = frag->page_offset;
+ offset = 0;
while (len) {
i++;
@@ -2878,7 +2878,7 @@ static int e1000_tx_map(struct e1000_adapter *adapter,
* Avoid terminating buffers within evenly-aligned
* dwords. */
if (unlikely(adapter->pcix_82544 &&
- !((unsigned long)(page_to_phys(frag->page) + offset
+ !((unsigned long)(page_to_phys(__skb_frag_page(frag)) + offset
+ size - 1) & 4) &&
size > 4))
size -= 4;
@@ -2886,9 +2886,8 @@ static int e1000_tx_map(struct e1000_adapter *adapter,
buffer_info->length = size;
buffer_info->time_stamp = jiffies;
buffer_info->mapped_as_page = true;
- buffer_info->dma = dma_map_page(&pdev->dev, frag->page,
- offset, size,
- DMA_TO_DEVICE);
+ buffer_info->dma = skb_frag_dma_map(&pdev->dev, frag,
+ offset, size, DMA_TO_DEVICE);
if (dma_mapping_error(&pdev->dev, buffer_info->dma))
goto dma_error;
buffer_info->next_to_watch = i;
diff --git a/drivers/net/e1000e/netdev.c b/drivers/net/e1000e/netdev.c
index 3310c3d..30f8a5c 100644
--- a/drivers/net/e1000e/netdev.c
+++ b/drivers/net/e1000e/netdev.c
@@ -4599,7 +4599,7 @@ static int e1000_tx_map(struct e1000_adapter *adapter,
frag = &skb_shinfo(skb)->frags[f];
len = frag->size;
- offset = frag->page_offset;
+ offset = 0;
while (len) {
i++;
@@ -4612,9 +4612,8 @@ static int e1000_tx_map(struct e1000_adapter *adapter,
buffer_info->length = size;
buffer_info->time_stamp = jiffies;
buffer_info->next_to_watch = i;
- buffer_info->dma = dma_map_page(&pdev->dev, frag->page,
- offset, size,
- DMA_TO_DEVICE);
+ buffer_info->dma = skb_frag_dma_map(&pdev->dev, frag,
+ offset, size, DMA_TO_DEVICE);
buffer_info->mapped_as_page = true;
if (dma_mapping_error(&pdev->dev, buffer_info->dma))
goto dma_error;
diff --git a/drivers/net/enic/enic_main.c b/drivers/net/enic/enic_main.c
index 2f433fb..31bf8cb 100644
--- a/drivers/net/enic/enic_main.c
+++ b/drivers/net/enic/enic_main.c
@@ -584,9 +584,9 @@ static inline void enic_queue_wq_skb_cont(struct enic *enic,
for (frag = skb_shinfo(skb)->frags; len_left; frag++) {
len_left -= frag->size;
enic_queue_wq_desc_cont(wq, skb,
- pci_map_page(enic->pdev, frag->page,
- frag->page_offset, frag->size,
- PCI_DMA_TODEVICE),
+ skb_frag_dma_map(&enic->pdev->dev,
+ frag, 0, frag->size,
+ PCI_DMA_TODEVICE),
frag->size,
(len_left == 0), /* EOP? */
loopback);
@@ -698,14 +698,14 @@ static inline void enic_queue_wq_skb_tso(struct enic *enic,
for (frag = skb_shinfo(skb)->frags; len_left; frag++) {
len_left -= frag->size;
frag_len_left = frag->size;
- offset = frag->page_offset;
+ offset = 0;
while (frag_len_left) {
len = min(frag_len_left,
(unsigned int)WQ_ENET_MAX_DESC_LEN);
- dma_addr = pci_map_page(enic->pdev, frag->page,
- offset, len,
- PCI_DMA_TODEVICE);
+ dma_addr = skb_frag_dma_map(&enic->pdev->dev, frag,
+ offset, len,
+ PCI_DMA_TODEVICE);
enic_queue_wq_desc_cont(wq, skb,
dma_addr,
len,
diff --git a/drivers/net/forcedeth.c b/drivers/net/forcedeth.c
index 537b695..df0cb1c 100644
--- a/drivers/net/forcedeth.c
+++ b/drivers/net/forcedeth.c
@@ -2149,8 +2149,10 @@ static netdev_tx_t nv_start_xmit(struct sk_buff *skb, struct net_device *dev)
prev_tx = put_tx;
prev_tx_ctx = np->put_tx_ctx;
bcnt = (size > NV_TX2_TSO_MAX_SIZE) ? NV_TX2_TSO_MAX_SIZE : size;
- np->put_tx_ctx->dma = pci_map_page(np->pci_dev, frag->page, frag->page_offset+offset, bcnt,
- PCI_DMA_TODEVICE);
+ np->put_tx_ctx->dma = skb_frag_dma_map(&np->pci_dev->dev,
+ frag, offset,
+ bcnt,
+ PCI_DMA_TODEVICE);
np->put_tx_ctx->dma_len = bcnt;
np->put_tx_ctx->dma_single = 0;
put_tx->buf = cpu_to_le32(np->put_tx_ctx->dma);
@@ -2260,8 +2262,10 @@ static netdev_tx_t nv_start_xmit_optimized(struct sk_buff *skb,
prev_tx = put_tx;
prev_tx_ctx = np->put_tx_ctx;
bcnt = (size > NV_TX2_TSO_MAX_SIZE) ? NV_TX2_TSO_MAX_SIZE : size;
- np->put_tx_ctx->dma = pci_map_page(np->pci_dev, frag->page, frag->page_offset+offset, bcnt,
- PCI_DMA_TODEVICE);
+ np->put_tx_ctx->dma = skb_frag_dma_map(&np->pci_dev->dev,
+ frag, offset,
+ bcnt,
+ PCI_DMA_TODEVICE);
np->put_tx_ctx->dma_len = bcnt;
np->put_tx_ctx->dma_single = 0;
put_tx->bufhigh = cpu_to_le32(dma_high(np->put_tx_ctx->dma));
diff --git a/drivers/net/gianfar.c b/drivers/net/gianfar.c
index 2dfcc80..766e037 100644
--- a/drivers/net/gianfar.c
+++ b/drivers/net/gianfar.c
@@ -2141,11 +2141,11 @@ static int gfar_start_xmit(struct sk_buff *skb, struct net_device *dev)
if (i == nr_frags - 1)
lstatus |= BD_LFLAG(TXBD_LAST | TXBD_INTERRUPT);
- bufaddr = dma_map_page(&priv->ofdev->dev,
- skb_shinfo(skb)->frags[i].page,
- skb_shinfo(skb)->frags[i].page_offset,
- length,
- DMA_TO_DEVICE);
+ bufaddr = skb_frag_dma_map(&priv->ofdev->dev,
+ &skb_shinfo(skb)->frags[i],
+ 0,
+ length,
+ DMA_TO_DEVICE);
/* set the TxBD length and buffer pointer */
txbdp->bufPtr = bufaddr;
diff --git a/drivers/net/greth.c b/drivers/net/greth.c
index 672f096..26acb8d 100644
--- a/drivers/net/greth.c
+++ b/drivers/net/greth.c
@@ -111,7 +111,7 @@ static void greth_print_tx_packet(struct sk_buff *skb)
for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) {
print_hex_dump(KERN_DEBUG, "TX: ", DUMP_PREFIX_OFFSET, 16, 1,
- phys_to_virt(page_to_phys(skb_shinfo(skb)->frags[i].page)) +
+ phys_to_virt(page_to_phys(skb_frag_page(&skb_shinfo(skb)->frags[i]))) +
skb_shinfo(skb)->frags[i].page_offset,
length, true);
}
@@ -526,11 +526,8 @@ greth_start_xmit_gbit(struct sk_buff *skb, struct net_device *dev)
greth_write_bd(&bdp->stat, status);
- dma_addr = dma_map_page(greth->dev,
- frag->page,
- frag->page_offset,
- frag->size,
- DMA_TO_DEVICE);
+ dma_addr = skb_frag_dma_map(greth->dev, frag, 0, frag->size,
+ DMA_TO_DEVICE);
if (unlikely(dma_mapping_error(greth->dev, dma_addr)))
goto frag_map_error;
diff --git a/drivers/net/ibmveth.c b/drivers/net/ibmveth.c
index b388d78..65e5874 100644
--- a/drivers/net/ibmveth.c
+++ b/drivers/net/ibmveth.c
@@ -1001,9 +1001,8 @@ retry_bounce:
unsigned long dma_addr;
skb_frag_t *frag = &skb_shinfo(skb)->frags[i];
- dma_addr = dma_map_page(&adapter->vdev->dev, frag->page,
- frag->page_offset, frag->size,
- DMA_TO_DEVICE);
+ dma_addr = skb_frag_dma_map(&adapter->vdev->dev, frag, 0,
+ frag->size, DMA_TO_DEVICE);
if (dma_mapping_error(&adapter->vdev->dev, dma_addr))
goto map_failed_frags;
diff --git a/drivers/net/igb/igb_main.c b/drivers/net/igb/igb_main.c
index 2c28621..17f94f4 100644
--- a/drivers/net/igb/igb_main.c
+++ b/drivers/net/igb/igb_main.c
@@ -4132,10 +4132,7 @@ static inline int igb_tx_map_adv(struct igb_ring *tx_ring, struct sk_buff *skb,
buffer_info->time_stamp = jiffies;
buffer_info->next_to_watch = i;
buffer_info->mapped_as_page = true;
- buffer_info->dma = dma_map_page(dev,
- frag->page,
- frag->page_offset,
- len,
+ buffer_info->dma = skb_frag_dma_map(dev, frag, 0, len,
DMA_TO_DEVICE);
if (dma_mapping_error(dev, buffer_info->dma))
goto dma_error;
diff --git a/drivers/net/igbvf/netdev.c b/drivers/net/igbvf/netdev.c
index 1c77fb3..3f6655f 100644
--- a/drivers/net/igbvf/netdev.c
+++ b/drivers/net/igbvf/netdev.c
@@ -2074,10 +2074,7 @@ static inline int igbvf_tx_map_adv(struct igbvf_adapter *adapter,
buffer_info->time_stamp = jiffies;
buffer_info->next_to_watch = i;
buffer_info->mapped_as_page = true;
- buffer_info->dma = dma_map_page(&pdev->dev,
- frag->page,
- frag->page_offset,
- len,
+ buffer_info->dma = skb_frag_dma_map(&pdev->dev, frag, 0, len,
DMA_TO_DEVICE);
if (dma_mapping_error(&pdev->dev, buffer_info->dma))
goto dma_error;
diff --git a/drivers/net/ixgb/ixgb_main.c b/drivers/net/ixgb/ixgb_main.c
index 6a130eb..45c4e90 100644
--- a/drivers/net/ixgb/ixgb_main.c
+++ b/drivers/net/ixgb/ixgb_main.c
@@ -1341,7 +1341,7 @@ ixgb_tx_map(struct ixgb_adapter *adapter, struct sk_buff *skb,
frag = &skb_shinfo(skb)->frags[f];
len = frag->size;
- offset = frag->page_offset;
+ offset = 0;
while (len) {
i++;
@@ -1361,8 +1361,8 @@ ixgb_tx_map(struct ixgb_adapter *adapter, struct sk_buff *skb,
buffer_info->time_stamp = jiffies;
buffer_info->mapped_as_page = true;
buffer_info->dma =
- dma_map_page(&pdev->dev, frag->page,
- offset, size, DMA_TO_DEVICE);
+ skb_frag_dma_map(&pdev->dev, frag, offset, size,
+ DMA_TO_DEVICE);
if (dma_mapping_error(&pdev->dev, buffer_info->dma))
goto dma_error;
buffer_info->next_to_watch = 0;
diff --git a/drivers/net/ixgbe/ixgbe_main.c b/drivers/net/ixgbe/ixgbe_main.c
index 08e8e25..307cf06 100644
--- a/drivers/net/ixgbe/ixgbe_main.c
+++ b/drivers/net/ixgbe/ixgbe_main.c
@@ -6632,7 +6632,7 @@ static int ixgbe_tx_map(struct ixgbe_adapter *adapter,
frag = &skb_shinfo(skb)->frags[f];
len = min((unsigned int)frag->size, total);
- offset = frag->page_offset;
+ offset = 0;
while (len) {
i++;
@@ -6643,10 +6643,9 @@ static int ixgbe_tx_map(struct ixgbe_adapter *adapter,
size = min(len, (uint)IXGBE_MAX_DATA_PER_TXD);
tx_buffer_info->length = size;
- tx_buffer_info->dma = dma_map_page(dev,
- frag->page,
- offset, size,
- DMA_TO_DEVICE);
+ tx_buffer_info->dma =
+ skb_frag_dma_map(dev, frag, offset, size,
+ DMA_TO_DEVICE);
tx_buffer_info->mapped_as_page = true;
if (dma_mapping_error(dev, tx_buffer_info->dma))
goto dma_error;
diff --git a/drivers/net/ixgbevf/ixgbevf_main.c b/drivers/net/ixgbevf/ixgbevf_main.c
index 28d3cb2..ad05ad9 100644
--- a/drivers/net/ixgbevf/ixgbevf_main.c
+++ b/drivers/net/ixgbevf/ixgbevf_main.c
@@ -2951,18 +2951,16 @@ static int ixgbevf_tx_map(struct ixgbevf_adapter *adapter,
frag = &skb_shinfo(skb)->frags[f];
len = min((unsigned int)frag->size, total);
- offset = frag->page_offset;
+ offset = 0;
while (len) {
tx_buffer_info = &tx_ring->tx_buffer_info[i];
size = min(len, (unsigned int)IXGBE_MAX_DATA_PER_TXD);
tx_buffer_info->length = size;
- tx_buffer_info->dma = dma_map_page(&adapter->pdev->dev,
- frag->page,
- offset,
- size,
- DMA_TO_DEVICE);
+ tx_buffer_info->dma =
+ skb_frag_dma_map(&adapter->pdev->dev, frag,
+ offset, size, DMA_TO_DEVICE);
tx_buffer_info->mapped_as_page = true;
if (dma_mapping_error(&pdev->dev, tx_buffer_info->dma))
goto dma_error;
diff --git a/drivers/net/jme.c b/drivers/net/jme.c
index b5b174a..a73e895 100644
--- a/drivers/net/jme.c
+++ b/drivers/net/jme.c
@@ -1928,8 +1928,9 @@ jme_map_tx_skb(struct jme_adapter *jme, struct sk_buff *skb, int idx)
ctxdesc = txdesc + ((idx + i + 2) & (mask));
ctxbi = txbi + ((idx + i + 2) & (mask));
- jme_fill_tx_map(jme->pdev, ctxdesc, ctxbi, frag->page,
- frag->page_offset, frag->size, hidma);
+ jme_fill_tx_map(jme->pdev, ctxdesc, ctxbi,
+ __skb_frag_page(frag),
+ frag->page_offset, frag->size, hidma);
}
len = skb_is_nonlinear(skb) ? skb_headlen(skb) : skb->len;
diff --git a/drivers/net/ksz884x.c b/drivers/net/ksz884x.c
index 41ea592..e610d88 100644
--- a/drivers/net/ksz884x.c
+++ b/drivers/net/ksz884x.c
@@ -4703,8 +4703,7 @@ static void send_packet(struct sk_buff *skb, struct net_device *dev)
dma_buf->dma = pci_map_single(
hw_priv->pdev,
- page_address(this_frag->page) +
- this_frag->page_offset,
+ skb_frag_address(this_frag),
dma_buf->len,
PCI_DMA_TODEVICE);
set_tx_buf(desc, dma_buf->dma);
diff --git a/drivers/net/mlx4/en_rx.c b/drivers/net/mlx4/en_rx.c
index 277215f..21a89e0 100644
--- a/drivers/net/mlx4/en_rx.c
+++ b/drivers/net/mlx4/en_rx.c
@@ -60,20 +60,18 @@ static int mlx4_en_alloc_frag(struct mlx4_en_priv *priv,
if (!page)
return -ENOMEM;
- skb_frags[i].page = page_alloc->page;
+ __skb_frag_set_page(&skb_frags[i], page_alloc->page);
skb_frags[i].page_offset = page_alloc->offset;
page_alloc->page = page;
page_alloc->offset = frag_info->frag_align;
} else {
- page = page_alloc->page;
- get_page(page);
-
- skb_frags[i].page = page;
+ __skb_frag_set_page(&skb_frags[i], page_alloc->page);
+ __skb_frag_ref(&skb_frags[i]);
skb_frags[i].page_offset = page_alloc->offset;
page_alloc->offset += frag_info->frag_stride;
}
- dma = pci_map_single(mdev->pdev, page_address(skb_frags[i].page) +
- skb_frags[i].page_offset, frag_info->frag_size,
+ dma = pci_map_single(mdev->pdev, skb_frag_address(&skb_frags[i]),
+ frag_info->frag_size,
PCI_DMA_FROMDEVICE);
rx_desc->data[i].addr = cpu_to_be64(dma);
return 0;
@@ -169,7 +167,7 @@ static int mlx4_en_prepare_rx_desc(struct mlx4_en_priv *priv,
err:
while (i--)
- put_page(skb_frags[i].page);
+ __skb_frag_unref(&skb_frags[i]);
return -ENOMEM;
}
@@ -196,7 +194,7 @@ static void mlx4_en_free_rx_desc(struct mlx4_en_priv *priv,
en_dbg(DRV, priv, "Unmapping buffer at dma:0x%llx\n", (u64) dma);
pci_unmap_single(mdev->pdev, dma, skb_frags[nr].size,
PCI_DMA_FROMDEVICE);
- put_page(skb_frags[nr].page);
+ __skb_frag_unref(&skb_frags[nr]);
}
}
@@ -420,7 +418,7 @@ static int mlx4_en_complete_rx_desc(struct mlx4_en_priv *priv,
break;
/* Save page reference in skb */
- skb_frags_rx[nr].page = skb_frags[nr].page;
+ __skb_frag_set_page(&skb_frags_rx[nr], skb_frags[nr].page);
skb_frags_rx[nr].size = skb_frags[nr].size;
skb_frags_rx[nr].page_offset = skb_frags[nr].page_offset;
dma = be64_to_cpu(rx_desc->data[nr].addr);
@@ -444,7 +442,7 @@ fail:
* the descriptor) of this packet; remaining fragments are reused... */
while (nr > 0) {
nr--;
- put_page(skb_frags_rx[nr].page);
+ __skb_frag_unref(&skb_frags_rx[nr]);
}
return 0;
}
@@ -474,7 +472,7 @@ static struct sk_buff *mlx4_en_rx_skb(struct mlx4_en_priv *priv,
/* Get pointer to first fragment so we could copy the headers into the
* (linear part of the) skb */
- va = page_address(skb_frags[0].page) + skb_frags[0].page_offset;
+ va = skb_frag_address(&skb_frags[0]);
if (length <= SMALL_PACKET_SIZE) {
/* We are copying all relevant data to the skb - temporarily
diff --git a/drivers/net/mlx4/en_tx.c b/drivers/net/mlx4/en_tx.c
index b229acf..29816d6 100644
--- a/drivers/net/mlx4/en_tx.c
+++ b/drivers/net/mlx4/en_tx.c
@@ -461,26 +461,13 @@ static inline void mlx4_en_xmit_poll(struct mlx4_en_priv *priv, int tx_ind)
}
}
-static void *get_frag_ptr(struct sk_buff *skb)
-{
- struct skb_frag_struct *frag = &skb_shinfo(skb)->frags[0];
- struct page *page = frag->page;
- void *ptr;
-
- ptr = page_address(page);
- if (unlikely(!ptr))
- return NULL;
-
- return ptr + frag->page_offset;
-}
-
static int is_inline(struct sk_buff *skb, void **pfrag)
{
void *ptr;
if (inline_thold && !skb_is_gso(skb) && skb->len <= inline_thold) {
if (skb_shinfo(skb)->nr_frags == 1) {
- ptr = get_frag_ptr(skb);
+ ptr = skb_frag_address_safe(&skb_shinfo(skb)->frags[0]);
if (unlikely(!ptr))
return 0;
@@ -757,8 +744,9 @@ netdev_tx_t mlx4_en_xmit(struct sk_buff *skb, struct net_device *dev)
/* Map fragments */
for (i = skb_shinfo(skb)->nr_frags - 1; i >= 0; i--) {
frag = &skb_shinfo(skb)->frags[i];
- dma = pci_map_page(mdev->dev->pdev, frag->page, frag->page_offset,
- frag->size, PCI_DMA_TODEVICE);
+ dma = skb_frag_dma_map(&mdev->dev->pdev->dev, frag,
+ 0, frag->size,
+ PCI_DMA_TODEVICE);
data->addr = cpu_to_be64(dma);
data->lkey = cpu_to_be32(mdev->mr.key);
wmb();
diff --git a/drivers/net/mv643xx_eth.c b/drivers/net/mv643xx_eth.c
index a5d9b1c..d02a034 100644
--- a/drivers/net/mv643xx_eth.c
+++ b/drivers/net/mv643xx_eth.c
@@ -752,10 +752,10 @@ static void txq_submit_frag_skb(struct tx_queue *txq, struct sk_buff *skb)
desc->l4i_chk = 0;
desc->byte_cnt = this_frag->size;
- desc->buf_ptr = dma_map_page(mp->dev->dev.parent,
- this_frag->page,
- this_frag->page_offset,
- this_frag->size, DMA_TO_DEVICE);
+ desc->buf_ptr = skb_frag_dma_map(mp->dev->dev.parent,
+ this_frag, 0,
+ this_frag->size,
+ DMA_TO_DEVICE);
}
}
diff --git a/drivers/net/myri10ge/myri10ge.c b/drivers/net/myri10ge/myri10ge.c
index bf84849..35b64f4 100644
--- a/drivers/net/myri10ge/myri10ge.c
+++ b/drivers/net/myri10ge/myri10ge.c
@@ -1339,7 +1339,7 @@ myri10ge_rx_done(struct myri10ge_slice_state *ss, int len, __wsum csum,
/* Fill skb_frag_struct(s) with data from our receive */
for (i = 0, remainder = len; remainder > 0; i++) {
myri10ge_unmap_rx_page(pdev, &rx->info[idx], bytes);
- rx_frags[i].page = rx->info[idx].page;
+ __skb_frag_set_page(&rx_frags[i], rx->info[idx].page); /* XXX */
rx_frags[i].page_offset = rx->info[idx].page_offset;
if (remainder < MYRI10GE_ALLOC_SIZE)
rx_frags[i].size = remainder;
@@ -1372,7 +1372,7 @@ myri10ge_rx_done(struct myri10ge_slice_state *ss, int len, __wsum csum,
ss->stats.rx_dropped++;
do {
i--;
- put_page(rx_frags[i].page);
+ __skb_frag_unref(&rx_frags[i]); /* XXX */
} while (i != 0);
return 0;
}
@@ -1380,7 +1380,7 @@ myri10ge_rx_done(struct myri10ge_slice_state *ss, int len, __wsum csum,
/* Attach the pages to the skb, and trim off any padding */
myri10ge_rx_skb_build(skb, va, rx_frags, len, hlen);
if (skb_shinfo(skb)->frags[0].size <= 0) {
- put_page(skb_shinfo(skb)->frags[0].page);
+ skb_frag_unref(skb, 0);
skb_shinfo(skb)->nr_frags = 0;
}
skb->protocol = eth_type_trans(skb, dev);
@@ -2220,7 +2220,7 @@ myri10ge_get_frag_header(struct skb_frag_struct *frag, void **mac_hdr,
struct ethhdr *eh;
struct vlan_ethhdr *veh;
struct iphdr *iph;
- u8 *va = page_address(frag->page) + frag->page_offset;
+ u8 *va = skb_frag_address(frag);
unsigned long ll_hlen;
/* passed opaque through lro_receive_frags() */
__wsum csum = (__force __wsum) (unsigned long)priv;
@@ -2863,8 +2863,8 @@ again:
frag = &skb_shinfo(skb)->frags[frag_idx];
frag_idx++;
len = frag->size;
- bus = pci_map_page(mgp->pdev, frag->page, frag->page_offset,
- len, PCI_DMA_TODEVICE);
+ bus = skb_frag_dma_map(&mgp->pdev->dev, frag, 0, len,
+ PCI_DMA_TODEVICE);
dma_unmap_addr_set(&tx->info[idx], bus, bus);
dma_unmap_len_set(&tx->info[idx], len, len);
}
diff --git a/drivers/net/netxen/netxen_nic_main.c b/drivers/net/netxen/netxen_nic_main.c
index c0788a3..d9c5864 100644
--- a/drivers/net/netxen/netxen_nic_main.c
+++ b/drivers/net/netxen/netxen_nic_main.c
@@ -1836,8 +1836,8 @@ netxen_map_tx_skb(struct pci_dev *pdev,
frag = &skb_shinfo(skb)->frags[i];
nf = &pbuf->frag_array[i+1];
- map = pci_map_page(pdev, frag->page, frag->page_offset,
- frag->size, PCI_DMA_TODEVICE);
+ map = skb_frag_dma_map(&pdev->dev, frag, 0, frag->size,
+ PCI_DMA_TODEVICE);
if (pci_dma_mapping_error(pdev, map))
goto unwind;
diff --git a/drivers/net/niu.c b/drivers/net/niu.c
index cc25bff..a901193 100644
--- a/drivers/net/niu.c
+++ b/drivers/net/niu.c
@@ -3290,7 +3290,7 @@ static void niu_rx_skb_append(struct sk_buff *skb, struct page *page,
int i = skb_shinfo(skb)->nr_frags;
skb_frag_t *frag = &skb_shinfo(skb)->frags[i];
- frag->page = page;
+ __skb_frag_set_page(frag, page);
frag->page_offset = offset;
frag->size = size;
@@ -6731,7 +6731,7 @@ static netdev_tx_t niu_start_xmit(struct sk_buff *skb,
skb_frag_t *frag = &skb_shinfo(skb)->frags[i];
len = frag->size;
- mapping = np->ops->map_page(np->device, frag->page,
+ mapping = np->ops->map_page(np->device, __skb_frag_page(frag),
frag->page_offset, len,
DMA_TO_DEVICE);
diff --git a/drivers/net/ns83820.c b/drivers/net/ns83820.c
index 3e4040f..6b3508d 100644
--- a/drivers/net/ns83820.c
+++ b/drivers/net/ns83820.c
@@ -1181,9 +1181,8 @@ again:
if (!nr_frags)
break;
- buf = pci_map_page(dev->pci_dev, frag->page,
- frag->page_offset,
- frag->size, PCI_DMA_TODEVICE);
+ buf = skb_frag_dma_map(&dev->pci_dev->dev, frag, 0,
+ frag->size, PCI_DMA_TODEVICE);
dprintk("frag: buf=%08Lx page=%08lx offset=%08lx\n",
(long long)buf, (long) page_to_pfn(frag->page),
frag->page_offset);
diff --git a/drivers/net/pasemi_mac.c b/drivers/net/pasemi_mac.c
index 9ec112c..3cd2cd3 100644
--- a/drivers/net/pasemi_mac.c
+++ b/drivers/net/pasemi_mac.c
@@ -1505,9 +1505,8 @@ static int pasemi_mac_start_tx(struct sk_buff *skb, struct net_device *dev)
for (i = 0; i < nfrags; i++) {
skb_frag_t *frag = &skb_shinfo(skb)->frags[i];
- map[i+1] = pci_map_page(mac->dma_pdev, frag->page,
- frag->page_offset, frag->size,
- PCI_DMA_TODEVICE);
+ map[i + 1] = skb_frag_dma_map(&mac->dma_pdev->dev, frag, 0,
+ frag->size, PCI_DMA_TODEVICE);
map_size[i+1] = frag->size;
if (pci_dma_mapping_error(mac->dma_pdev, map[i+1])) {
nfrags = i;
diff --git a/drivers/net/qla3xxx.c b/drivers/net/qla3xxx.c
index 771bb61..8a95fc7 100644
--- a/drivers/net/qla3xxx.c
+++ b/drivers/net/qla3xxx.c
@@ -2388,9 +2388,8 @@ static int ql_send_map(struct ql3_adapter *qdev,
seg++;
}
- map = pci_map_page(qdev->pdev, frag->page,
- frag->page_offset, frag->size,
- PCI_DMA_TODEVICE);
+ map = skb_frag_dma_map(&qdev->pdev->dev, frag, 0, frag->size,
+ PCI_DMA_TODEVICE);
err = pci_dma_mapping_error(qdev->pdev, map);
if (err) {
diff --git a/drivers/net/qlcnic/qlcnic_main.c b/drivers/net/qlcnic/qlcnic_main.c
index 0f6af5c..fe8d1f8 100644
--- a/drivers/net/qlcnic/qlcnic_main.c
+++ b/drivers/net/qlcnic/qlcnic_main.c
@@ -2120,8 +2120,8 @@ qlcnic_map_tx_skb(struct pci_dev *pdev,
frag = &skb_shinfo(skb)->frags[i];
nf = &pbuf->frag_array[i+1];
- map = pci_map_page(pdev, frag->page, frag->page_offset,
- frag->size, PCI_DMA_TODEVICE);
+ map = skb_frag_dma_map(&pdev->dev, frag, 0, frag->size,
+ PCI_DMA_TODEVICE);
if (pci_dma_mapping_error(pdev, map))
goto unwind;
diff --git a/drivers/net/qlge/qlge_main.c b/drivers/net/qlge/qlge_main.c
index 6b4ff97..cc04e5b 100644
--- a/drivers/net/qlge/qlge_main.c
+++ b/drivers/net/qlge/qlge_main.c
@@ -1430,10 +1430,8 @@ static int ql_map_send(struct ql_adapter *qdev,
map_idx++;
}
- map =
- pci_map_page(qdev->pdev, frag->page,
- frag->page_offset, frag->size,
- PCI_DMA_TODEVICE);
+ map = skb_frag_dma_map(&qdev->pdev->dev, frag, 0, frag->size,
+ PCI_DMA_TODEVICE);
err = pci_dma_mapping_error(qdev->pdev, map);
if (err) {
@@ -1494,7 +1492,7 @@ static void ql_process_mac_rx_gro_page(struct ql_adapter *qdev,
rx_frag = skb_shinfo(skb)->frags;
nr_frags = skb_shinfo(skb)->nr_frags;
rx_frag += nr_frags;
- rx_frag->page = lbq_desc->p.pg_chunk.page;
+ __skb_frag_set_page(rx_frag, lbq_desc->p.pg_chunk.page);
rx_frag->page_offset = lbq_desc->p.pg_chunk.offset;
rx_frag->size = length;
diff --git a/drivers/net/r8169.c b/drivers/net/r8169.c
index 5990621f..44e27bd 100644
--- a/drivers/net/r8169.c
+++ b/drivers/net/r8169.c
@@ -4630,7 +4630,7 @@ static int rtl8169_xmit_frags(struct rtl8169_private *tp, struct sk_buff *skb,
txd = tp->TxDescArray + entry;
len = frag->size;
- addr = ((void *) page_address(frag->page)) + frag->page_offset;
+ addr = skb_frag_address(frag);
mapping = dma_map_single(d, addr, len, DMA_TO_DEVICE);
if (unlikely(dma_mapping_error(d, mapping))) {
if (net_ratelimit())
diff --git a/drivers/net/s2io.c b/drivers/net/s2io.c
index df0d2c8..93f20fa 100644
--- a/drivers/net/s2io.c
+++ b/drivers/net/s2io.c
@@ -4242,10 +4242,10 @@ static netdev_tx_t s2io_xmit(struct sk_buff *skb, struct net_device *dev)
if (!frag->size)
continue;
txdp++;
- txdp->Buffer_Pointer = (u64)pci_map_page(sp->pdev, frag->page,
- frag->page_offset,
- frag->size,
- PCI_DMA_TODEVICE);
+ txdp->Buffer_Pointer = (u64)skb_frag_dma_map(&sp->pdev->dev,
+ frag, 0,
+ frag->size,
+ PCI_DMA_TODEVICE);
txdp->Control_1 = TXD_BUFFER0_SIZE(frag->size);
if (offload_type == SKB_GSO_UDP)
txdp->Control_1 |= TXD_UFO_EN;
diff --git a/drivers/net/sfc/rx.c b/drivers/net/sfc/rx.c
index 62e4364..91a6b71 100644
--- a/drivers/net/sfc/rx.c
+++ b/drivers/net/sfc/rx.c
@@ -478,7 +478,7 @@ static void efx_rx_packet_gro(struct efx_channel *channel,
if (efx->net_dev->features & NETIF_F_RXHASH)
skb->rxhash = efx_rx_buf_hash(eh);
- skb_shinfo(skb)->frags[0].page = page;
+ skb_frag_set_page(skb, 0, page);
skb_shinfo(skb)->frags[0].page_offset =
efx_rx_buf_offset(efx, rx_buf);
skb_shinfo(skb)->frags[0].size = rx_buf->len;
diff --git a/drivers/net/sfc/tx.c b/drivers/net/sfc/tx.c
index 84eb99e..f2467a1 100644
--- a/drivers/net/sfc/tx.c
+++ b/drivers/net/sfc/tx.c
@@ -137,8 +137,6 @@ netdev_tx_t efx_enqueue_skb(struct efx_tx_queue *tx_queue, struct sk_buff *skb)
struct pci_dev *pci_dev = efx->pci_dev;
struct efx_tx_buffer *buffer;
skb_frag_t *fragment;
- struct page *page;
- int page_offset;
unsigned int len, unmap_len = 0, fill_level, insert_ptr;
dma_addr_t dma_addr, unmap_addr = 0;
unsigned int dma_len;
@@ -241,13 +239,11 @@ netdev_tx_t efx_enqueue_skb(struct efx_tx_queue *tx_queue, struct sk_buff *skb)
break;
fragment = &skb_shinfo(skb)->frags[i];
len = fragment->size;
- page = fragment->page;
- page_offset = fragment->page_offset;
i++;
/* Map for DMA */
unmap_single = false;
- dma_addr = pci_map_page(pci_dev, page, page_offset, len,
- PCI_DMA_TODEVICE);
+ dma_addr = skb_frag_dma_map(&pci_dev->dev, fragment, 0, len,
+ PCI_DMA_TODEVICE);
}
/* Transfer ownership of the skb to the final buffer */
@@ -929,9 +925,8 @@ static void tso_start(struct tso_state *st, const struct sk_buff *skb)
static int tso_get_fragment(struct tso_state *st, struct efx_nic *efx,
skb_frag_t *frag)
{
- st->unmap_addr = pci_map_page(efx->pci_dev, frag->page,
- frag->page_offset, frag->size,
- PCI_DMA_TODEVICE);
+ st->unmap_addr = skb_frag_dma_map(&efx->pci_dev->dev, frag, 0,
+ frag->size, PCI_DMA_TODEVICE);
if (likely(!pci_dma_mapping_error(efx->pci_dev, st->unmap_addr))) {
st->unmap_single = false;
st->unmap_len = frag->size;
diff --git a/drivers/net/skge.c b/drivers/net/skge.c
index f4be5c7..cf635f7 100644
--- a/drivers/net/skge.c
+++ b/drivers/net/skge.c
@@ -2747,8 +2747,8 @@ static netdev_tx_t skge_xmit_frame(struct sk_buff *skb,
for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) {
skb_frag_t *frag = &skb_shinfo(skb)->frags[i];
- map = pci_map_page(hw->pdev, frag->page, frag->page_offset,
- frag->size, PCI_DMA_TODEVICE);
+ map = skb_frag_dma_map(&hw->pdev->dev, frag, 0,
+ frag->size, PCI_DMA_TODEVICE);
e = e->next;
e->skb = skb;
diff --git a/drivers/net/sky2.c b/drivers/net/sky2.c
index 3ee41da..e1cf142 100644
--- a/drivers/net/sky2.c
+++ b/drivers/net/sky2.c
@@ -1143,10 +1143,9 @@ static int sky2_rx_map_skb(struct pci_dev *pdev, struct rx_ring_info *re,
for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) {
skb_frag_t *frag = &skb_shinfo(skb)->frags[i];
- re->frag_addr[i] = pci_map_page(pdev, frag->page,
- frag->page_offset,
- frag->size,
- PCI_DMA_FROMDEVICE);
+ re->frag_addr[i] = skb_frag_dma_map(&pdev->dev, frag, 0,
+ frag->size,
+ PCI_DMA_FROMDEVICE);
if (pci_dma_mapping_error(pdev, re->frag_addr[i]))
goto map_page_error;
@@ -1826,8 +1825,8 @@ static netdev_tx_t sky2_xmit_frame(struct sk_buff *skb,
for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) {
const skb_frag_t *frag = &skb_shinfo(skb)->frags[i];
- mapping = pci_map_page(hw->pdev, frag->page, frag->page_offset,
- frag->size, PCI_DMA_TODEVICE);
+ mapping = skb_frag_dma_map(&hw->pdev->dev, frag, 0,
+ frag->size, PCI_DMA_TODEVICE);
if (pci_dma_mapping_error(hw->pdev, mapping))
goto mapping_unwind;
@@ -2360,7 +2359,7 @@ static void skb_put_frags(struct sk_buff *skb, unsigned int hdr_space,
if (length == 0) {
/* don't need this page */
- __free_page(frag->page);
+ __skb_frag_unref(frag);
--skb_shinfo(skb)->nr_frags;
} else {
size = min(length, (unsigned) PAGE_SIZE);
diff --git a/drivers/net/starfire.c b/drivers/net/starfire.c
index 36045f3..a0c8f34 100644
--- a/drivers/net/starfire.c
+++ b/drivers/net/starfire.c
@@ -1270,7 +1270,7 @@ static netdev_tx_t start_tx(struct sk_buff *skb, struct net_device *dev)
skb_frag_t *this_frag = &skb_shinfo(skb)->frags[i - 1];
status |= this_frag->size;
np->tx_info[entry].mapping =
- pci_map_single(np->pci_dev, page_address(this_frag->page) + this_frag->page_offset, this_frag->size, PCI_DMA_TODEVICE);
+ pci_map_single(np->pci_dev, skb_frag_address(this_frag), this_frag->size, PCI_DMA_TODEVICE);
}
np->tx_ring[entry].addr = cpu_to_dma(np->tx_info[entry].mapping);
diff --git a/drivers/net/stmmac/stmmac_main.c b/drivers/net/stmmac/stmmac_main.c
index e25e44a..5157624 100644
--- a/drivers/net/stmmac/stmmac_main.c
+++ b/drivers/net/stmmac/stmmac_main.c
@@ -1040,9 +1040,8 @@ static netdev_tx_t stmmac_xmit(struct sk_buff *skb, struct net_device *dev)
desc = priv->dma_tx + entry;
TX_DBG("\t[entry %d] segment len: %d\n", entry, len);
- desc->des2 = dma_map_page(priv->device, frag->page,
- frag->page_offset,
- len, DMA_TO_DEVICE);
+ desc->des2 = skb_frag_dma_map(priv->device, frag, 0, len,
+ DMA_TO_DEVICE);
priv->tx_skbuff[entry] = NULL;
priv->hw->desc->prepare_tx_desc(desc, 0, len, csum_insertion);
priv->hw->desc->set_tx_owner(desc);
diff --git a/drivers/net/sungem.c b/drivers/net/sungem.c
index ab59300..6b8a7bf 100644
--- a/drivers/net/sungem.c
+++ b/drivers/net/sungem.c
@@ -1078,10 +1078,8 @@ static netdev_tx_t gem_start_xmit(struct sk_buff *skb,
u64 this_ctrl;
len = this_frag->size;
- mapping = pci_map_page(gp->pdev,
- this_frag->page,
- this_frag->page_offset,
- len, PCI_DMA_TODEVICE);
+ mapping = skb_frag_dma_map(&gp->pdev->dev, this_frag,
+ 0, len, PCI_DMA_TODEVICE);
this_ctrl = ctrl;
if (frag == skb_shinfo(skb)->nr_frags - 1)
this_ctrl |= TXDCTRL_EOF;
diff --git a/drivers/net/sunhme.c b/drivers/net/sunhme.c
index 30aad54..3baef5e 100644
--- a/drivers/net/sunhme.c
+++ b/drivers/net/sunhme.c
@@ -2315,9 +2315,8 @@ static netdev_tx_t happy_meal_start_xmit(struct sk_buff *skb,
u32 len, mapping, this_txflags;
len = this_frag->size;
- mapping = dma_map_page(hp->dma_dev, this_frag->page,
- this_frag->page_offset, len,
- DMA_TO_DEVICE);
+ mapping = skb_frag_dma_map(hp->dma_dev, this_frag,
+ 0, len, DMA_TO_DEVICE);
this_txflags = tx_flags;
if (frag == skb_shinfo(skb)->nr_frags - 1)
this_txflags |= TXFLAG_EOP;
diff --git a/drivers/net/tehuti.c b/drivers/net/tehuti.c
index 80fbee0..d552617 100644
--- a/drivers/net/tehuti.c
+++ b/drivers/net/tehuti.c
@@ -1519,9 +1519,9 @@ bdx_tx_map_skb(struct bdx_priv *priv, struct sk_buff *skb,
frag = &skb_shinfo(skb)->frags[i];
db->wptr->len = frag->size;
- db->wptr->addr.dma =
- pci_map_page(priv->pdev, frag->page, frag->page_offset,
- frag->size, PCI_DMA_TODEVICE);
+ db->wptr->addr.dma = skb_frag_dma_map(&priv->pdev->dev, frag,
+ 0, frag->size,
+ PCI_DMA_TODEVICE);
pbl++;
pbl->len = CPU_CHIP_SWAP32(db->wptr->len);
diff --git a/drivers/net/tg3.c b/drivers/net/tg3.c
index a1f9f9e..c53104d 100644
--- a/drivers/net/tg3.c
+++ b/drivers/net/tg3.c
@@ -6040,10 +6040,8 @@ static netdev_tx_t tg3_start_xmit(struct sk_buff *skb, struct net_device *dev)
skb_frag_t *frag = &skb_shinfo(skb)->frags[i];
len = frag->size;
- mapping = pci_map_page(tp->pdev,
- frag->page,
- frag->page_offset,
- len, PCI_DMA_TODEVICE);
+ mapping = skb_frag_dma_map(&tp->pdev->dev, frag, 0,
+ len, PCI_DMA_TODEVICE);
tnapi->tx_buffers[entry].skb = NULL;
dma_unmap_addr_set(&tnapi->tx_buffers[entry], mapping,
diff --git a/drivers/net/tsi108_eth.c b/drivers/net/tsi108_eth.c
index 5c633a3..52f89a5 100644
--- a/drivers/net/tsi108_eth.c
+++ b/drivers/net/tsi108_eth.c
@@ -710,9 +710,10 @@ static int tsi108_send_packet(struct sk_buff * skb, struct net_device *dev)
} else {
skb_frag_t *frag = &skb_shinfo(skb)->frags[i - 1];
- data->txring[tx].buf0 =
- dma_map_page(NULL, frag->page, frag->page_offset,
- frag->size, DMA_TO_DEVICE);
+ data->txring[tx].buf0 = skb_frag_dma_map(NULL, frag,
+ 0,
+ frag->size,
+ DMA_TO_DEVICE);
data->txring[tx].len = frag->size;
}
diff --git a/drivers/net/typhoon.c b/drivers/net/typhoon.c
index 3de4283..eb32147 100644
--- a/drivers/net/typhoon.c
+++ b/drivers/net/typhoon.c
@@ -819,8 +819,7 @@ typhoon_start_tx(struct sk_buff *skb, struct net_device *dev)
typhoon_inc_tx_index(&txRing->lastWrite, 1);
len = frag->size;
- frag_addr = (void *) page_address(frag->page) +
- frag->page_offset;
+ frag_addr = skb_frag_address(frag);
skb_dma = pci_map_single(tp->tx_pdev, frag_addr, len,
PCI_DMA_TODEVICE);
txd->flags = TYPHOON_FRAG_DESC | TYPHOON_DESC_VALID;
diff --git a/drivers/net/via-velocity.c b/drivers/net/via-velocity.c
index 06daa9d..6e34b78 100644
--- a/drivers/net/via-velocity.c
+++ b/drivers/net/via-velocity.c
@@ -2580,9 +2580,10 @@ static netdev_tx_t velocity_xmit(struct sk_buff *skb,
for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) {
skb_frag_t *frag = &skb_shinfo(skb)->frags[i];
- tdinfo->skb_dma[i + 1] = pci_map_page(vptr->pdev, frag->page,
- frag->page_offset, frag->size,
- PCI_DMA_TODEVICE);
+ tdinfo->skb_dma[i + 1] = skb_frag_dma_map(&vptr->pdev->dev,
+ frag, 0,
+ frag->size,
+ PCI_DMA_TODEVICE);
td_ptr->td_buf[i + 1].pa_low = cpu_to_le32(tdinfo->skb_dma[i + 1]);
td_ptr->td_buf[i + 1].pa_high = 0;
diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c
index f685324..c35ae8f 100644
--- a/drivers/net/virtio_net.c
+++ b/drivers/net/virtio_net.c
@@ -137,7 +137,7 @@ static void set_skb_frag(struct sk_buff *skb, struct page *page,
f = &skb_shinfo(skb)->frags[i];
f->size = min((unsigned)PAGE_SIZE - offset, *len);
f->page_offset = offset;
- f->page = page;
+ __skb_frag_set_page(f, page);
skb->data_len += f->size;
skb->len += f->size;
diff --git a/drivers/net/vmxnet3/vmxnet3_drv.c b/drivers/net/vmxnet3/vmxnet3_drv.c
index 6740235..c4a8d2e 100644
--- a/drivers/net/vmxnet3/vmxnet3_drv.c
+++ b/drivers/net/vmxnet3/vmxnet3_drv.c
@@ -656,7 +656,7 @@ vmxnet3_append_frag(struct sk_buff *skb, struct Vmxnet3_RxCompDesc *rcd,
BUG_ON(skb_shinfo(skb)->nr_frags >= MAX_SKB_FRAGS);
- frag->page = rbi->page;
+ __skb_frag_set_page(frag, rbi->page);
frag->page_offset = 0;
frag->size = rcd->len;
skb->data_len += frag->size;
@@ -750,9 +750,9 @@ vmxnet3_map_pkt(struct sk_buff *skb, struct vmxnet3_tx_ctx *ctx,
tbi = tq->buf_info + tq->tx_ring.next2fill;
tbi->map_type = VMXNET3_MAP_PAGE;
- tbi->dma_addr = pci_map_page(adapter->pdev, frag->page,
- frag->page_offset, frag->size,
- PCI_DMA_TODEVICE);
+ tbi->dma_addr = skb_frag_dma_map(&adapter->pdev->dev, frag,
+ 0, frag->size,
+ PCI_DMA_TODEVICE);
tbi->len = frag->size;
diff --git a/drivers/net/vxge/vxge-main.c b/drivers/net/vxge/vxge-main.c
index 8ab870a..63e7797 100644
--- a/drivers/net/vxge/vxge-main.c
+++ b/drivers/net/vxge/vxge-main.c
@@ -921,9 +921,9 @@ vxge_xmit(struct sk_buff *skb, struct net_device *dev)
if (!frag->size)
continue;
- dma_pointer = (u64) pci_map_page(fifo->pdev, frag->page,
- frag->page_offset, frag->size,
- PCI_DMA_TODEVICE);
+ dma_pointer = (u64)skb_frag_dma_map(&fifo->pdev->dev, frag,
+ 0, frag->size,
+ PCI_DMA_TODEVICE);
if (unlikely(pci_dma_mapping_error(fifo->pdev, dma_pointer)))
goto _exit2;
diff --git a/drivers/net/xen-netback/netback.c b/drivers/net/xen-netback/netback.c
index 0e4851b..5c79483 100644
--- a/drivers/net/xen-netback/netback.c
+++ b/drivers/net/xen-netback/netback.c
@@ -215,6 +215,16 @@ static int get_page_ext(struct page *pg,
sizeof(struct iphdr) + MAX_IPOPTLEN + \
sizeof(struct tcphdr) + MAX_TCP_OPTION_SPACE)
+static unsigned long frag_get_pending_idx(skb_frag_t *frag)
+{
+ return (unsigned long)skb_frag_page(frag);
+}
+
+static void frag_set_pending_idx(skb_frag_t *frag, unsigned long pending_idx)
+{
+ __skb_frag_set_page(frag, (void *)pending_idx);
+}
+
static inline pending_ring_idx_t pending_index(unsigned i)
{
return i & (MAX_PENDING_REQS-1);
@@ -512,7 +522,7 @@ static int netbk_gop_skb(struct sk_buff *skb,
for (i = 0; i < nr_frags; i++) {
netbk_gop_frag_copy(vif, skb, npo,
- skb_shinfo(skb)->frags[i].page,
+ __skb_frag_page(&skb_shinfo(skb)->frags[i]),
skb_shinfo(skb)->frags[i].size,
skb_shinfo(skb)->frags[i].page_offset,
&head);
@@ -913,7 +923,7 @@ static struct gnttab_copy *xen_netbk_get_requests(struct xen_netbk *netbk,
int i, start;
/* Skip first skb fragment if it is on same page as header fragment. */
- start = ((unsigned long)shinfo->frags[0].page == pending_idx);
+ start = (frag_get_pending_idx(&shinfo->frags[0]) == pending_idx);
for (i = start; i < shinfo->nr_frags; i++, txp++) {
struct page *page;
@@ -945,7 +955,7 @@ static struct gnttab_copy *xen_netbk_get_requests(struct xen_netbk *netbk,
memcpy(&pending_tx_info[pending_idx].req, txp, sizeof(*txp));
xenvif_get(vif);
pending_tx_info[pending_idx].vif = vif;
- frags[i].page = (void *)pending_idx;
+ frag_set_pending_idx(&frags[i], pending_idx);
}
return gop;
@@ -976,13 +986,13 @@ static int xen_netbk_tx_check_gop(struct xen_netbk *netbk,
}
/* Skip first skb fragment if it is on same page as header fragment. */
- start = ((unsigned long)shinfo->frags[0].page == pending_idx);
+ start = (frag_get_pending_idx(&shinfo->frags[0]) == pending_idx);
for (i = start; i < nr_frags; i++) {
int j, newerr;
pending_ring_idx_t index;
- pending_idx = (unsigned long)shinfo->frags[i].page;
+ pending_idx = frag_get_pending_idx(&shinfo->frags[i]);
/* Check error status: if okay then remember grant handle. */
newerr = (++gop)->status;
@@ -1008,7 +1018,7 @@ static int xen_netbk_tx_check_gop(struct xen_netbk *netbk,
pending_idx = *((u16 *)skb->data);
xen_netbk_idx_release(netbk, pending_idx);
for (j = start; j < i; j++) {
- pending_idx = (unsigned long)shinfo->frags[i].page;
+ pending_idx = frag_get_pending_idx(&shinfo->frags[i]);
xen_netbk_idx_release(netbk, pending_idx);
}
@@ -1029,12 +1039,14 @@ static void xen_netbk_fill_frags(struct xen_netbk *netbk, struct sk_buff *skb)
for (i = 0; i < nr_frags; i++) {
skb_frag_t *frag = shinfo->frags + i;
struct xen_netif_tx_request *txp;
+ struct page *page;
unsigned long pending_idx;
- pending_idx = (unsigned long)frag->page;
+ pending_idx = frag_get_pending_idx(frag);
txp = &netbk->pending_tx_info[pending_idx].req;
- frag->page = virt_to_page(idx_to_kaddr(netbk, pending_idx));
+ page = virt_to_page(idx_to_kaddr(netbk, pending_idx));
+ __skb_frag_set_page(frag, page);
frag->size = txp->size;
frag->page_offset = txp->offset;
@@ -1349,11 +1361,11 @@ static unsigned xen_netbk_tx_build_gops(struct xen_netbk *netbk)
skb_shinfo(skb)->nr_frags = ret;
if (data_len < txreq.size) {
skb_shinfo(skb)->nr_frags++;
- skb_shinfo(skb)->frags[0].page =
- (void *)(unsigned long)pending_idx;
+ frag_set_pending_idx(&skb_shinfo(skb)->frags[0],
+ pending_idx);
} else {
/* Discriminate from any valid pending_idx value. */
- skb_shinfo(skb)->frags[0].page = (void *)~0UL;
+ frag_set_pending_idx(&skb_shinfo(skb)->frags[0], ~0UL);
}
__skb_queue_tail(&netbk->tx_queue, skb);
diff --git a/drivers/net/xen-netfront.c b/drivers/net/xen-netfront.c
index d29365a..ecc4b4b 100644
--- a/drivers/net/xen-netfront.c
+++ b/drivers/net/xen-netfront.c
@@ -265,7 +265,7 @@ no_skb:
break;
}
- skb_shinfo(skb)->frags[0].page = page;
+ skb_frag_set_page(skb, 0, page);
skb_shinfo(skb)->nr_frags = 1;
__skb_queue_tail(&np->rx_batch, skb);
}
@@ -299,8 +299,8 @@ no_skb:
BUG_ON((signed short)ref < 0);
np->grant_rx_ref[id] = ref;
- pfn = page_to_pfn(skb_shinfo(skb)->frags[0].page);
- vaddr = page_address(skb_shinfo(skb)->frags[0].page);
+ pfn = page_to_pfn(skb_frag_page(&skb_shinfo(skb)->frags[0]));
+ vaddr = page_address(skb_frag_page(&skb_shinfo(skb)->frags[0]));
req = RING_GET_REQUEST(&np->rx, req_prod + i);
gnttab_grant_foreign_access_ref(ref,
@@ -451,7 +451,7 @@ static void xennet_make_frags(struct sk_buff *skb, struct net_device *dev,
ref = gnttab_claim_grant_reference(&np->gref_tx_head);
BUG_ON((signed short)ref < 0);
- mfn = pfn_to_mfn(page_to_pfn(frag->page));
+ mfn = pfn_to_mfn(page_to_pfn(skb_frag_page(frag)));
gnttab_grant_foreign_access_ref(ref, np->xbdev->otherend_id,
mfn, GNTMAP_readonly);
@@ -755,8 +755,9 @@ static RING_IDX xennet_fill_frags(struct netfront_info *np,
while ((nskb = __skb_dequeue(list))) {
struct xen_netif_rx_response *rx =
RING_GET_RESPONSE(&np->rx, ++cons);
+ skb_frag_t *nfrag = &skb_shinfo(nskb)->frags[0];
- frag->page = skb_shinfo(nskb)->frags[0].page;
+ __skb_frag_set_page(frag, __skb_frag_page(nfrag));
frag->page_offset = rx->offset;
frag->size = rx->status;
@@ -858,7 +859,7 @@ static int handle_incoming_queue(struct net_device *dev,
memcpy(skb->data, vaddr + offset,
skb_headlen(skb));
- if (page != skb_shinfo(skb)->frags[0].page)
+ if (page != skb_frag_page(&skb_shinfo(skb)->frags[0]))
__free_page(page);
/* Ethernet work: Delayed to here as it peeks the header. */
@@ -937,7 +938,8 @@ err:
}
}
- NETFRONT_SKB_CB(skb)->page = skb_shinfo(skb)->frags[0].page;
+ NETFRONT_SKB_CB(skb)->page =
+ __skb_frag_page(&skb_shinfo(skb)->frags[0]);
NETFRONT_SKB_CB(skb)->offset = rx->offset;
len = rx->status;
@@ -951,7 +953,7 @@ err:
skb_shinfo(skb)->frags[0].size = rx->status - len;
skb->data_len = rx->status - len;
} else {
- skb_shinfo(skb)->frags[0].page = NULL;
+ skb_frag_set_page(skb, 0, NULL);
skb_shinfo(skb)->nr_frags = 0;
}
@@ -1094,7 +1096,8 @@ static void xennet_release_rx_bufs(struct netfront_info *np)
if (!xen_feature(XENFEAT_auto_translated_physmap)) {
/* Remap the page. */
- struct page *page = skb_shinfo(skb)->frags[0].page;
+ const struct page *page =
+ skb_frag_page(&skb_shinfo(skb)->frags[0]);
unsigned long pfn = page_to_pfn(page);
void *vaddr = page_address(page);
@@ -1593,6 +1596,8 @@ static int xennet_connect(struct net_device *dev)
/* Step 2: Rebuild the RX buffer freelist and the RX ring itself. */
for (requeue_idx = 0, i = 0; i < NET_RX_RING_SIZE; i++) {
+ skb_frag_t *frag;
+ const struct page *page;
if (!np->rx_skbs[i])
continue;
@@ -1600,10 +1605,11 @@ static int xennet_connect(struct net_device *dev)
ref = np->grant_rx_ref[requeue_idx] = xennet_get_rx_ref(np, i);
req = RING_GET_REQUEST(&np->rx, requeue_idx);
+ frag = &skb_shinfo(skb)->frags[0];
+ page = skb_frag_page(frag);
gnttab_grant_foreign_access_ref(
ref, np->xbdev->otherend_id,
- pfn_to_mfn(page_to_pfn(skb_shinfo(skb)->
- frags->page)),
+ pfn_to_mfn(page_to_pfn(page)),
0);
req->gref = ref;
req->id = requeue_idx;
diff --git a/drivers/scsi/bnx2fc/bnx2fc_fcoe.c b/drivers/scsi/bnx2fc/bnx2fc_fcoe.c
index ab255fb..f7a3517 100644
--- a/drivers/scsi/bnx2fc/bnx2fc_fcoe.c
+++ b/drivers/scsi/bnx2fc/bnx2fc_fcoe.c
@@ -296,7 +296,7 @@ static int bnx2fc_xmit(struct fc_lport *lport, struct fc_frame *fp)
return -ENOMEM;
}
frag = &skb_shinfo(skb)->frags[skb_shinfo(skb)->nr_frags - 1];
- cp = kmap_atomic(frag->page, KM_SKB_DATA_SOFTIRQ)
+ cp = kmap_atomic(__skb_frag_page(frag), KM_SKB_DATA_SOFTIRQ)
+ frag->page_offset;
} else {
cp = (struct fcoe_crc_eof *)skb_put(skb, tlen);
diff --git a/drivers/scsi/cxgbi/libcxgbi.c b/drivers/scsi/cxgbi/libcxgbi.c
index a2a9c7c..949ee48 100644
--- a/drivers/scsi/cxgbi/libcxgbi.c
+++ b/drivers/scsi/cxgbi/libcxgbi.c
@@ -1812,7 +1812,7 @@ static int sgl_read_to_frags(struct scatterlist *sg, unsigned int sgoffset,
}
copy = min(datalen, sglen);
- if (i && page == frags[i - 1].page &&
+ if (i && page == skb_frag_page(&frags[i - 1]) &&
sgoffset + sg->offset ==
frags[i - 1].page_offset + frags[i - 1].size) {
frags[i - 1].size += copy;
@@ -1948,7 +1948,7 @@ int cxgbi_conn_init_pdu(struct iscsi_task *task, unsigned int offset,
/* data fits in the skb's headroom */
for (i = 0; i < tdata->nr_frags; i++, frag++) {
- char *src = kmap_atomic(frag->page,
+ char *src = kmap_atomic(__skb_frag_page(frag),
KM_SOFTIRQ0);
memcpy(dst, src+frag->page_offset, frag->size);
@@ -1963,7 +1963,7 @@ int cxgbi_conn_init_pdu(struct iscsi_task *task, unsigned int offset,
} else {
/* data fit into frag_list */
for (i = 0; i < tdata->nr_frags; i++)
- get_page(tdata->frags[i].page);
+ __skb_frag_ref(&tdata->frags[i]);
memcpy(skb_shinfo(skb)->frags, tdata->frags,
sizeof(skb_frag_t) * tdata->nr_frags);
diff --git a/drivers/scsi/fcoe/fcoe.c b/drivers/scsi/fcoe/fcoe.c
index 155d7b9..deee71a 100644
--- a/drivers/scsi/fcoe/fcoe.c
+++ b/drivers/scsi/fcoe/fcoe.c
@@ -1425,7 +1425,7 @@ int fcoe_xmit(struct fc_lport *lport, struct fc_frame *fp)
return -ENOMEM;
}
frag = &skb_shinfo(skb)->frags[skb_shinfo(skb)->nr_frags - 1];
- cp = kmap_atomic(frag->page, KM_SKB_DATA_SOFTIRQ)
+ cp = kmap_atomic(__skb_frag_page(frag), KM_SKB_DATA_SOFTIRQ)
+ frag->page_offset;
} else {
cp = (struct fcoe_crc_eof *)skb_put(skb, tlen);
diff --git a/drivers/scsi/fcoe/fcoe_transport.c b/drivers/scsi/fcoe/fcoe_transport.c
index 41068e8..40243ce 100644
--- a/drivers/scsi/fcoe/fcoe_transport.c
+++ b/drivers/scsi/fcoe/fcoe_transport.c
@@ -108,8 +108,9 @@ u32 fcoe_fc_crc(struct fc_frame *fp)
len = frag->size;
while (len > 0) {
clen = min(len, PAGE_SIZE - (off & ~PAGE_MASK));
- data = kmap_atomic(frag->page + (off >> PAGE_SHIFT),
- KM_SKB_DATA_SOFTIRQ);
+ data = kmap_atomic(
+ __skb_frag_page(frag) + (off >> PAGE_SHIFT),
+ KM_SKB_DATA_SOFTIRQ);
crc = crc32(crc, data + (off & ~PAGE_MASK), clen);
kunmap_atomic(data, KM_SKB_DATA_SOFTIRQ);
off += clen;
diff --git a/drivers/staging/et131x/et1310_tx.c b/drivers/staging/et131x/et1310_tx.c
index 4241d2a..63ee8af 100644
--- a/drivers/staging/et131x/et1310_tx.c
+++ b/drivers/staging/et131x/et1310_tx.c
@@ -519,12 +519,11 @@ static int nic_send_packet(struct et131x_adapter *etdev, struct tcb *tcb)
* returned by pci_map_page() is always 32-bit
* addressable (as defined by the pci/dma subsystem)
*/
- desc[frag++].addr_lo =
- pci_map_page(etdev->pdev,
- frags[i - 1].page,
- frags[i - 1].page_offset,
- frags[i - 1].size,
- PCI_DMA_TODEVICE);
+ desc[frag++].addr_lo = skb_frag_dma_map(&etdev->pdev->dev,
+ &frags[i - 1],
+ 0,
+ frags[i - 1].size,
+ PCI_DMA_TODEVICE);
}
}
diff --git a/drivers/staging/hv/netvsc_drv.c b/drivers/staging/hv/netvsc_drv.c
index 7b9c229..80d1f1f 100644
--- a/drivers/staging/hv/netvsc_drv.c
+++ b/drivers/staging/hv/netvsc_drv.c
@@ -172,7 +172,7 @@ static int netvsc_start_xmit(struct sk_buff *skb, struct net_device *net)
for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) {
skb_frag_t *f = &skb_shinfo(skb)->frags[i];
- packet->page_buf[i+2].pfn = page_to_pfn(f->page);
+ packet->page_buf[i+2].pfn = page_to_pfn(skb_frag_page(f));
packet->page_buf[i+2].offset = f->page_offset;
packet->page_buf[i+2].len = f->size;
}
--
1.7.2.5
^ permalink raw reply related
* [PATCH 06/13] net: ipv6: convert to SKB frag APIs
From: Ian Campbell @ 2011-07-22 13:17 UTC (permalink / raw)
To: netdev, linux-nfs
Cc: Ian Campbell, David S. Miller, Alexey Kuznetsov,
Pekka Savola (ipv6), James Morris, Hideaki YOSHIFUJI,
Patrick McHardy
In-Reply-To: <1311340095.12772.57.camel@zakaz.uk.xensource.com>
Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
Cc: "David S. Miller" <davem@davemloft.net>
Cc: Alexey Kuznetsov <kuznet@ms2.inr.ac.ru>
Cc: "Pekka Savola (ipv6)" <pekkas@netcore.fi>
Cc: James Morris <jmorris@namei.org>
Cc: Hideaki YOSHIFUJI <yoshfuji@linux-ipv6.org>
Cc: Patrick McHardy <kaber@trash.net>
Cc: netdev@vger.kernel.org
---
net/ipv6/ip6_output.c | 8 +++++---
1 files changed, 5 insertions(+), 3 deletions(-)
diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c
index 9d4b165..fdd4f61 100644
--- a/net/ipv6/ip6_output.c
+++ b/net/ipv6/ip6_output.c
@@ -1441,14 +1441,14 @@ alloc_new_skb:
if (page && (left = PAGE_SIZE - off) > 0) {
if (copy >= left)
copy = left;
- if (page != frag->page) {
+ if (page != skb_frag_page(frag)) {
if (i == MAX_SKB_FRAGS) {
err = -EMSGSIZE;
goto error;
}
- get_page(page);
skb_fill_page_desc(skb, i, page, sk->sk_sndmsg_off, 0);
frag = &skb_shinfo(skb)->frags[i];
+ __skb_frag_ref(frag);
}
} else if(i < MAX_SKB_FRAGS) {
if (copy > PAGE_SIZE)
@@ -1461,13 +1461,15 @@ alloc_new_skb:
sk->sk_sndmsg_page = page;
sk->sk_sndmsg_off = 0;
+ /* XXX no ref ? */
skb_fill_page_desc(skb, i, page, 0, 0);
frag = &skb_shinfo(skb)->frags[i];
} else {
err = -EMSGSIZE;
goto error;
}
- if (getfrag(from, page_address(frag->page)+frag->page_offset+frag->size, offset, copy, skb->len, skb) < 0) {
+ if (getfrag(from, skb_frag_address(frag)+frag->size,
+ offset, copy, skb->len, skb) < 0) {
err = -EFAULT;
goto error;
}
--
1.7.2.5
^ permalink raw reply related
* [PATCH 05/13] net: ipv4: convert to SKB frag APIs
From: Ian Campbell @ 2011-07-22 13:17 UTC (permalink / raw)
To: netdev, linux-nfs
Cc: Ian Campbell, David S. Miller, Alexey Kuznetsov,
Pekka Savola (ipv6), James Morris, Hideaki YOSHIFUJI,
Patrick McHardy
In-Reply-To: <1311340095.12772.57.camel@zakaz.uk.xensource.com>
Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
Cc: "David S. Miller" <davem@davemloft.net>
Cc: Alexey Kuznetsov <kuznet@ms2.inr.ac.ru>
Cc: "Pekka Savola (ipv6)" <pekkas@netcore.fi>
Cc: James Morris <jmorris@namei.org>
Cc: Hideaki YOSHIFUJI <yoshfuji@linux-ipv6.org>
Cc: Patrick McHardy <kaber@trash.net>
Cc: netdev@vger.kernel.org
---
net/ipv4/inet_lro.c | 2 +-
net/ipv4/ip_output.c | 8 +++++---
net/ipv4/tcp.c | 3 ++-
net/ipv4/tcp_output.c | 2 +-
4 files changed, 9 insertions(+), 6 deletions(-)
diff --git a/net/ipv4/inet_lro.c b/net/ipv4/inet_lro.c
index 85a0f75..63f3def 100644
--- a/net/ipv4/inet_lro.c
+++ b/net/ipv4/inet_lro.c
@@ -449,7 +449,7 @@ static struct sk_buff *__lro_proc_segment(struct net_lro_mgr *lro_mgr,
if (!lro_mgr->get_frag_header ||
lro_mgr->get_frag_header(frags, (void *)&mac_hdr, (void *)&iph,
(void *)&tcph, &flags, priv)) {
- mac_hdr = page_address(frags->page) + frags->page_offset;
+ mac_hdr = skb_frag_address(frags);
goto out1;
}
diff --git a/net/ipv4/ip_output.c b/net/ipv4/ip_output.c
index 84f26e8..3aa3c91 100644
--- a/net/ipv4/ip_output.c
+++ b/net/ipv4/ip_output.c
@@ -982,14 +982,14 @@ alloc_new_skb:
if (page && (left = PAGE_SIZE - off) > 0) {
if (copy >= left)
copy = left;
- if (page != frag->page) {
+ if (page != skb_frag_page(frag)) {
if (i == MAX_SKB_FRAGS) {
err = -EMSGSIZE;
goto error;
}
- get_page(page);
skb_fill_page_desc(skb, i, page, off, 0);
frag = &skb_shinfo(skb)->frags[i];
+ __skb_frag_ref(frag);
}
} else if (i < MAX_SKB_FRAGS) {
if (copy > PAGE_SIZE)
@@ -1002,13 +1002,15 @@ alloc_new_skb:
cork->page = page;
cork->off = 0;
+ /* XXX no ref ? */
skb_fill_page_desc(skb, i, page, 0, 0);
frag = &skb_shinfo(skb)->frags[i];
} else {
err = -EMSGSIZE;
goto error;
}
- if (getfrag(from, page_address(frag->page)+frag->page_offset+frag->size, offset, copy, skb->len, skb) < 0) {
+ if (getfrag(from, skb_frag_address(frag)+frag->size,
+ offset, copy, skb->len, skb) < 0) {
err = -EFAULT;
goto error;
}
diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c
index 46febca..ac47ab3 100644
--- a/net/ipv4/tcp.c
+++ b/net/ipv4/tcp.c
@@ -3035,7 +3035,8 @@ int tcp_md5_hash_skb_data(struct tcp_md5sig_pool *hp,
for (i = 0; i < shi->nr_frags; ++i) {
const struct skb_frag_struct *f = &shi->frags[i];
- sg_set_page(&sg, f->page, f->size, f->page_offset);
+ struct page *page = __skb_frag_page(f); /* XXX */
+ sg_set_page(&sg, page, f->size, f->page_offset);
if (crypto_hash_update(desc, &sg, f->size))
return 1;
}
diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c
index 882e0b0..0377c06 100644
--- a/net/ipv4/tcp_output.c
+++ b/net/ipv4/tcp_output.c
@@ -1095,7 +1095,7 @@ static void __pskb_trim_head(struct sk_buff *skb, int len)
k = 0;
for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) {
if (skb_shinfo(skb)->frags[i].size <= eat) {
- put_page(skb_shinfo(skb)->frags[i].page);
+ skb_frag_unref(skb, i);
eat -= skb_shinfo(skb)->frags[i].size;
} else {
skb_shinfo(skb)->frags[k] = skb_shinfo(skb)->frags[i];
--
1.7.2.5
^ permalink raw reply related
* [PATCH 04/13] net: convert core to skb paged frag APIs
From: Ian Campbell @ 2011-07-22 13:17 UTC (permalink / raw)
To: netdev, linux-nfs
Cc: Ian Campbell, David S. Miller, Eric Dumazet,
Michał Mirosław
In-Reply-To: <1311340095.12772.57.camel@zakaz.uk.xensource.com>
Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
Cc: "David S. Miller" <davem@davemloft.net>
Cc: Eric Dumazet <eric.dumazet@gmail.com>
Cc: "Michał Mirosław" <mirq-linux@rere.qmqm.pl>
Cc: netdev@vger.kernel.org
---
include/linux/skbuff.h | 4 ++--
net/core/datagram.c | 20 ++++++++------------
net/core/dev.c | 7 +++----
net/core/kmap_skb.h | 2 +-
net/core/pktgen.c | 3 +--
net/core/skbuff.c | 31 +++++++++++++++++--------------
net/core/sock.c | 12 +++++-------
net/core/user_dma.c | 2 +-
8 files changed, 38 insertions(+), 43 deletions(-)
diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h
index f4034af..bc6bd24 100644
--- a/include/linux/skbuff.h
+++ b/include/linux/skbuff.h
@@ -1906,12 +1906,12 @@ static inline int skb_add_data(struct sk_buff *skb,
}
static inline int skb_can_coalesce(struct sk_buff *skb, int i,
- struct page *page, int off)
+ const struct page *page, int off)
{
if (i) {
struct skb_frag_struct *frag = &skb_shinfo(skb)->frags[i - 1];
- return page == frag->page &&
+ return page == skb_frag_page(frag) &&
off == frag->page_offset + frag->size;
}
return 0;
diff --git a/net/core/datagram.c b/net/core/datagram.c
index 18ac112..f0dcaa2 100644
--- a/net/core/datagram.c
+++ b/net/core/datagram.c
@@ -332,14 +332,13 @@ int skb_copy_datagram_iovec(const struct sk_buff *skb, int offset,
int err;
u8 *vaddr;
skb_frag_t *frag = &skb_shinfo(skb)->frags[i];
- struct page *page = frag->page;
if (copy > len)
copy = len;
- vaddr = kmap(page);
+ vaddr = skb_frag_kmap(frag);
err = memcpy_toiovec(to, vaddr + frag->page_offset +
offset - start, copy);
- kunmap(page);
+ skb_frag_kunmap(frag);
if (err)
goto fault;
if (!(len -= copy))
@@ -418,14 +417,13 @@ int skb_copy_datagram_const_iovec(const struct sk_buff *skb, int offset,
int err;
u8 *vaddr;
skb_frag_t *frag = &skb_shinfo(skb)->frags[i];
- struct page *page = frag->page;
if (copy > len)
copy = len;
- vaddr = kmap(page);
+ vaddr = skb_frag_kmap(frag);
err = memcpy_toiovecend(to, vaddr + frag->page_offset +
offset - start, to_offset, copy);
- kunmap(page);
+ skb_frag_kunmap(frag);
if (err)
goto fault;
if (!(len -= copy))
@@ -508,15 +506,14 @@ int skb_copy_datagram_from_iovec(struct sk_buff *skb, int offset,
int err;
u8 *vaddr;
skb_frag_t *frag = &skb_shinfo(skb)->frags[i];
- struct page *page = frag->page;
if (copy > len)
copy = len;
- vaddr = kmap(page);
+ vaddr = skb_frag_kmap(frag);
err = memcpy_fromiovecend(vaddr + frag->page_offset +
offset - start,
from, from_offset, copy);
- kunmap(page);
+ skb_frag_kunmap(frag);
if (err)
goto fault;
@@ -594,16 +591,15 @@ static int skb_copy_and_csum_datagram(const struct sk_buff *skb, int offset,
int err = 0;
u8 *vaddr;
skb_frag_t *frag = &skb_shinfo(skb)->frags[i];
- struct page *page = frag->page;
if (copy > len)
copy = len;
- vaddr = kmap(page);
+ vaddr = skb_frag_kmap(frag);
csum2 = csum_and_copy_to_user(vaddr +
frag->page_offset +
offset - start,
to, copy, 0, &err);
- kunmap(page);
+ skb_frag_kunmap(frag);
if (err)
goto fault;
*csump = csum_block_add(*csump, csum2, pos);
diff --git a/net/core/dev.c b/net/core/dev.c
index 9c58c1e..9ab39c0 100644
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -3414,7 +3414,7 @@ pull:
skb_shinfo(skb)->frags[0].size -= grow;
if (unlikely(!skb_shinfo(skb)->frags[0].size)) {
- put_page(skb_shinfo(skb)->frags[0].page);
+ skb_frag_unref(skb, 0);
memmove(skb_shinfo(skb)->frags,
skb_shinfo(skb)->frags + 1,
--skb_shinfo(skb)->nr_frags * sizeof(skb_frag_t));
@@ -3478,10 +3478,9 @@ void skb_gro_reset_offset(struct sk_buff *skb)
NAPI_GRO_CB(skb)->frag0_len = 0;
if (skb->mac_header == skb->tail &&
- !PageHighMem(skb_shinfo(skb)->frags[0].page)) {
+ !PageHighMem(skb_frag_page(&skb_shinfo(skb)->frags[0]))) {
NAPI_GRO_CB(skb)->frag0 =
- page_address(skb_shinfo(skb)->frags[0].page) +
- skb_shinfo(skb)->frags[0].page_offset;
+ skb_frag_address(&skb_shinfo(skb)->frags[0]);
NAPI_GRO_CB(skb)->frag0_len = skb_shinfo(skb)->frags[0].size;
}
}
diff --git a/net/core/kmap_skb.h b/net/core/kmap_skb.h
index 283c2b9..b1e9711 100644
--- a/net/core/kmap_skb.h
+++ b/net/core/kmap_skb.h
@@ -7,7 +7,7 @@ static inline void *kmap_skb_frag(const skb_frag_t *frag)
local_bh_disable();
#endif
- return kmap_atomic(frag->page, KM_SKB_DATA_SOFTIRQ);
+ return kmap_atomic(__skb_frag_page(frag), KM_SKB_DATA_SOFTIRQ);
}
static inline void kunmap_skb_frag(void *vaddr)
diff --git a/net/core/pktgen.c b/net/core/pktgen.c
index f76079c..989b2b6 100644
--- a/net/core/pktgen.c
+++ b/net/core/pktgen.c
@@ -2600,8 +2600,7 @@ static void pktgen_finalize_skb(struct pktgen_dev *pkt_dev, struct sk_buff *skb,
if (!pkt_dev->page)
break;
}
- skb_shinfo(skb)->frags[i].page = pkt_dev->page;
- get_page(pkt_dev->page);
+ skb_frag_set_page(skb, i, pkt_dev->page);
skb_shinfo(skb)->frags[i].page_offset = 0;
/*last fragment, fill rest of data*/
if (i == (frags - 1))
diff --git a/net/core/skbuff.c b/net/core/skbuff.c
index 46cbd28..2133600 100644
--- a/net/core/skbuff.c
+++ b/net/core/skbuff.c
@@ -326,7 +326,7 @@ static void skb_release_data(struct sk_buff *skb)
if (skb_shinfo(skb)->nr_frags) {
int i;
for (i = 0; i < skb_shinfo(skb)->nr_frags; i++)
- put_page(skb_shinfo(skb)->frags[i].page);
+ skb_frag_unref(skb, i);
}
if (skb_has_frag_list(skb))
@@ -733,7 +733,7 @@ struct sk_buff *pskb_copy(struct sk_buff *skb, gfp_t gfp_mask)
for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) {
skb_shinfo(n)->frags[i] = skb_shinfo(skb)->frags[i];
- get_page(skb_shinfo(n)->frags[i].page);
+ skb_frag_ref(skb, i);
}
skb_shinfo(n)->nr_frags = i;
}
@@ -820,7 +820,7 @@ int pskb_expand_head(struct sk_buff *skb, int nhead, int ntail,
kfree(skb->head);
} else {
for (i = 0; i < skb_shinfo(skb)->nr_frags; i++)
- get_page(skb_shinfo(skb)->frags[i].page);
+ skb_frag_ref(skb, i);
if (skb_has_frag_list(skb))
skb_clone_fraglist(skb);
@@ -1098,7 +1098,7 @@ drop_pages:
skb_shinfo(skb)->nr_frags = i;
for (; i < nfrags; i++)
- put_page(skb_shinfo(skb)->frags[i].page);
+ skb_frag_unref(skb, i);
if (skb_has_frag_list(skb))
skb_drop_fraglist(skb);
@@ -1267,7 +1267,7 @@ pull_pages:
k = 0;
for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) {
if (skb_shinfo(skb)->frags[i].size <= eat) {
- put_page(skb_shinfo(skb)->frags[i].page);
+ skb_frag_unref(skb, i);
eat -= skb_shinfo(skb)->frags[i].size;
} else {
skb_shinfo(skb)->frags[k] = skb_shinfo(skb)->frags[i];
@@ -1512,7 +1512,9 @@ static int __skb_splice_bits(struct sk_buff *skb, struct pipe_inode_info *pipe,
for (seg = 0; seg < skb_shinfo(skb)->nr_frags; seg++) {
const skb_frag_t *f = &skb_shinfo(skb)->frags[seg];
- if (__splice_segment(f->page, f->page_offset, f->size,
+ /* XXX */
+ if (__splice_segment(__skb_frag_page(f),
+ f->page_offset, f->size,
offset, len, skb, spd, 0, sk, pipe))
return 1;
}
@@ -2057,7 +2059,7 @@ static inline void skb_split_no_header(struct sk_buff *skb,
* where splitting is expensive.
* 2. Split is accurately. We make this.
*/
- get_page(skb_shinfo(skb)->frags[i].page);
+ skb_frag_ref(skb, i);
skb_shinfo(skb1)->frags[0].page_offset += len - pos;
skb_shinfo(skb1)->frags[0].size -= len - pos;
skb_shinfo(skb)->frags[i].size = len - pos;
@@ -2132,7 +2134,8 @@ int skb_shift(struct sk_buff *tgt, struct sk_buff *skb, int shiftlen)
* commit all, so that we don't have to undo partial changes
*/
if (!to ||
- !skb_can_coalesce(tgt, to, fragfrom->page, fragfrom->page_offset)) {
+ !skb_can_coalesce(tgt, to, skb_frag_page(fragfrom),
+ fragfrom->page_offset)) {
merge = -1;
} else {
merge = to - 1;
@@ -2179,7 +2182,7 @@ int skb_shift(struct sk_buff *tgt, struct sk_buff *skb, int shiftlen)
to++;
} else {
- get_page(fragfrom->page);
+ __skb_frag_ref(fragfrom);
fragto->page = fragfrom->page;
fragto->page_offset = fragfrom->page_offset;
fragto->size = todo;
@@ -2201,7 +2204,7 @@ int skb_shift(struct sk_buff *tgt, struct sk_buff *skb, int shiftlen)
fragto = &skb_shinfo(tgt)->frags[merge];
fragto->size += fragfrom->size;
- put_page(fragfrom->page);
+ __skb_frag_unref(fragfrom);
}
/* Reposition in the original skb */
@@ -2446,8 +2449,7 @@ int skb_append_datato_frags(struct sock *sk, struct sk_buff *skb,
left = PAGE_SIZE - frag->page_offset;
copy = (length > left)? left : length;
- ret = getfrag(from, (page_address(frag->page) +
- frag->page_offset + frag->size),
+ ret = getfrag(from, skb_frag_address(frag) + frag->size,
offset, copy, 0, skb);
if (ret < 0)
return -EFAULT;
@@ -2599,7 +2601,7 @@ struct sk_buff *skb_segment(struct sk_buff *skb, u32 features)
while (pos < offset + len && i < nfrags) {
*frag = skb_shinfo(skb)->frags[i];
- get_page(frag->page);
+ __skb_frag_ref(frag);
size = frag->size;
if (pos < offset) {
@@ -2822,7 +2824,8 @@ __skb_to_sgvec(struct sk_buff *skb, struct scatterlist *sg, int offset, int len)
if (copy > len)
copy = len;
- sg_set_page(&sg[elt], frag->page, copy,
+ /* XXX */
+ sg_set_page(&sg[elt], __skb_frag_page(frag), copy,
frag->page_offset+offset-start);
elt++;
if (!(len -= copy))
diff --git a/net/core/sock.c b/net/core/sock.c
index 6e81978..0fb2160 100644
--- a/net/core/sock.c
+++ b/net/core/sock.c
@@ -1530,7 +1530,6 @@ struct sk_buff *sock_alloc_send_pskb(struct sock *sk, unsigned long header_len,
skb_shinfo(skb)->nr_frags = npages;
for (i = 0; i < npages; i++) {
struct page *page;
- skb_frag_t *frag;
page = alloc_pages(sk->sk_allocation, 0);
if (!page) {
@@ -1540,12 +1539,11 @@ struct sk_buff *sock_alloc_send_pskb(struct sock *sk, unsigned long header_len,
goto failure;
}
- frag = &skb_shinfo(skb)->frags[i];
- frag->page = page;
- frag->page_offset = 0;
- frag->size = (data_len >= PAGE_SIZE ?
- PAGE_SIZE :
- data_len);
+ __skb_fill_page_desc(skb, i,
+ page, 0,
+ (data_len >= PAGE_SIZE ?
+ PAGE_SIZE :
+ data_len));
data_len -= PAGE_SIZE;
}
diff --git a/net/core/user_dma.c b/net/core/user_dma.c
index 25d717e..d22ec3e 100644
--- a/net/core/user_dma.c
+++ b/net/core/user_dma.c
@@ -78,7 +78,7 @@ int dma_skb_copy_datagram_iovec(struct dma_chan *chan,
copy = end - offset;
if (copy > 0) {
skb_frag_t *frag = &skb_shinfo(skb)->frags[i];
- struct page *page = frag->page;
+ struct page *page = __skb_frag_page(frag); /* XXX */
if (copy > len)
copy = len;
--
1.7.2.5
^ permalink raw reply related
* [PATCH 03/13] net: add APIs for manipulating skb page fragments.
From: Ian Campbell @ 2011-07-22 13:17 UTC (permalink / raw)
To: netdev, linux-nfs
Cc: Ian Campbell, David S. Miller, Eric Dumazet,
Michał Mirosław
In-Reply-To: <1311340095.12772.57.camel@zakaz.uk.xensource.com>
The primary aim is to add skb_frag_(ref|unref) in order to remove the use of
bare get/put_page on SKB pages fragments and to isolate users from subsequent
changes to the skb_frag_t data structure.
The API also includes an accessor for the struct page itself. The default
variant of this returns a *const* struct page in an attempt to catch bare uses
of get/put_page (which take a non-const struct page).
Also included are helper APIs for passing a paged fragment to kmap and
dma_map_page since I was seeing the same pattern a lot. A helper for
pci_map_page is ommitted due to Michał Mirosław's recommendation that users
should transition to pci_map_page instead.
Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
Cc: "David S. Miller" <davem@davemloft.net>
Cc: Eric Dumazet <eric.dumazet@gmail.com>
Cc: "Michał Mirosław" <mirq-linux@rere.qmqm.pl>
Cc: netdev@vger.kernel.org
---
include/linux/skbuff.h | 204 +++++++++++++++++++++++++++++++++++++++++++++++-
1 files changed, 202 insertions(+), 2 deletions(-)
diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h
index c0a4f3a..f4034af 100644
--- a/include/linux/skbuff.h
+++ b/include/linux/skbuff.h
@@ -29,6 +29,8 @@
#include <linux/rcupdate.h>
#include <linux/dmaengine.h>
#include <linux/hrtimer.h>
+#include <linux/highmem.h>
+#include <linux/pci.h>
/* Don't change this without changing skb_csum_unnecessary! */
#define CHECKSUM_NONE 0
@@ -1109,14 +1111,47 @@ static inline int skb_pagelen(const struct sk_buff *skb)
return len + skb_headlen(skb);
}
-static inline void skb_fill_page_desc(struct sk_buff *skb, int i,
- struct page *page, int off, int size)
+/**
+ * __skb_fill_page_desc - initialise a paged fragment in an skb
+ * @skb: buffer containing fragment to be initialised
+ * @i: paged fragment index to initialise
+ * @page: the page to use for this fragment
+ * @off: the offset to the data with @page
+ * @size: the length of the data
+ *
+ * Initialises the @i'th fragment of @skb to point to &size bytes at
+ * offset @off within @page.
+ *
+ * Does not take any additional reference on the fragment.
+ */
+static inline void __skb_fill_page_desc(struct sk_buff *skb, int i,
+ struct page *page, int off, int size)
{
skb_frag_t *frag = &skb_shinfo(skb)->frags[i];
frag->page = page;
frag->page_offset = off;
frag->size = size;
+}
+
+/**
+ * skb_fill_page_desc - initialise a paged fragment in an skb
+ * @skb: buffer containing fragment to be initialised
+ * @i: paged fragment index to initialise
+ * @page: the page to use for this fragment
+ * @off: the offset to the data with @page
+ * @size: the length of the data
+ *
+ * As per __skb_fill_page_desc() -- initialises the @i'th fragment of
+ * @skb to point to &size bytes at offset @off within @page. In
+ * addition updates @skb such that @i is the last fragment.
+ *
+ * Does not take any additional reference on the fragment.
+ */
+static inline void skb_fill_page_desc(struct sk_buff *skb, int i,
+ struct page *page, int off, int size)
+{
+ __skb_fill_page_desc(skb, i, page, off, size);
skb_shinfo(skb)->nr_frags = i + 1;
}
@@ -1605,6 +1640,171 @@ static inline void netdev_free_page(struct net_device *dev, struct page *page)
}
/**
+ * __skb_frag_page - retrieve the page refered to by a paged fragment
+ * @frag: the paged fragment
+ *
+ * Returns the &struct page associated with @frag. Where possible you
+ * should use skb_frag_page() which returns a const &struct page.
+ */
+static inline struct page *__skb_frag_page(const skb_frag_t *frag)
+{
+ return frag->page;
+}
+
+/**
+ * __skb_frag_page - retrieve the page refered to by a paged fragment
+ * @frag: the paged fragment
+ *
+ * Returns the &struct page associated with @frag as a const.
+ */
+static inline const struct page *skb_frag_page(const skb_frag_t *frag)
+{
+ return frag->page;
+}
+
+/**
+ * __skb_frag_ref - take an addition reference on a paged fragment.
+ * @frag: the paged fragment
+ *
+ * Takes an additional reference on the paged fragment @frag.
+ */
+static inline void __skb_frag_ref(skb_frag_t *frag)
+{
+ get_page(__skb_frag_page(frag));
+}
+
+/**
+ * skb_frag_ref - take an addition reference on a paged fragment of an skb.
+ * @skb: the buffer
+ * @f: the fragment offset.
+ *
+ * Takes an additional reference on the @f'th paged fragment of @skb.
+ */
+static inline void skb_frag_ref(struct sk_buff *skb, int f)
+{
+ __skb_frag_ref(&skb_shinfo(skb)->frags[f]);
+}
+
+/**
+ * __skb_frag_unref - release a reference on a paged fragment.
+ * @frag: the paged fragment
+ *
+ * Releases a reference on the paged fragment @frag.
+ */
+static inline void __skb_frag_unref(skb_frag_t *frag)
+{
+ put_page(__skb_frag_page(frag));
+}
+
+/**
+ * skb_frag_unref - release a reference on a paged fragment of an skb.
+ * @skb: the buffer
+ * @f: the fragment offset
+ *
+ * Releases a reference on the @f'th paged fragment of @skb.
+ */
+static inline void skb_frag_unref(struct sk_buff *skb, int f)
+{
+ __skb_frag_unref(&skb_shinfo(skb)->frags[f]);
+}
+
+/**
+ * skb_frag_address - gets the address of the data contained in a paged fragment
+ * @frag: the paged fragment buffer
+ *
+ * Returns the address of the data within @frag. The page must already
+ * be mapped.
+ */
+static inline void *skb_frag_address(const skb_frag_t *frag)
+{
+ return page_address(skb_frag_page(frag)) + frag->page_offset;
+}
+
+/**
+ * skb_frag_address_safe - gets the address of the data contained in a paged fragment
+ * @frag: the paged fragment buffer
+ *
+ * Returns the address of the data within @frag. Checks that the page
+ * is mapped and returns %NULL otherwise.
+ */
+static inline void *skb_frag_address_safe(const skb_frag_t *frag)
+{
+ void *ptr = page_address(skb_frag_page(frag));
+ if (unlikely(!ptr))
+ return NULL;
+
+ return ptr + frag->page_offset;
+}
+
+/**
+ * __skb_frag_set_page - sets the page contained in a paged fragment
+ * @frag: the paged fragment
+ * @page: the page to set
+ *
+ * Sets the fragment @frag to contain @page.
+ */
+static inline void __skb_frag_set_page(skb_frag_t *frag, struct page *page)
+{
+ frag->page = page;
+ __skb_frag_ref(frag);
+}
+
+/**
+ * skb_frag_set_page - sets the page contained in a paged fragment of an skb
+ * @skb: the buffer
+ * @f: the fragment offset
+ * @page: the page to set
+ *
+ * Sets the @f'th fragment of @skb to contain @page.
+ */
+static inline void skb_frag_set_page(struct sk_buff *skb, int f,
+ struct page *page)
+{
+ __skb_frag_set_page(&skb_shinfo(skb)->frags[f], page);
+}
+
+/**
+ * skb_frag_kmap - kmaps a paged fragment
+ * @frag: the paged fragment
+ *
+ * kmap()s the paged fragment @frag and returns the virtual address.
+ */
+static inline void *skb_frag_kmap(skb_frag_t *frag)
+{
+ return kmap(__skb_frag_page(frag));
+}
+
+/**
+ * skb_frag_kmap - kunmaps a paged fragment
+ * @frag: the paged fragment
+ *
+ * kunmap()s the paged fragment @frag.
+ */
+static inline void skb_frag_kunmap(skb_frag_t *frag)
+{
+ kunmap(__skb_frag_page(frag));
+}
+
+/**
+ * skb_frag_dma_map - maps a paged fragment via the DMA API
+ * @device: the device to map the fragment to
+ * @frag: the paged fragment to map
+ * @offset: the offset within the fragment (starting at the fragments own offset)
+ * @size: the number of bytes to map
+ * @direction: the direction of the mapping (%PCI_DMA_*)
+ *
+ * Maps the page associated with @frag to @device.
+ */
+static inline dma_addr_t skb_frag_dma_map(struct device *dev,
+ const skb_frag_t *frag,
+ size_t offset, size_t size,
+ enum dma_data_direction dir)
+{
+ return dma_map_page(dev, __skb_frag_page(frag),
+ frag->page_offset + offset, size, dir);
+}
+
+/**
* skb_clone_writable - is the header of a clone writable
* @skb: buffer to check
* @len: length up to which to write
--
1.7.2.5
^ permalink raw reply related
page: next (older) | prev (newer) | latest
- recent:[subjects (threaded)|topics (new)|topics (active)]
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox