Netdev List
 help / color / mirror / Atom feed
* [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


This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox