* [PATCH net-next 03/13] driver: atm: remove unnecessary skb NULL check before calling dev_kfree_skb_irq
From: Govindarajulu Varadarajan @ 2013-11-02 13:47 UTC (permalink / raw)
To: davem, gregkh, linux-usb, linux-kernel, schwidefsky, linville,
linux-wireless, netdev, IvDoorn, sbhatewara, samuel, chas, roland,
isdn, jcliburn, benve, ssujith, jeffrey.t.kirsher,
jesse.brandeburg, shahed.shaikh, joe, apw
Cc: Govindarajulu Varadarajan
In-Reply-To: <1383400074-30555-1-git-send-email-govindarajulu90@gmail.com>
dev_kfree_skb_irq is protected from NULL. No need to check for NULL while
calling this function.
Signed-off-by: Govindarajulu Varadarajan <govindarajulu90@gmail.com>
---
drivers/atm/eni.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/atm/eni.c b/drivers/atm/eni.c
index b1955ba..78a4445 100644
--- a/drivers/atm/eni.c
+++ b/drivers/atm/eni.c
@@ -481,7 +481,7 @@ trouble:
if (paddr)
pci_unmap_single(eni_dev->pci_dev,paddr,skb->len,
PCI_DMA_FROMDEVICE);
- if (skb) dev_kfree_skb_irq(skb);
+ dev_kfree_skb_irq(skb);
return -1;
}
--
1.8.4.2
^ permalink raw reply related
* [PATCH net-next 04/13] driver: staging: remove unnecessary skb NULL check before calling dev_kfree_skb_irq
From: Govindarajulu Varadarajan @ 2013-11-02 13:47 UTC (permalink / raw)
To: davem, gregkh, linux-usb, linux-kernel, schwidefsky, linville,
linux-wireless, netdev, IvDoorn, sbhatewara, samuel, chas, roland,
isdn, jcliburn, benve, ssujith, jeffrey.t.kirsher,
jesse.brandeburg, shahed.shaikh, joe, apw
Cc: Govindarajulu Varadarajan
In-Reply-To: <1383400074-30555-1-git-send-email-govindarajulu90@gmail.com>
dev_kfree_skb_irq is protected from NULL. No need to check for NULL while
calling this function.
Signed-off-by: Govindarajulu Varadarajan <govindarajulu90@gmail.com>
---
drivers/staging/slicoss/slicoss.c | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/drivers/staging/slicoss/slicoss.c b/drivers/staging/slicoss/slicoss.c
index 869dcd3..1073880 100644
--- a/drivers/staging/slicoss/slicoss.c
+++ b/drivers/staging/slicoss/slicoss.c
@@ -2616,8 +2616,7 @@ static void slic_xmit_complete(struct adapter *adapter)
address;
/* hcmd = (struct slic_hostcmd *) rspbuf->hosthandle; */
if (hcmd->type == SLIC_CMD_DUMB) {
- if (hcmd->skb)
- dev_kfree_skb_irq(hcmd->skb);
+ dev_kfree_skb_irq(hcmd->skb);
slic_cmdq_putdone_irq(adapter, hcmd);
}
rspbuf->status = 0;
--
1.8.4.2
^ permalink raw reply related
* [PATCH net-next 05/13] driver: usb/gadget: remove unnecessary skb NULL check before calling dev_kfree_skb_irq
From: Govindarajulu Varadarajan @ 2013-11-02 13:47 UTC (permalink / raw)
To: davem, gregkh, linux-usb, linux-kernel, schwidefsky, linville,
linux-wireless, netdev, IvDoorn, sbhatewara, samuel, chas, roland,
isdn, jcliburn, benve, ssujith, jeffrey.t.kirsher,
jesse.brandeburg, shahed.shaikh, joe, apw
Cc: Govindarajulu Varadarajan
In-Reply-To: <1383400074-30555-1-git-send-email-govindarajulu90@gmail.com>
dev_kfree_skb_irq is protected from NULL. No need to check for NULL
while calling this function.
Signed-off-by: Govindarajulu Varadarajan <govindarajulu90@gmail.com>
---
drivers/usb/gadget/f_phonet.c | 6 ++----
1 file changed, 2 insertions(+), 4 deletions(-)
diff --git a/drivers/usb/gadget/f_phonet.c b/drivers/usb/gadget/f_phonet.c
index eb3aa81..9e220b6 100644
--- a/drivers/usb/gadget/f_phonet.c
+++ b/drivers/usb/gadget/f_phonet.c
@@ -393,10 +393,8 @@ static void __pn_reset(struct usb_function *f)
usb_ep_disable(fp->out_ep);
usb_ep_disable(fp->in_ep);
- if (fp->rx.skb) {
- dev_kfree_skb_irq(fp->rx.skb);
- fp->rx.skb = NULL;
- }
+ dev_kfree_skb_irq(fp->rx.skb);
+ fp->rx.skb = NULL;
}
static int pn_set_alt(struct usb_function *f, unsigned intf, unsigned alt)
--
1.8.4.2
^ permalink raw reply related
* [PATCH net-next 06/13] driver: net: remove unnecessary NULL check before dev_kfree_skb_any
From: Govindarajulu Varadarajan @ 2013-11-02 13:47 UTC (permalink / raw)
To: davem, gregkh, linux-usb, linux-kernel, schwidefsky, linville,
linux-wireless, netdev, IvDoorn, sbhatewara, samuel, chas, roland,
isdn, jcliburn, benve, ssujith, jeffrey.t.kirsher,
jesse.brandeburg, shahed.shaikh, joe, apw
Cc: Govindarajulu Varadarajan
In-Reply-To: <1383400074-30555-1-git-send-email-govindarajulu90@gmail.com>
dev_kfree_skb_any is protected from NULL. No need to check for NULL
while calling this function.
Signed-off-by: Govindarajulu Varadarajan <govindarajulu90@gmail.com>
---
drivers/net/ethernet/amd/lance.c | 9 +++------
drivers/net/ethernet/atheros/alx/main.c | 6 ++----
drivers/net/ethernet/atheros/atl1e/atl1e_main.c | 6 ++----
drivers/net/ethernet/atheros/atlx/atl1.c | 6 ++----
drivers/net/ethernet/cisco/enic/enic_main.c | 3 +--
drivers/net/ethernet/freescale/fec_main.c | 6 ++----
drivers/net/ethernet/hp/hp100.c | 3 +--
drivers/net/ethernet/intel/e1000/e1000_main.c | 6 ++----
drivers/net/ethernet/intel/e1000e/netdev.c | 12 ++++--------
drivers/net/ethernet/intel/igb/igb_ptp.c | 6 ++----
drivers/net/ethernet/intel/igbvf/netdev.c | 6 ++----
drivers/net/ethernet/intel/ixgb/ixgb_main.c | 6 ++----
drivers/net/ethernet/intel/ixgbe/ixgbe_ptp.c | 6 ++----
drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c | 6 ++----
drivers/net/ethernet/korina.c | 12 ++++--------
drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_main.c | 12 ++++--------
drivers/net/ethernet/qlogic/netxen/netxen_nic_init.c | 9 +++------
drivers/net/ethernet/qlogic/qlcnic/qlcnic_init.c | 6 ++----
drivers/net/ethernet/seeq/sgiseeq.c | 6 ++----
drivers/net/ethernet/sgi/ioc3-eth.c | 9 +++------
drivers/net/ethernet/smsc/smsc9420.c | 3 +--
drivers/net/ethernet/sun/sunbmac.c | 12 ++++--------
drivers/net/ethernet/ti/cpmac.c | 6 ++----
drivers/net/hyperv/netvsc_drv.c | 3 +--
drivers/net/irda/vlsi_ir.c | 15 +++++----------
drivers/net/usb/cdc_mbim.c | 3 +--
drivers/net/usb/cdc_ncm.c | 15 +++++----------
drivers/net/usb/lg-vl600.c | 6 ++----
drivers/net/usb/usbnet.c | 3 +--
drivers/net/vmxnet3/vmxnet3_drv.c | 6 ++----
drivers/net/wireless/ath/ath10k/mac.c | 6 ++----
drivers/net/wireless/ath/ath9k/htc_drv_txrx.c | 3 +--
drivers/net/wireless/ath/ath9k/main.c | 6 ++----
drivers/net/wireless/ath/ath9k/recv.c | 6 ++----
drivers/net/wireless/ath/wil6210/txrx.c | 6 ++----
drivers/net/wireless/b43/main.c | 9 +++------
drivers/net/wireless/b43legacy/main.c | 9 +++------
drivers/net/wireless/brcm80211/brcmfmac/dhd_linux.c | 3 +--
drivers/net/wireless/brcm80211/brcmsmac/main.c | 12 ++++--------
drivers/net/wireless/ipw2x00/ipw2200.c | 6 ++----
drivers/net/wireless/ipw2x00/libipw_rx.c | 3 +--
drivers/net/wireless/ipw2x00/libipw_tx.c | 3 +--
drivers/net/wireless/mwifiex/init.c | 3 +--
43 files changed, 96 insertions(+), 192 deletions(-)
diff --git a/drivers/net/ethernet/amd/lance.c b/drivers/net/ethernet/amd/lance.c
index 256f590..4b8fc50 100644
--- a/drivers/net/ethernet/amd/lance.c
+++ b/drivers/net/ethernet/amd/lance.c
@@ -845,14 +845,11 @@ lance_purge_ring(struct net_device *dev)
struct sk_buff *skb = lp->rx_skbuff[i];
lp->rx_skbuff[i] = NULL;
lp->rx_ring[i].base = 0; /* Not owned by LANCE chip. */
- if (skb)
- dev_kfree_skb_any(skb);
+ dev_kfree_skb_any(skb);
}
for (i = 0; i < TX_RING_SIZE; i++) {
- if (lp->tx_skbuff[i]) {
- dev_kfree_skb_any(lp->tx_skbuff[i]);
- lp->tx_skbuff[i] = NULL;
- }
+ dev_kfree_skb_any(lp->tx_skbuff[i]);
+ lp->tx_skbuff[i] = NULL;
}
}
diff --git a/drivers/net/ethernet/atheros/alx/main.c b/drivers/net/ethernet/atheros/alx/main.c
index 5aa5e81..2bee48b 100644
--- a/drivers/net/ethernet/atheros/alx/main.c
+++ b/drivers/net/ethernet/atheros/alx/main.c
@@ -64,10 +64,8 @@ static void alx_free_txbuf(struct alx_priv *alx, int entry)
dma_unmap_len_set(txb, size, 0);
}
- if (txb->skb) {
- dev_kfree_skb_any(txb->skb);
- txb->skb = NULL;
- }
+ dev_kfree_skb_any(txb->skb);
+ txb->skb = NULL;
}
static int alx_refill_rx_ring(struct alx_priv *alx, gfp_t gfp)
diff --git a/drivers/net/ethernet/atheros/atl1e/atl1e_main.c b/drivers/net/ethernet/atheros/atl1e/atl1e_main.c
index c3ca8c6..b420ead 100644
--- a/drivers/net/ethernet/atheros/atl1e/atl1e_main.c
+++ b/drivers/net/ethernet/atheros/atl1e/atl1e_main.c
@@ -686,10 +686,8 @@ static void atl1e_clean_tx_ring(struct atl1e_adapter *adapter)
/* second free skb */
for (index = 0; index < ring_count; index++) {
tx_buffer = &tx_ring->tx_buffer[index];
- if (tx_buffer->skb) {
- dev_kfree_skb_any(tx_buffer->skb);
- tx_buffer->skb = NULL;
- }
+ dev_kfree_skb_any(tx_buffer->skb);
+ tx_buffer->skb = NULL;
}
/* Zero out Tx-buffers */
memset(tx_ring->desc, 0, sizeof(struct atl1e_tpd_desc) *
diff --git a/drivers/net/ethernet/atheros/atlx/atl1.c b/drivers/net/ethernet/atheros/atlx/atl1.c
index b8cc654..5fd7212 100644
--- a/drivers/net/ethernet/atheros/atlx/atl1.c
+++ b/drivers/net/ethernet/atheros/atlx/atl1.c
@@ -1205,10 +1205,8 @@ static void atl1_clean_tx_ring(struct atl1_adapter *adapter)
for (i = 0; i < tpd_ring->count; i++) {
buffer_info = &tpd_ring->buffer_info[i];
- if (buffer_info->skb) {
- dev_kfree_skb_any(buffer_info->skb);
- buffer_info->skb = NULL;
- }
+ dev_kfree_skb_any(buffer_info->skb);
+ buffer_info->skb = NULL;
}
size = sizeof(struct atl1_buffer) * tpd_ring->count;
diff --git a/drivers/net/ethernet/cisco/enic/enic_main.c b/drivers/net/ethernet/cisco/enic/enic_main.c
index ff78dfa..b436a92 100644
--- a/drivers/net/ethernet/cisco/enic/enic_main.c
+++ b/drivers/net/ethernet/cisco/enic/enic_main.c
@@ -107,8 +107,7 @@ static void enic_free_wq_buf(struct vnic_wq *wq, struct vnic_wq_buf *buf)
pci_unmap_page(enic->pdev, buf->dma_addr,
buf->len, PCI_DMA_TODEVICE);
- if (buf->os_buf)
- dev_kfree_skb_any(buf->os_buf);
+ dev_kfree_skb_any(buf->os_buf);
}
static void enic_wq_free_buf(struct vnic_wq *wq,
diff --git a/drivers/net/ethernet/freescale/fec_main.c b/drivers/net/ethernet/freescale/fec_main.c
index b2793b9..9c6a8a6 100644
--- a/drivers/net/ethernet/freescale/fec_main.c
+++ b/drivers/net/ethernet/freescale/fec_main.c
@@ -548,10 +548,8 @@ fec_restart(struct net_device *ndev, int duplex)
for (i = 0; i <= TX_RING_MOD_MASK; i++) {
- if (fep->tx_skbuff[i]) {
- dev_kfree_skb_any(fep->tx_skbuff[i]);
- fep->tx_skbuff[i] = NULL;
- }
+ dev_kfree_skb_any(fep->tx_skbuff[i]);
+ fep->tx_skbuff[i] = NULL;
}
/* Enable MII mode */
diff --git a/drivers/net/ethernet/hp/hp100.c b/drivers/net/ethernet/hp/hp100.c
index 3786009..240d3adb 100644
--- a/drivers/net/ethernet/hp/hp100.c
+++ b/drivers/net/ethernet/hp/hp100.c
@@ -1952,8 +1952,7 @@ static void hp100_rx_bm(struct net_device *dev)
#ifdef HP100_DEBUG
printk("hp100: %s: rx_bm: Received bad packet (length=%d)\n", dev->name, pkt_len);
#endif
- if (ptr->skb != NULL)
- dev_kfree_skb_any(ptr->skb);
+ dev_kfree_skb_any(ptr->skb);
dev->stats.rx_errors++;
}
diff --git a/drivers/net/ethernet/intel/e1000/e1000_main.c b/drivers/net/ethernet/intel/e1000/e1000_main.c
index ad6800a..890dcba 100644
--- a/drivers/net/ethernet/intel/e1000/e1000_main.c
+++ b/drivers/net/ethernet/intel/e1000/e1000_main.c
@@ -1968,10 +1968,8 @@ static void e1000_unmap_and_free_tx_resource(struct e1000_adapter *adapter,
DMA_TO_DEVICE);
buffer_info->dma = 0;
}
- if (buffer_info->skb) {
- dev_kfree_skb_any(buffer_info->skb);
- buffer_info->skb = NULL;
- }
+ dev_kfree_skb_any(buffer_info->skb);
+ buffer_info->skb = NULL;
buffer_info->time_stamp = 0;
/* buffer_info must be completely set up in the transmit path */
}
diff --git a/drivers/net/ethernet/intel/e1000e/netdev.c b/drivers/net/ethernet/intel/e1000e/netdev.c
index 4c22a1a..a562f54 100644
--- a/drivers/net/ethernet/intel/e1000e/netdev.c
+++ b/drivers/net/ethernet/intel/e1000e/netdev.c
@@ -1057,10 +1057,8 @@ static void e1000_put_txbuf(struct e1000_ring *tx_ring,
buffer_info->length, DMA_TO_DEVICE);
buffer_info->dma = 0;
}
- if (buffer_info->skb) {
- dev_kfree_skb_any(buffer_info->skb);
- buffer_info->skb = NULL;
- }
+ dev_kfree_skb_any(buffer_info->skb);
+ buffer_info->skb = NULL;
buffer_info->time_stamp = 0;
}
@@ -6893,10 +6891,8 @@ static void e1000_remove(struct pci_dev *pdev)
if (adapter->flags & FLAG_HAS_HW_TIMESTAMP) {
cancel_work_sync(&adapter->tx_hwtstamp_work);
- if (adapter->tx_hwtstamp_skb) {
- dev_kfree_skb_any(adapter->tx_hwtstamp_skb);
- adapter->tx_hwtstamp_skb = NULL;
- }
+ dev_kfree_skb_any(adapter->tx_hwtstamp_skb);
+ adapter->tx_hwtstamp_skb = NULL;
}
if (!(netdev->flags & IFF_UP))
diff --git a/drivers/net/ethernet/intel/igb/igb_ptp.c b/drivers/net/ethernet/intel/igb/igb_ptp.c
index 5a54e3d..ed8b232 100644
--- a/drivers/net/ethernet/intel/igb/igb_ptp.c
+++ b/drivers/net/ethernet/intel/igb/igb_ptp.c
@@ -838,10 +838,8 @@ void igb_ptp_stop(struct igb_adapter *adapter)
}
cancel_work_sync(&adapter->ptp_tx_work);
- if (adapter->ptp_tx_skb) {
- dev_kfree_skb_any(adapter->ptp_tx_skb);
- adapter->ptp_tx_skb = NULL;
- }
+ dev_kfree_skb_any(adapter->ptp_tx_skb);
+ adapter->ptp_tx_skb = NULL;
if (adapter->ptp_clock) {
ptp_clock_unregister(adapter->ptp_clock);
diff --git a/drivers/net/ethernet/intel/igbvf/netdev.c b/drivers/net/ethernet/intel/igbvf/netdev.c
index 9fadbb2..1220dd1 100644
--- a/drivers/net/ethernet/intel/igbvf/netdev.c
+++ b/drivers/net/ethernet/intel/igbvf/netdev.c
@@ -417,10 +417,8 @@ static void igbvf_put_txbuf(struct igbvf_adapter *adapter,
DMA_TO_DEVICE);
buffer_info->dma = 0;
}
- if (buffer_info->skb) {
- dev_kfree_skb_any(buffer_info->skb);
- buffer_info->skb = NULL;
- }
+ dev_kfree_skb_any(buffer_info->skb);
+ buffer_info->skb = NULL;
buffer_info->time_stamp = 0;
}
diff --git a/drivers/net/ethernet/intel/ixgb/ixgb_main.c b/drivers/net/ethernet/intel/ixgb/ixgb_main.c
index 9f6b236..468b7c6 100644
--- a/drivers/net/ethernet/intel/ixgb/ixgb_main.c
+++ b/drivers/net/ethernet/intel/ixgb/ixgb_main.c
@@ -941,10 +941,8 @@ ixgb_unmap_and_free_tx_resource(struct ixgb_adapter *adapter,
buffer_info->dma = 0;
}
- if (buffer_info->skb) {
- dev_kfree_skb_any(buffer_info->skb);
- buffer_info->skb = NULL;
- }
+ dev_kfree_skb_any(buffer_info->skb);
+ buffer_info->skb = NULL;
buffer_info->time_stamp = 0;
/* these fields must always be initialized in tx
* buffer_info->length = 0;
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_ptp.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_ptp.c
index 5184e2a..cf4648a 100644
--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_ptp.c
+++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_ptp.c
@@ -908,10 +908,8 @@ void ixgbe_ptp_stop(struct ixgbe_adapter *adapter)
ixgbe_ptp_setup_sdp(adapter);
cancel_work_sync(&adapter->ptp_tx_work);
- if (adapter->ptp_tx_skb) {
- dev_kfree_skb_any(adapter->ptp_tx_skb);
- adapter->ptp_tx_skb = NULL;
- }
+ dev_kfree_skb_any(adapter->ptp_tx_skb);
+ adapter->ptp_tx_skb = NULL;
if (adapter->ptp_clock) {
ptp_clock_unregister(adapter->ptp_clock);
diff --git a/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c b/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c
index 038bfc8..8d0fb73 100644
--- a/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c
+++ b/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c
@@ -159,10 +159,8 @@ static void ixgbevf_unmap_and_free_tx_resource(struct ixgbevf_ring *tx_ring,
DMA_TO_DEVICE);
tx_buffer_info->dma = 0;
}
- if (tx_buffer_info->skb) {
- dev_kfree_skb_any(tx_buffer_info->skb);
- tx_buffer_info->skb = NULL;
- }
+ dev_kfree_skb_any(tx_buffer_info->skb);
+ tx_buffer_info->skb = NULL;
tx_buffer_info->time_stamp = 0;
/* tx_buffer_info must be completely set up in the transmit path */
}
diff --git a/drivers/net/ethernet/korina.c b/drivers/net/ethernet/korina.c
index 4a5e3b0..5efb977 100644
--- a/drivers/net/ethernet/korina.c
+++ b/drivers/net/ethernet/korina.c
@@ -572,10 +572,8 @@ static void korina_tx(struct net_device *dev)
}
/* We must always free the original skb */
- if (lp->tx_skb[lp->tx_next_done]) {
- dev_kfree_skb_any(lp->tx_skb[lp->tx_next_done]);
- lp->tx_skb[lp->tx_next_done] = NULL;
- }
+ dev_kfree_skb_any(lp->tx_skb[lp->tx_next_done]);
+ lp->tx_skb[lp->tx_next_done] = NULL;
lp->td_ring[lp->tx_next_done].control = DMA_DESC_IOF;
lp->td_ring[lp->tx_next_done].devcs = ETH_TX_FD | ETH_TX_LD;
@@ -785,15 +783,13 @@ static void korina_free_ring(struct net_device *dev)
for (i = 0; i < KORINA_NUM_RDS; i++) {
lp->rd_ring[i].control = 0;
- if (lp->rx_skb[i])
- dev_kfree_skb_any(lp->rx_skb[i]);
+ dev_kfree_skb_any(lp->rx_skb[i]);
lp->rx_skb[i] = NULL;
}
for (i = 0; i < KORINA_NUM_TDS; i++) {
lp->td_ring[i].control = 0;
- if (lp->tx_skb[i])
- dev_kfree_skb_any(lp->tx_skb[i]);
+ dev_kfree_skb_any(lp->tx_skb[i]);
lp->tx_skb[i] = NULL;
}
}
diff --git a/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_main.c b/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_main.c
index 5a0f04c..5ed4b92 100644
--- a/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_main.c
+++ b/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_main.c
@@ -953,10 +953,8 @@ static void pch_gbe_unmap_and_free_tx_resource(
buffer_info->length, DMA_TO_DEVICE);
buffer_info->mapped = false;
}
- if (buffer_info->skb) {
- dev_kfree_skb_any(buffer_info->skb);
- buffer_info->skb = NULL;
- }
+ dev_kfree_skb_any(buffer_info->skb);
+ buffer_info->skb = NULL;
}
/**
@@ -973,10 +971,8 @@ static void pch_gbe_unmap_and_free_rx_resource(
buffer_info->length, DMA_FROM_DEVICE);
buffer_info->mapped = false;
}
- if (buffer_info->skb) {
- dev_kfree_skb_any(buffer_info->skb);
- buffer_info->skb = NULL;
- }
+ dev_kfree_skb_any(buffer_info->skb);
+ buffer_info->skb = NULL;
}
/**
diff --git a/drivers/net/ethernet/qlogic/netxen/netxen_nic_init.c b/drivers/net/ethernet/qlogic/netxen/netxen_nic_init.c
index 7692dfd..e9710c0 100644
--- a/drivers/net/ethernet/qlogic/netxen/netxen_nic_init.c
+++ b/drivers/net/ethernet/qlogic/netxen/netxen_nic_init.c
@@ -124,8 +124,7 @@ void netxen_release_rx_buffers(struct netxen_adapter *adapter)
rx_buf->dma,
rds_ring->dma_size,
PCI_DMA_FROMDEVICE);
- if (rx_buf->skb != NULL)
- dev_kfree_skb_any(rx_buf->skb);
+ dev_kfree_skb_any(rx_buf->skb);
}
}
}
@@ -154,10 +153,8 @@ void netxen_release_tx_buffers(struct netxen_adapter *adapter)
buffrag->dma = 0ULL;
}
}
- if (cmd_buf->skb) {
- dev_kfree_skb_any(cmd_buf->skb);
- cmd_buf->skb = NULL;
- }
+ dev_kfree_skb_any(cmd_buf->skb);
+ cmd_buf->skb = NULL;
cmd_buf++;
}
}
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_init.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_init.c
index 66c26cf..d2c23f5 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_init.c
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_init.c
@@ -151,10 +151,8 @@ void qlcnic_release_tx_buffers(struct qlcnic_adapter *adapter,
buffrag->dma = 0ULL;
}
}
- if (cmd_buf->skb) {
- dev_kfree_skb_any(cmd_buf->skb);
- cmd_buf->skb = NULL;
- }
+ dev_kfree_skb_any(cmd_buf->skb);
+ cmd_buf->skb = NULL;
cmd_buf++;
}
}
diff --git a/drivers/net/ethernet/seeq/sgiseeq.c b/drivers/net/ethernet/seeq/sgiseeq.c
index c765718..a49ce76 100644
--- a/drivers/net/ethernet/seeq/sgiseeq.c
+++ b/drivers/net/ethernet/seeq/sgiseeq.c
@@ -486,10 +486,8 @@ static inline void sgiseeq_tx(struct net_device *dev, struct sgiseeq_private *sp
sp->tx_old = NEXT_TX(sp->tx_old);
td->tdma.cntinfo &= ~(HPCDMA_XIU | HPCDMA_XIE);
td->tdma.cntinfo |= HPCDMA_EOX;
- if (td->skb) {
- dev_kfree_skb_any(td->skb);
- td->skb = NULL;
- }
+ dev_kfree_skb_any(td->skb);
+ td->skb = NULL;
dma_sync_desc_dev(dev, td);
}
}
diff --git a/drivers/net/ethernet/sgi/ioc3-eth.c b/drivers/net/ethernet/sgi/ioc3-eth.c
index ffa7843..6bd90f2 100644
--- a/drivers/net/ethernet/sgi/ioc3-eth.c
+++ b/drivers/net/ethernet/sgi/ioc3-eth.c
@@ -856,10 +856,8 @@ static inline void ioc3_clean_tx_ring(struct ioc3_private *ip)
for (i=0; i < 128; i++) {
skb = ip->tx_skbs[i];
- if (skb) {
- ip->tx_skbs[i] = NULL;
- dev_kfree_skb_any(skb);
- }
+ ip->tx_skbs[i] = NULL;
+ dev_kfree_skb_any(skb);
ip->txr[i].cmd = 0;
}
ip->tx_pi = 0;
@@ -883,8 +881,7 @@ static void ioc3_free_rings(struct ioc3_private *ip)
while (n_entry != rx_entry) {
skb = ip->rx_skbs[n_entry];
- if (skb)
- dev_kfree_skb_any(skb);
+ dev_kfree_skb_any(skb);
n_entry = (n_entry + 1) & 511;
}
diff --git a/drivers/net/ethernet/smsc/smsc9420.c b/drivers/net/ethernet/smsc/smsc9420.c
index 059bcaf..e45d7c7 100644
--- a/drivers/net/ethernet/smsc/smsc9420.c
+++ b/drivers/net/ethernet/smsc/smsc9420.c
@@ -595,8 +595,7 @@ static void smsc9420_free_rx_ring(struct smsc9420_pdata *pd)
return;
for (i = 0; i < RX_RING_SIZE; i++) {
- if (pd->rx_buffers[i].skb)
- dev_kfree_skb_any(pd->rx_buffers[i].skb);
+ dev_kfree_skb_any(pd->rx_buffers[i].skb);
if (pd->rx_buffers[i].mapping)
pci_unmap_single(pd->pdev, pd->rx_buffers[i].mapping,
diff --git a/drivers/net/ethernet/sun/sunbmac.c b/drivers/net/ethernet/sun/sunbmac.c
index 7217ee5..50eb0f1 100644
--- a/drivers/net/ethernet/sun/sunbmac.c
+++ b/drivers/net/ethernet/sun/sunbmac.c
@@ -195,17 +195,13 @@ static void bigmac_clean_rings(struct bigmac *bp)
int i;
for (i = 0; i < RX_RING_SIZE; i++) {
- if (bp->rx_skbs[i] != NULL) {
- dev_kfree_skb_any(bp->rx_skbs[i]);
- bp->rx_skbs[i] = NULL;
- }
+ dev_kfree_skb_any(bp->rx_skbs[i]);
+ bp->rx_skbs[i] = NULL;
}
for (i = 0; i < TX_RING_SIZE; i++) {
- if (bp->tx_skbs[i] != NULL) {
- dev_kfree_skb_any(bp->tx_skbs[i]);
- bp->tx_skbs[i] = NULL;
- }
+ dev_kfree_skb_any(bp->tx_skbs[i]);
+ bp->tx_skbs[i] = NULL;
}
}
diff --git a/drivers/net/ethernet/ti/cpmac.c b/drivers/net/ethernet/ti/cpmac.c
index 2dc16b6..ba340a8 100644
--- a/drivers/net/ethernet/ti/cpmac.c
+++ b/drivers/net/ethernet/ti/cpmac.c
@@ -728,10 +728,8 @@ static void cpmac_clear_tx(struct net_device *dev)
return;
for (i = 0; i < CPMAC_QUEUES; i++) {
priv->desc_ring[i].dataflags = 0;
- if (priv->desc_ring[i].skb) {
- dev_kfree_skb_any(priv->desc_ring[i].skb);
- priv->desc_ring[i].skb = NULL;
- }
+ dev_kfree_skb_any(priv->desc_ring[i].skb);
+ priv->desc_ring[i].skb = NULL;
}
}
diff --git a/drivers/net/hyperv/netvsc_drv.c b/drivers/net/hyperv/netvsc_drv.c
index 524f713..b051c45 100644
--- a/drivers/net/hyperv/netvsc_drv.c
+++ b/drivers/net/hyperv/netvsc_drv.c
@@ -128,8 +128,7 @@ static void netvsc_xmit_completion(void *context)
kfree(packet);
- if (skb)
- dev_kfree_skb_any(skb);
+ dev_kfree_skb_any(skb);
}
static int netvsc_start_xmit(struct sk_buff *skb, struct net_device *net)
diff --git a/drivers/net/irda/vlsi_ir.c b/drivers/net/irda/vlsi_ir.c
index c5bd58b..49882f7 100644
--- a/drivers/net/irda/vlsi_ir.c
+++ b/drivers/net/irda/vlsi_ir.c
@@ -467,8 +467,7 @@ static int vlsi_free_ring(struct vlsi_ring *r)
for (i = 0; i < r->size; i++) {
rd = r->rd + i;
- if (rd->skb)
- dev_kfree_skb_any(rd->skb);
+ dev_kfree_skb_any(rd->skb);
busaddr = rd_get_addr(rd);
rd_set_addr_status(rd, 0, 0);
if (busaddr)
@@ -703,10 +702,8 @@ static void vlsi_unarm_rx(vlsi_irda_dev_t *idev)
}
rd_set_count(rd, 0);
pci_dma_sync_single_for_cpu(r->pdev, rd_get_addr(rd), r->len, r->dir);
- if (rd->skb) {
- dev_kfree_skb_any(rd->skb);
- rd->skb = NULL;
- }
+ dev_kfree_skb_any(rd->skb);
+ rd->skb = NULL;
}
else
ret = vlsi_process_rx(r, rd);
@@ -1136,10 +1133,8 @@ static void vlsi_unarm_tx(vlsi_irda_dev_t *idev)
rd_set_status(rd, 0);
rd_set_count(rd, 0);
pci_dma_sync_single_for_cpu(r->pdev, rd_get_addr(rd), r->len, r->dir);
- if (rd->skb) {
- dev_kfree_skb_any(rd->skb);
- rd->skb = NULL;
- }
+ dev_kfree_skb_any(rd->skb);
+ rd->skb = NULL;
IRDA_DEBUG(0, "%s - dropping tx packet\n", __func__);
ret = -VLSI_TX_DROP;
}
diff --git a/drivers/net/usb/cdc_mbim.c b/drivers/net/usb/cdc_mbim.c
index af76aaf..0986ba0 100644
--- a/drivers/net/usb/cdc_mbim.c
+++ b/drivers/net/usb/cdc_mbim.c
@@ -180,8 +180,7 @@ static struct sk_buff *cdc_mbim_tx_fixup(struct usbnet *dev, struct sk_buff *skb
return skb_out;
error:
- if (skb)
- dev_kfree_skb_any(skb);
+ dev_kfree_skb_any(skb);
return NULL;
}
diff --git a/drivers/net/usb/cdc_ncm.c b/drivers/net/usb/cdc_ncm.c
index 11c7033..160d854 100644
--- a/drivers/net/usb/cdc_ncm.c
+++ b/drivers/net/usb/cdc_ncm.c
@@ -311,15 +311,11 @@ static void cdc_ncm_free(struct cdc_ncm_ctx *ctx)
if (ctx == NULL)
return;
- if (ctx->tx_rem_skb != NULL) {
- dev_kfree_skb_any(ctx->tx_rem_skb);
- ctx->tx_rem_skb = NULL;
- }
+ dev_kfree_skb_any(ctx->tx_rem_skb);
+ ctx->tx_rem_skb = NULL;
- if (ctx->tx_curr_skb != NULL) {
- dev_kfree_skb_any(ctx->tx_curr_skb);
- ctx->tx_curr_skb = NULL;
- }
+ dev_kfree_skb_any(ctx->tx_curr_skb);
+ ctx->tx_curr_skb = NULL;
kfree(ctx);
}
@@ -852,8 +848,7 @@ cdc_ncm_tx_fixup(struct usbnet *dev, struct sk_buff *skb, gfp_t flags)
return skb_out;
error:
- if (skb != NULL)
- dev_kfree_skb_any(skb);
+ dev_kfree_skb_any(skb);
return NULL;
}
diff --git a/drivers/net/usb/lg-vl600.c b/drivers/net/usb/lg-vl600.c
index 808d650..7ecf203 100644
--- a/drivers/net/usb/lg-vl600.c
+++ b/drivers/net/usb/lg-vl600.c
@@ -238,10 +238,8 @@ static int vl600_rx_fixup(struct usbnet *dev, struct sk_buff *skb)
}
error:
- if (s->current_rx_buf) {
- dev_kfree_skb_any(s->current_rx_buf);
- s->current_rx_buf = NULL;
- }
+ dev_kfree_skb_any(s->current_rx_buf);
+ s->current_rx_buf = NULL;
dev->net->stats.rx_errors++;
return 0;
}
diff --git a/drivers/net/usb/usbnet.c b/drivers/net/usb/usbnet.c
index 90a429b..b37f812 100644
--- a/drivers/net/usb/usbnet.c
+++ b/drivers/net/usb/usbnet.c
@@ -1377,8 +1377,7 @@ netdev_tx_t usbnet_start_xmit (struct sk_buff *skb,
drop:
dev->net->stats.tx_dropped++;
not_drop:
- if (skb)
- dev_kfree_skb_any (skb);
+ dev_kfree_skb_any (skb);
if (urb) {
kfree(urb->sg);
usb_free_urb(urb);
diff --git a/drivers/net/vmxnet3/vmxnet3_drv.c b/drivers/net/vmxnet3/vmxnet3_drv.c
index 64ca248..2fd7034 100644
--- a/drivers/net/vmxnet3/vmxnet3_drv.c
+++ b/drivers/net/vmxnet3/vmxnet3_drv.c
@@ -403,10 +403,8 @@ vmxnet3_tq_cleanup(struct vmxnet3_tx_queue *tq,
tbi = tq->buf_info + tq->tx_ring.next2comp;
vmxnet3_unmap_tx_buf(tbi, adapter->pdev);
- if (tbi->skb) {
- dev_kfree_skb_any(tbi->skb);
- tbi->skb = NULL;
- }
+ dev_kfree_skb_any(tbi->skb);
+ tbi->skb = NULL;
vmxnet3_cmd_ring_adv_next2comp(&tq->tx_ring);
}
diff --git a/drivers/net/wireless/ath/ath10k/mac.c b/drivers/net/wireless/ath/ath10k/mac.c
index 99a9bad..7918569 100644
--- a/drivers/net/wireless/ath/ath10k/mac.c
+++ b/drivers/net/wireless/ath/ath10k/mac.c
@@ -2067,10 +2067,8 @@ static void ath10k_remove_interface(struct ieee80211_hw *hw,
mutex_lock(&ar->conf_mutex);
spin_lock_bh(&ar->data_lock);
- if (arvif->beacon) {
- dev_kfree_skb_any(arvif->beacon);
- arvif->beacon = NULL;
- }
+ dev_kfree_skb_any(arvif->beacon);
+ arvif->beacon = NULL;
spin_unlock_bh(&ar->data_lock);
ar->free_vdev_map |= 1 << (arvif->vdev_id);
diff --git a/drivers/net/wireless/ath/ath9k/htc_drv_txrx.c b/drivers/net/wireless/ath/ath9k/htc_drv_txrx.c
index c028df7..69d9b44 100644
--- a/drivers/net/wireless/ath/ath9k/htc_drv_txrx.c
+++ b/drivers/net/wireless/ath/ath9k/htc_drv_txrx.c
@@ -1200,8 +1200,7 @@ void ath9k_rx_cleanup(struct ath9k_htc_priv *priv)
list_for_each_entry_safe(rxbuf, tbuf, &priv->rx.rxbuf, list) {
list_del(&rxbuf->list);
- if (rxbuf->skb)
- dev_kfree_skb_any(rxbuf->skb);
+ dev_kfree_skb_any(rxbuf->skb);
kfree(rxbuf);
}
}
diff --git a/drivers/net/wireless/ath/ath9k/main.c b/drivers/net/wireless/ath/ath9k/main.c
index 20a2fbc..8125b1b 100644
--- a/drivers/net/wireless/ath/ath9k/main.c
+++ b/drivers/net/wireless/ath/ath9k/main.c
@@ -871,10 +871,8 @@ static void ath9k_stop(struct ieee80211_hw *hw)
ath_prepare_reset(sc);
- if (sc->rx.frag) {
- dev_kfree_skb_any(sc->rx.frag);
- sc->rx.frag = NULL;
- }
+ dev_kfree_skb_any(sc->rx.frag);
+ sc->rx.frag = NULL;
if (!ah->curchan)
ah->curchan = ath9k_cmn_get_channel(hw, ah, &hw->conf.chandef);
diff --git a/drivers/net/wireless/ath/ath9k/recv.c b/drivers/net/wireless/ath/ath9k/recv.c
index 8b788ef..679e05d 100644
--- a/drivers/net/wireless/ath/ath9k/recv.c
+++ b/drivers/net/wireless/ath/ath9k/recv.c
@@ -1454,10 +1454,8 @@ int ath_rx_tasklet(struct ath_softc *sc, int flush, bool hp)
ieee80211_rx(hw, skb);
requeue_drop_frag:
- if (sc->rx.frag) {
- dev_kfree_skb_any(sc->rx.frag);
- sc->rx.frag = NULL;
- }
+ dev_kfree_skb_any(sc->rx.frag);
+ sc->rx.frag = NULL;
requeue:
list_add_tail(&bf->list, &sc->rx.rxbuf);
if (flush)
diff --git a/drivers/net/wireless/ath/wil6210/txrx.c b/drivers/net/wireless/ath/wil6210/txrx.c
index d505b26..a6a46d7 100644
--- a/drivers/net/wireless/ath/wil6210/txrx.c
+++ b/drivers/net/wireless/ath/wil6210/txrx.c
@@ -130,8 +130,7 @@ static void wil_vring_free(struct wil6210_priv *wil, struct vring *vring,
dma_unmap_single(dev, pa, dmalen,
DMA_TO_DEVICE);
}
- if (ctx->skb)
- dev_kfree_skb_any(ctx->skb);
+ dev_kfree_skb_any(ctx->skb);
vring->swtail = wil_vring_next_tail(vring);
} else { /* rx */
struct vring_rx_desc dd, *d = ⅆ
@@ -819,8 +818,7 @@ static int wil_tx_vring(struct wil6210_priv *wil, struct vring *vring,
else
dma_unmap_single(dev, pa, dmalen, DMA_TO_DEVICE);
- if (ctx->skb)
- dev_kfree_skb_any(ctx->skb);
+ dev_kfree_skb_any(ctx->skb);
memset(ctx, 0, sizeof(*ctx));
}
diff --git a/drivers/net/wireless/b43/main.c b/drivers/net/wireless/b43/main.c
index ccd24f0a..449d98d 100644
--- a/drivers/net/wireless/b43/main.c
+++ b/drivers/net/wireless/b43/main.c
@@ -1755,8 +1755,7 @@ static void b43_update_templates(struct b43_wl *wl)
if (unlikely(!beacon))
return;
- if (wl->current_beacon)
- dev_kfree_skb_any(wl->current_beacon);
+ dev_kfree_skb_any(wl->current_beacon);
wl->current_beacon = beacon;
wl->beacon0_uploaded = false;
wl->beacon1_uploaded = false;
@@ -4662,10 +4661,8 @@ static void b43_wireless_core_exit(struct b43_wldev *dev)
b43_pio_free(dev);
b43_chip_exit(dev);
dev->phy.ops->switch_analog(dev, 0);
- if (dev->wl->current_beacon) {
- dev_kfree_skb_any(dev->wl->current_beacon);
- dev->wl->current_beacon = NULL;
- }
+ dev_kfree_skb_any(dev->wl->current_beacon);
+ dev->wl->current_beacon = NULL;
b43_device_disable(dev, 0);
b43_bus_may_powerdown(dev);
diff --git a/drivers/net/wireless/b43legacy/main.c b/drivers/net/wireless/b43legacy/main.c
index 5726688..4751b22 100644
--- a/drivers/net/wireless/b43legacy/main.c
+++ b/drivers/net/wireless/b43legacy/main.c
@@ -1274,8 +1274,7 @@ static void b43legacy_update_templates(struct b43legacy_wl *wl)
if (unlikely(!beacon))
return;
- if (wl->current_beacon)
- dev_kfree_skb_any(wl->current_beacon);
+ dev_kfree_skb_any(wl->current_beacon);
wl->current_beacon = beacon;
wl->beacon0_uploaded = false;
wl->beacon1_uploaded = false;
@@ -3233,10 +3232,8 @@ static void b43legacy_wireless_core_exit(struct b43legacy_wldev *dev)
kfree(phy->tssi2dbm);
kfree(phy->lo_control);
phy->lo_control = NULL;
- if (dev->wl->current_beacon) {
- dev_kfree_skb_any(dev->wl->current_beacon);
- dev->wl->current_beacon = NULL;
- }
+ dev_kfree_skb_any(dev->wl->current_beacon);
+ dev->wl->current_beacon = NULL;
ssb_device_disable(dev->dev, 0);
ssb_bus_may_powerdown(dev->dev->bus);
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/dhd_linux.c b/drivers/net/wireless/brcm80211/brcmfmac/dhd_linux.c
index 64e9cff..402a642 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/dhd_linux.c
+++ b/drivers/net/wireless/brcm80211/brcmfmac/dhd_linux.c
@@ -878,8 +878,7 @@ static int brcmf_net_p2p_do_ioctl(struct net_device *ndev,
static netdev_tx_t brcmf_net_p2p_start_xmit(struct sk_buff *skb,
struct net_device *ndev)
{
- if (skb)
- dev_kfree_skb_any(skb);
+ dev_kfree_skb_any(skb);
return NETDEV_TX_OK;
}
diff --git a/drivers/net/wireless/brcm80211/brcmsmac/main.c b/drivers/net/wireless/brcm80211/brcmsmac/main.c
index 8138f1c..07f63db 100644
--- a/drivers/net/wireless/brcm80211/brcmsmac/main.c
+++ b/drivers/net/wireless/brcm80211/brcmsmac/main.c
@@ -449,10 +449,8 @@ static void brcms_c_detach_mfree(struct brcms_c_info *wlc)
kfree(wlc->corestate);
kfree(wlc->hw->bandstate[0]);
kfree(wlc->hw);
- if (wlc->beacon)
- dev_kfree_skb_any(wlc->beacon);
- if (wlc->probe_resp)
- dev_kfree_skb_any(wlc->probe_resp);
+ dev_kfree_skb_any(wlc->beacon);
+ dev_kfree_skb_any(wlc->probe_resp);
/* free the wlc */
kfree(wlc);
@@ -7470,8 +7468,7 @@ void brcms_c_set_new_beacon(struct brcms_c_info *wlc, struct sk_buff *beacon,
{
if (!beacon)
return;
- if (wlc->beacon)
- dev_kfree_skb_any(wlc->beacon);
+ dev_kfree_skb_any(wlc->beacon);
wlc->beacon = beacon;
/* add PLCP */
@@ -7486,8 +7483,7 @@ void brcms_c_set_new_probe_resp(struct brcms_c_info *wlc,
{
if (!probe_resp)
return;
- if (wlc->probe_resp)
- dev_kfree_skb_any(wlc->probe_resp);
+ dev_kfree_skb_any(wlc->probe_resp);
wlc->probe_resp = probe_resp;
/* add PLCP */
diff --git a/drivers/net/wireless/ipw2x00/ipw2200.c b/drivers/net/wireless/ipw2x00/ipw2200.c
index 81903e3..f803ca1 100644
--- a/drivers/net/wireless/ipw2x00/ipw2200.c
+++ b/drivers/net/wireless/ipw2x00/ipw2200.c
@@ -8538,10 +8538,8 @@ static void ipw_rx(struct ipw_priv *priv)
/* For now we just don't re-use anything. We can tweak this
* later to try and re-use notification packets and SKBs that
* fail to Rx correctly */
- if (rxb->skb != NULL) {
- dev_kfree_skb_any(rxb->skb);
- rxb->skb = NULL;
- }
+ dev_kfree_skb_any(rxb->skb);
+ rxb->skb = NULL;
pci_unmap_single(priv->pci_dev, rxb->dma_addr,
IPW_RX_BUF_SIZE, PCI_DMA_FROMDEVICE);
diff --git a/drivers/net/wireless/ipw2x00/libipw_rx.c b/drivers/net/wireless/ipw2x00/libipw_rx.c
index 9ffe659..4411888 100644
--- a/drivers/net/wireless/ipw2x00/libipw_rx.c
+++ b/drivers/net/wireless/ipw2x00/libipw_rx.c
@@ -113,8 +113,7 @@ static struct sk_buff *libipw_frag_cache_get(struct libipw_device *ieee,
if (ieee->frag_next_idx >= LIBIPW_FRAG_CACHE_LEN)
ieee->frag_next_idx = 0;
- if (entry->skb != NULL)
- dev_kfree_skb_any(entry->skb);
+ dev_kfree_skb_any(entry->skb);
entry->first_frag_time = jiffies;
entry->seq = seq;
diff --git a/drivers/net/wireless/ipw2x00/libipw_tx.c b/drivers/net/wireless/ipw2x00/libipw_tx.c
index e8c0398..b04243a 100644
--- a/drivers/net/wireless/ipw2x00/libipw_tx.c
+++ b/drivers/net/wireless/ipw2x00/libipw_tx.c
@@ -183,8 +183,7 @@ void libipw_txb_free(struct libipw_txb *txb)
if (unlikely(!txb))
return;
for (i = 0; i < txb->nr_frags; i++)
- if (txb->fragments[i])
- dev_kfree_skb_any(txb->fragments[i]);
+ dev_kfree_skb_any(txb->fragments[i]);
kfree(txb);
}
diff --git a/drivers/net/wireless/mwifiex/init.c b/drivers/net/wireless/mwifiex/init.c
index 6499117..ffd0751 100644
--- a/drivers/net/wireless/mwifiex/init.c
+++ b/drivers/net/wireless/mwifiex/init.c
@@ -395,8 +395,7 @@ mwifiex_adapter_cleanup(struct mwifiex_adapter *adapter)
dev_dbg(adapter->dev, "info: free scan table\n");
- if (adapter->sleep_cfm)
- dev_kfree_skb_any(adapter->sleep_cfm);
+ dev_kfree_skb_any(adapter->sleep_cfm);
}
/*
--
1.8.4.2
^ permalink raw reply related
* [PATCH net-next 07/13] driver: staging: remove unnecessary NULL check before dev_kfree_skb_any
From: Govindarajulu Varadarajan @ 2013-11-02 13:47 UTC (permalink / raw)
To: davem, gregkh, linux-usb, linux-kernel, schwidefsky, linville,
linux-wireless, netdev, IvDoorn, sbhatewara, samuel, chas, roland,
isdn, jcliburn, benve, ssujith, jeffrey.t.kirsher,
jesse.brandeburg, shahed.shaikh, joe, apw
Cc: Govindarajulu Varadarajan
In-Reply-To: <1383400074-30555-1-git-send-email-govindarajulu90@gmail.com>
dev_kfree_skb_any is protected from NULL. No need to check for NULL while
calling this function.
Signed-off-by: Govindarajulu Varadarajan <govindarajulu90@gmail.com>
---
drivers/staging/rtl8187se/ieee80211/ieee80211_rx.c | 3 +--
drivers/staging/rtl8187se/ieee80211/ieee80211_tx.c | 3 +--
drivers/staging/rtl8188eu/core/rtw_recv.c | 6 ++----
drivers/staging/rtl8192e/rtllib_rx.c | 3 +--
drivers/staging/rtl8192u/ieee80211/ieee80211_rx.c | 3 +--
drivers/staging/rtl8712/recv_linux.c | 3 +--
drivers/staging/rtl8712/rtl8712_recv.c | 6 ++----
drivers/staging/rtl8712/xmit_linux.c | 3 +--
drivers/staging/sbe-2t3e3/dc.c | 12 ++++--------
9 files changed, 14 insertions(+), 28 deletions(-)
diff --git a/drivers/staging/rtl8187se/ieee80211/ieee80211_rx.c b/drivers/staging/rtl8187se/ieee80211/ieee80211_rx.c
index 10b2210..bbafdcc 100644
--- a/drivers/staging/rtl8187se/ieee80211/ieee80211_rx.c
+++ b/drivers/staging/rtl8187se/ieee80211/ieee80211_rx.c
@@ -138,8 +138,7 @@ ieee80211_frag_cache_get(struct ieee80211_device *ieee,
if (ieee->frag_next_idx[tid] >= IEEE80211_FRAG_CACHE_LEN)
ieee->frag_next_idx[tid] = 0;
- if (entry->skb != NULL)
- dev_kfree_skb_any(entry->skb);
+ dev_kfree_skb_any(entry->skb);
entry->first_frag_time = jiffies;
entry->seq = seq;
diff --git a/drivers/staging/rtl8187se/ieee80211/ieee80211_tx.c b/drivers/staging/rtl8187se/ieee80211/ieee80211_tx.c
index b346653..fe747b1 100644
--- a/drivers/staging/rtl8187se/ieee80211/ieee80211_tx.c
+++ b/drivers/staging/rtl8187se/ieee80211/ieee80211_tx.c
@@ -234,8 +234,7 @@ void ieee80211_txb_free(struct ieee80211_txb *txb) {
if (unlikely(!txb))
return;
for (i = 0; i < txb->nr_frags; i++)
- if (txb->fragments[i])
- dev_kfree_skb_any(txb->fragments[i]);
+ dev_kfree_skb_any(txb->fragments[i]);
kfree(txb);
}
diff --git a/drivers/staging/rtl8188eu/core/rtw_recv.c b/drivers/staging/rtl8188eu/core/rtw_recv.c
index 2011657..93fb9ed 100644
--- a/drivers/staging/rtl8188eu/core/rtw_recv.c
+++ b/drivers/staging/rtl8188eu/core/rtw_recv.c
@@ -209,10 +209,8 @@ int rtw_free_recvframe(union recv_frame *precvframe, struct __queue *pfree_recv_
_func_enter_;
- if (precvframe->u.hdr.pkt) {
- dev_kfree_skb_any(precvframe->u.hdr.pkt);/* free skb by driver */
- precvframe->u.hdr.pkt = NULL;
- }
+ dev_kfree_skb_any(precvframe->u.hdr.pkt);/* free skb by driver */
+ precvframe->u.hdr.pkt = NULL;
_enter_critical_bh(&pfree_recv_queue->lock, &irqL);
diff --git a/drivers/staging/rtl8192e/rtllib_rx.c b/drivers/staging/rtl8192e/rtllib_rx.c
index 8aeaed5..0118854 100644
--- a/drivers/staging/rtl8192e/rtllib_rx.c
+++ b/drivers/staging/rtl8192e/rtllib_rx.c
@@ -133,8 +133,7 @@ rtllib_frag_cache_get(struct rtllib_device *ieee,
if (ieee->frag_next_idx[tid] >= RTLLIB_FRAG_CACHE_LEN)
ieee->frag_next_idx[tid] = 0;
- if (entry->skb != NULL)
- dev_kfree_skb_any(entry->skb);
+ dev_kfree_skb_any(entry->skb);
entry->first_frag_time = jiffies;
entry->seq = seq;
diff --git a/drivers/staging/rtl8192u/ieee80211/ieee80211_rx.c b/drivers/staging/rtl8192u/ieee80211/ieee80211_rx.c
index 59900bf..70bf7a4 100644
--- a/drivers/staging/rtl8192u/ieee80211/ieee80211_rx.c
+++ b/drivers/staging/rtl8192u/ieee80211/ieee80211_rx.c
@@ -138,8 +138,7 @@ ieee80211_frag_cache_get(struct ieee80211_device *ieee,
if (ieee->frag_next_idx[tid] >= IEEE80211_FRAG_CACHE_LEN)
ieee->frag_next_idx[tid] = 0;
- if (entry->skb != NULL)
- dev_kfree_skb_any(entry->skb);
+ dev_kfree_skb_any(entry->skb);
entry->first_frag_time = jiffies;
entry->seq = seq;
diff --git a/drivers/staging/rtl8712/recv_linux.c b/drivers/staging/rtl8712/recv_linux.c
index 495ee12..c422d1f 100644
--- a/drivers/staging/rtl8712/recv_linux.c
+++ b/drivers/staging/rtl8712/recv_linux.c
@@ -75,8 +75,7 @@ int r8712_os_recvbuf_resource_alloc(struct _adapter *padapter,
int r8712_os_recvbuf_resource_free(struct _adapter *padapter,
struct recv_buf *precvbuf)
{
- if (precvbuf->pskb)
- dev_kfree_skb_any(precvbuf->pskb);
+ dev_kfree_skb_any(precvbuf->pskb);
if (precvbuf->purb) {
usb_kill_urb(precvbuf->purb);
usb_free_urb(precvbuf->purb);
diff --git a/drivers/staging/rtl8712/rtl8712_recv.c b/drivers/staging/rtl8712/rtl8712_recv.c
index d59a74a..9a4e87c 100644
--- a/drivers/staging/rtl8712/rtl8712_recv.c
+++ b/drivers/staging/rtl8712/rtl8712_recv.c
@@ -145,10 +145,8 @@ int r8712_free_recvframe(union recv_frame *precvframe,
struct _adapter *padapter = precvframe->u.hdr.adapter;
struct recv_priv *precvpriv = &padapter->recvpriv;
- if (precvframe->u.hdr.pkt) {
- dev_kfree_skb_any(precvframe->u.hdr.pkt);/*free skb by driver*/
- precvframe->u.hdr.pkt = NULL;
- }
+ dev_kfree_skb_any(precvframe->u.hdr.pkt);/*free skb by driver*/
+ precvframe->u.hdr.pkt = NULL;
spin_lock_irqsave(&pfree_recv_queue->lock, irqL);
list_delete(&(precvframe->u.hdr.list));
list_insert_tail(&(precvframe->u.hdr.list),
diff --git a/drivers/staging/rtl8712/xmit_linux.c b/drivers/staging/rtl8712/xmit_linux.c
index 4d22bb7..13bb27a 100644
--- a/drivers/staging/rtl8712/xmit_linux.c
+++ b/drivers/staging/rtl8712/xmit_linux.c
@@ -156,8 +156,7 @@ void r8712_xmit_resource_free(struct _adapter *padapter,
void r8712_xmit_complete(struct _adapter *padapter, struct xmit_frame *pxframe)
{
- if (pxframe->pkt)
- dev_kfree_skb_any(pxframe->pkt);
+ dev_kfree_skb_any(pxframe->pkt);
pxframe->pkt = NULL;
}
diff --git a/drivers/staging/sbe-2t3e3/dc.c b/drivers/staging/sbe-2t3e3/dc.c
index f207b9e..d8c9464 100644
--- a/drivers/staging/sbe-2t3e3/dc.c
+++ b/drivers/staging/sbe-2t3e3/dc.c
@@ -403,10 +403,8 @@ void dc_clear_descriptor_list(struct channel *sc)
/* free all data buffers on TX ring */
for (i = 0; i < SBE_2T3E3_TX_DESC_RING_SIZE; i++) {
- if (sc->ether.tx_data[i] != NULL) {
- dev_kfree_skb_any(sc->ether.tx_data[i]);
- sc->ether.tx_data[i] = NULL;
- }
+ dev_kfree_skb_any(sc->ether.tx_data[i]);
+ sc->ether.tx_data[i] = NULL;
}
}
@@ -418,10 +416,8 @@ void dc_drop_descriptor_list(struct channel *sc)
/* free all data buffers on RX ring */
for (i = 0; i < SBE_2T3E3_RX_DESC_RING_SIZE; i++) {
- if (sc->ether.rx_data[i] != NULL) {
- dev_kfree_skb_any(sc->ether.rx_data[i]);
- sc->ether.rx_data[i] = NULL;
- }
+ dev_kfree_skb_any(sc->ether.rx_data[i]);
+ sc->ether.rx_data[i] = NULL;
}
kfree(sc->ether.rx_ring);
--
1.8.4.2
^ permalink raw reply related
* [PATCH net-next 08/13] driver: isdn: remove unnecessary NULL check before dev_kfree_skb_any
From: Govindarajulu Varadarajan @ 2013-11-02 13:47 UTC (permalink / raw)
To: davem, gregkh, linux-usb, linux-kernel, schwidefsky, linville,
linux-wireless, netdev, IvDoorn, sbhatewara, samuel, chas, roland,
isdn, jcliburn, benve, ssujith, jeffrey.t.kirsher,
jesse.brandeburg, shahed.shaikh, joe, apw
Cc: Govindarajulu Varadarajan
In-Reply-To: <1383400074-30555-1-git-send-email-govindarajulu90@gmail.com>
dev_kfree_skb_any is protected from NULL. No need to check for NULL
while calling this function.
Signed-off-by: Govindarajulu Varadarajan <govindarajulu90@gmail.com>
---
drivers/isdn/gigaset/ser-gigaset.c | 3 +--
drivers/isdn/hisax/hfc_usb.c | 6 ++----
drivers/isdn/hisax/icc.c | 6 ++----
drivers/isdn/hisax/ipacx.c | 6 ++----
drivers/isdn/hisax/isac.c | 6 ++----
drivers/isdn/hisax/st5481_b.c | 6 ++----
drivers/isdn/hisax/w6692.c | 6 ++----
7 files changed, 13 insertions(+), 26 deletions(-)
diff --git a/drivers/isdn/gigaset/ser-gigaset.c b/drivers/isdn/gigaset/ser-gigaset.c
index 8c91fd5..9128526 100644
--- a/drivers/isdn/gigaset/ser-gigaset.c
+++ b/drivers/isdn/gigaset/ser-gigaset.c
@@ -221,8 +221,7 @@ static void flush_send_queue(struct cardstate *cs)
spin_unlock_irqrestore(&cs->cmdlock, flags);
/* data queue */
- if (cs->bcs->tx_skb)
- dev_kfree_skb_any(cs->bcs->tx_skb);
+ dev_kfree_skb_any(cs->bcs->tx_skb);
while ((skb = skb_dequeue(&cs->bcs->squeue)) != NULL)
dev_kfree_skb_any(skb);
}
diff --git a/drivers/isdn/hisax/hfc_usb.c b/drivers/isdn/hisax/hfc_usb.c
index 849a807..a1f8380 100644
--- a/drivers/isdn/hisax/hfc_usb.c
+++ b/drivers/isdn/hisax/hfc_usb.c
@@ -864,10 +864,8 @@ rx_int_complete(struct urb *urb)
fifon, urb->status);
fifo->urb->interval = 0; /* cancel automatic rescheduling */
- if (fifo->skbuff) {
- dev_kfree_skb_any(fifo->skbuff);
- fifo->skbuff = NULL;
- }
+ dev_kfree_skb_any(fifo->skbuff);
+ fifo->skbuff = NULL;
return;
}
len = urb->actual_length;
diff --git a/drivers/isdn/hisax/icc.c b/drivers/isdn/hisax/icc.c
index 51dae91..2c52996 100644
--- a/drivers/isdn/hisax/icc.c
+++ b/drivers/isdn/hisax/icc.c
@@ -549,10 +549,8 @@ ICC_l1hw(struct PStack *st, int pr, void *arg)
case (HW_DEACTIVATE | RESPONSE):
skb_queue_purge(&cs->rq);
skb_queue_purge(&cs->sq);
- if (cs->tx_skb) {
- dev_kfree_skb_any(cs->tx_skb);
- cs->tx_skb = NULL;
- }
+ dev_kfree_skb_any(cs->tx_skb);
+ cs->tx_skb = NULL;
if (test_and_clear_bit(FLG_DBUSY_TIMER, &cs->HW_Flags))
del_timer(&cs->dbusytimer);
if (test_and_clear_bit(FLG_L1_DBUSY, &cs->HW_Flags))
diff --git a/drivers/isdn/hisax/ipacx.c b/drivers/isdn/hisax/ipacx.c
index 5faa5de..55192a4 100644
--- a/drivers/isdn/hisax/ipacx.c
+++ b/drivers/isdn/hisax/ipacx.c
@@ -181,10 +181,8 @@ dch_l2l1(struct PStack *st, int pr, void *arg)
case (HW_DEACTIVATE | RESPONSE):
skb_queue_purge(&cs->rq);
skb_queue_purge(&cs->sq);
- if (cs->tx_skb) {
- dev_kfree_skb_any(cs->tx_skb);
- cs->tx_skb = NULL;
- }
+ dev_kfree_skb_any(cs->tx_skb);
+ cs->tx_skb = NULL;
if (test_and_clear_bit(FLG_DBUSY_TIMER, &cs->HW_Flags))
del_timer(&cs->dbusytimer);
break;
diff --git a/drivers/isdn/hisax/isac.c b/drivers/isdn/hisax/isac.c
index 7fdf78f..d0895f2 100644
--- a/drivers/isdn/hisax/isac.c
+++ b/drivers/isdn/hisax/isac.c
@@ -547,10 +547,8 @@ ISAC_l1hw(struct PStack *st, int pr, void *arg)
case (HW_DEACTIVATE | RESPONSE):
skb_queue_purge(&cs->rq);
skb_queue_purge(&cs->sq);
- if (cs->tx_skb) {
- dev_kfree_skb_any(cs->tx_skb);
- cs->tx_skb = NULL;
- }
+ dev_kfree_skb_any(cs->tx_skb);
+ cs->tx_skb = NULL;
if (test_and_clear_bit(FLG_DBUSY_TIMER, &cs->HW_Flags))
del_timer(&cs->dbusytimer);
if (test_and_clear_bit(FLG_L1_DBUSY, &cs->HW_Flags))
diff --git a/drivers/isdn/hisax/st5481_b.c b/drivers/isdn/hisax/st5481_b.c
index 4098491..b753aca 100644
--- a/drivers/isdn/hisax/st5481_b.c
+++ b/drivers/isdn/hisax/st5481_b.c
@@ -254,10 +254,8 @@ static void st5481B_mode(struct st5481_bcs *bcs, int mode)
} else {
st5481_usb_device_ctrl_msg(adapter, GPIO_OUT, adapter->leds, NULL, NULL);
}
- if (b_out->tx_skb) {
- dev_kfree_skb_any(b_out->tx_skb);
- b_out->tx_skb = NULL;
- }
+ dev_kfree_skb_any(b_out->tx_skb);
+ b_out->tx_skb = NULL;
}
}
diff --git a/drivers/isdn/hisax/w6692.c b/drivers/isdn/hisax/w6692.c
index a858955..dd1fbf4 100644
--- a/drivers/isdn/hisax/w6692.c
+++ b/drivers/isdn/hisax/w6692.c
@@ -653,10 +653,8 @@ W6692_l1hw(struct PStack *st, int pr, void *arg)
case (HW_DEACTIVATE | RESPONSE):
skb_queue_purge(&cs->rq);
skb_queue_purge(&cs->sq);
- if (cs->tx_skb) {
- dev_kfree_skb_any(cs->tx_skb);
- cs->tx_skb = NULL;
- }
+ dev_kfree_skb_any(cs->tx_skb);
+ cs->tx_skb = NULL;
if (test_and_clear_bit(FLG_DBUSY_TIMER, &cs->HW_Flags))
del_timer(&cs->dbusytimer);
if (test_and_clear_bit(FLG_L1_DBUSY, &cs->HW_Flags))
--
1.8.4.2
^ permalink raw reply related
* [PATCH net-next 09/13] driver: s390: remove unnecessary NULL check before dev_kfree_skb_any
From: Govindarajulu Varadarajan @ 2013-11-02 13:47 UTC (permalink / raw)
To: davem, gregkh, linux-usb, linux-kernel, schwidefsky, linville,
linux-wireless, netdev, IvDoorn, sbhatewara, samuel, chas, roland,
isdn, jcliburn, benve, ssujith, jeffrey.t.kirsher,
jesse.brandeburg, shahed.shaikh, joe, apw
Cc: Govindarajulu Varadarajan
In-Reply-To: <1383400074-30555-1-git-send-email-govindarajulu90@gmail.com>
dev_kfree_skb_any is protected from NULL. No need to check for NULL
while calling this function.
Signed-off-by: Govindarajulu Varadarajan <govindarajulu90@gmail.com>
---
drivers/s390/net/claw.c | 6 ++----
drivers/s390/net/ctcm_mpc.c | 6 ++----
drivers/s390/net/qeth_core_main.c | 6 ++----
3 files changed, 6 insertions(+), 12 deletions(-)
diff --git a/drivers/s390/net/claw.c b/drivers/s390/net/claw.c
index fd7b3bd..66c0b14 100644
--- a/drivers/s390/net/claw.c
+++ b/drivers/s390/net/claw.c
@@ -834,10 +834,8 @@ claw_release(struct net_device *dev)
ccw_check_return_code(privptr->channel[i].cdev, rc);
}
}
- if (privptr->pk_skb != NULL) {
- dev_kfree_skb_any(privptr->pk_skb);
- privptr->pk_skb = NULL;
- }
+ dev_kfree_skb_any(privptr->pk_skb);
+ privptr->pk_skb = NULL;
if(privptr->buffs_alloc != 1) {
CLAW_DBF_TEXT(4, trace, "none2fre");
return 0;
diff --git a/drivers/s390/net/ctcm_mpc.c b/drivers/s390/net/ctcm_mpc.c
index 2dbc77b..2dd53a6 100644
--- a/drivers/s390/net/ctcm_mpc.c
+++ b/drivers/s390/net/ctcm_mpc.c
@@ -964,8 +964,7 @@ void mpc_channel_action(struct channel *ch, int direction, int action)
grp->outstanding_xid2++;
ch->in_mpcgroup = 1;
- if (ch->xid_skb != NULL)
- dev_kfree_skb_any(ch->xid_skb);
+ dev_kfree_skb_any(ch->xid_skb);
ch->xid_skb = __dev_alloc_skb(MPC_BUFSIZE_DEFAULT,
GFP_ATOMIC | GFP_DMA);
@@ -1017,8 +1016,7 @@ void mpc_channel_action(struct channel *ch, int direction, int action)
grp->num_channel_paths--;
grp->active_channels[direction]--;
- if (ch->xid_skb != NULL)
- dev_kfree_skb_any(ch->xid_skb);
+ dev_kfree_skb_any(ch->xid_skb);
ch->xid_skb = NULL;
if (grp->channels_terminating)
diff --git a/drivers/s390/net/qeth_core_main.c b/drivers/s390/net/qeth_core_main.c
index 0a328d0..7d33b94 100644
--- a/drivers/s390/net/qeth_core_main.c
+++ b/drivers/s390/net/qeth_core_main.c
@@ -1282,10 +1282,8 @@ static void qeth_free_qdio_buffers(struct qeth_card *card)
qeth_free_cq(card);
cancel_delayed_work_sync(&card->buffer_reclaim_work);
- for (j = 0; j < QDIO_MAX_BUFFERS_PER_Q; ++j) {
- if (card->qdio.in_q->bufs[j].rx_skb)
- dev_kfree_skb_any(card->qdio.in_q->bufs[j].rx_skb);
- }
+ for (j = 0; j < QDIO_MAX_BUFFERS_PER_Q; ++j)
+ dev_kfree_skb_any(card->qdio.in_q->bufs[j].rx_skb);
kfree(card->qdio.in_q);
card->qdio.in_q = NULL;
/* inbound buffer pool */
--
1.8.4.2
^ permalink raw reply related
* [PATCH net-next 11/13] driver: usb: remove unnecessary NULL check before dev_kfree_skb_any
From: Govindarajulu Varadarajan @ 2013-11-02 13:47 UTC (permalink / raw)
To: davem, gregkh, linux-usb, linux-kernel, schwidefsky, linville,
linux-wireless, netdev, IvDoorn, sbhatewara, samuel, chas, roland,
isdn, jcliburn, benve, ssujith, jeffrey.t.kirsher,
jesse.brandeburg, shahed.shaikh, joe, apw
Cc: Govindarajulu Varadarajan
In-Reply-To: <1383400074-30555-1-git-send-email-govindarajulu90@gmail.com>
dev_kfree_skb_any is protected from NULL. No need to check for NULL
while calling this function.
Signed-off-by: Govindarajulu Varadarajan <govindarajulu90@gmail.com>
---
drivers/usb/gadget/u_ether.c | 6 ++----
1 file changed, 2 insertions(+), 4 deletions(-)
diff --git a/drivers/usb/gadget/u_ether.c b/drivers/usb/gadget/u_ether.c
index 2aae0d6..3b61ac6 100644
--- a/drivers/usb/gadget/u_ether.c
+++ b/drivers/usb/gadget/u_ether.c
@@ -251,8 +251,7 @@ enomem:
defer_kevent(dev, WORK_RX_MEMORY);
if (retval) {
DBG(dev, "rx submit --> %d\n", retval);
- if (skb)
- dev_kfree_skb_any(skb);
+ dev_kfree_skb_any(skb);
spin_lock_irqsave(&dev->req_lock, flags);
list_add(&req->list, &dev->rx_reqs);
spin_unlock_irqrestore(&dev->req_lock, flags);
@@ -339,8 +338,7 @@ quiesce:
break;
}
- if (skb)
- dev_kfree_skb_any(skb);
+ dev_kfree_skb_any(skb);
if (!netif_running(dev->net)) {
clean:
spin_lock(&dev->req_lock);
--
1.8.4.2
^ permalink raw reply related
* [PATCH net-next 13/13] scripts/checkpatch.pl: Add dev_kfree_skb*(NULL) check to checkpatch
From: Govindarajulu Varadarajan @ 2013-11-02 13:47 UTC (permalink / raw)
To: davem, gregkh, linux-usb, linux-kernel, schwidefsky, linville,
linux-wireless, netdev, IvDoorn, sbhatewara, samuel, chas, roland,
isdn, jcliburn, benve, ssujith, jeffrey.t.kirsher,
jesse.brandeburg, shahed.shaikh, joe, apw
Cc: Govindarajulu Varadarajan
In-Reply-To: <1383400074-30555-1-git-send-email-govindarajulu90@gmail.com>
Signed-off-by: Govindarajulu Varadarajan <govindarajulu90@gmail.com>
---
scripts/checkpatch.pl | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/scripts/checkpatch.pl b/scripts/checkpatch.pl
index 66cad50..e651b8a 100755
--- a/scripts/checkpatch.pl
+++ b/scripts/checkpatch.pl
@@ -3719,7 +3719,7 @@ sub process {
# check for needless "if (<foo>) fn(<foo>)" uses
if ($prevline =~ /\bif\s*\(\s*($Lval)\s*\)/) {
my $expr = '\s*\(\s*' . quotemeta($1) . '\s*\)\s*;';
- if ($line =~ /\b(kfree|usb_free_urb|debugfs_remove(?:_recursive)?)$expr/) {
+ if ($line =~ /\b(kfree|dev_kfree_skb|dev_kfree_skb_any|dev_kfree_skb_irq|usb_free_urb|debugfs_remove(?:_recursive)?)$expr/) {
WARN('NEEDLESS_IF',
"$1(NULL) is safe this check is probably not required\n" . $hereprev);
}
--
1.8.4.2
^ permalink raw reply related
* [PATCH net-next 00/13] Protect dev_kfree_skb_irq from NULL and remove unnecessary NULL checks
From: Govindarajulu Varadarajan @ 2013-11-02 13:47 UTC (permalink / raw)
To: davem, gregkh, linux-usb, linux-kernel, schwidefsky, linville,
linux-wireless, netdev, IvDoorn, sbhatewara, samuel, chas, roland,
isdn, jcliburn, benve, ssujith, jeffrey.t.kirsher,
jesse.brandeburg, shahed.shaikh, joe, apw
Cc: Govindarajulu Varadarajan
dev_kfree_skb_irq is not NULL safe. The following patch checks skb for NULL in
dev_kfree_skb_irq.
At many places we check for NULL before calling dev_kfree_skb_*(). Moving the
check to dev_kfree_skb_irq_*() removes the reddundant if condition and makes
code simpler.
Also dev_kfree_skb_any either calls dev_kfree_skb_irq or dev_kfree_skb
depending on where your code is running. dev_kfree_skb is NULL safe but
dev_kfree_skb_irq is not. This patch fixes it.
Govindarajulu Varadarajan (13):
net: Check skb for NULL in dev_kfree_skb_irq
driver: net: remove unnecessary skb NULL check before calling
dev_kfree_skb_irq
driver: atm: remove unnecessary skb NULL check before calling
dev_kfree_skb_irq
driver: staging: remove unnecessary skb NULL check before calling
dev_kfree_skb_irq
driver: net: remove unnecessary skb NULL check before calling
dev_kfree_skb_irq
driver: net: remove unnecessary NULL check before dev_kfree_skb_any
driver: staging: remove unnecessary NULL check before
dev_kfree_skb_any
driver: isdn: remove unnecessary NULL check before dev_kfree_skb_any
driver: s390: remove unnecessary NULL check before dev_kfree_skb_any
driver: infiniband: remove unnecessary NULL check before
dev_kfree_skb_any
driver: usb: remove unnecessary NULL check before dev_kfree_skb_any
driver: net: fix space before '(' and remove extra variable
scripts/checkpatch.pl: Add dev_kfree_skb*(NULL) check to ckeckpatch
drivers/atm/eni.c | 2 +-
drivers/infiniband/hw/amso1100/c2.c | 6 ++----
drivers/infiniband/hw/nes/nes_hw.c | 3 +--
drivers/isdn/gigaset/ser-gigaset.c | 3 +--
drivers/isdn/hisax/hfc_usb.c | 6 ++----
drivers/isdn/hisax/icc.c | 6 ++----
drivers/isdn/hisax/ipacx.c | 6 ++----
drivers/isdn/hisax/isac.c | 6 ++----
drivers/isdn/hisax/st5481_b.c | 6 ++----
drivers/isdn/hisax/w6692.c | 6 ++----
drivers/net/ethernet/amd/lance.c | 9 +++------
drivers/net/ethernet/amd/ni65.c | 6 ++----
drivers/net/ethernet/atheros/alx/main.c | 6 ++----
drivers/net/ethernet/atheros/atl1c/atl1c_main.c | 10 ++++------
drivers/net/ethernet/atheros/atl1e/atl1e_main.c | 12 ++++--------
drivers/net/ethernet/atheros/atlx/atl1.c | 12 ++++--------
drivers/net/ethernet/cisco/enic/enic_main.c | 3 +--
drivers/net/ethernet/freescale/fec_main.c | 6 ++----
drivers/net/ethernet/hp/hp100.c | 3 +--
drivers/net/ethernet/icplus/ipg.c | 6 ++----
drivers/net/ethernet/intel/e1000/e1000_main.c | 6 ++----
drivers/net/ethernet/intel/e1000e/netdev.c | 15 +++++----------
drivers/net/ethernet/intel/igb/igb_ptp.c | 6 ++----
drivers/net/ethernet/intel/igbvf/netdev.c | 6 ++----
drivers/net/ethernet/intel/ixgb/ixgb_main.c | 6 ++----
drivers/net/ethernet/intel/ixgbe/ixgbe_ptp.c | 6 ++----
drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c | 6 ++----
drivers/net/ethernet/korina.c | 12 ++++--------
drivers/net/ethernet/marvell/pxa168_eth.c | 3 +--
drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_main.c | 12 ++++--------
drivers/net/ethernet/qlogic/netxen/netxen_nic_init.c | 9 +++------
drivers/net/ethernet/qlogic/qlcnic/qlcnic_init.c | 6 ++----
drivers/net/ethernet/seeq/sgiseeq.c | 6 ++----
drivers/net/ethernet/sgi/ioc3-eth.c | 11 +++--------
drivers/net/ethernet/smsc/smsc9420.c | 3 +--
drivers/net/ethernet/sun/sunbmac.c | 12 ++++--------
drivers/net/ethernet/ti/cpmac.c | 6 ++----
drivers/net/ethernet/xilinx/ll_temac_main.c | 3 +--
drivers/net/ethernet/xilinx/xilinx_axienet_main.c | 6 ++----
drivers/net/hamradio/scc.c | 10 +++-------
drivers/net/hyperv/netvsc_drv.c | 3 +--
drivers/net/irda/vlsi_ir.c | 15 +++++----------
drivers/net/usb/cdc_mbim.c | 3 +--
drivers/net/usb/cdc_ncm.c | 15 +++++----------
drivers/net/usb/lg-vl600.c | 6 ++----
drivers/net/usb/usbnet.c | 3 +--
drivers/net/vmxnet3/vmxnet3_drv.c | 9 +++------
drivers/net/wireless/ath/ar5523/ar5523.c | 6 ++----
drivers/net/wireless/ath/ath10k/mac.c | 6 ++----
drivers/net/wireless/ath/ath9k/htc_drv_txrx.c | 3 +--
drivers/net/wireless/ath/ath9k/main.c | 6 ++----
drivers/net/wireless/ath/ath9k/recv.c | 6 ++----
drivers/net/wireless/ath/wil6210/txrx.c | 6 ++----
drivers/net/wireless/b43/main.c | 9 +++------
drivers/net/wireless/b43legacy/main.c | 9 +++------
drivers/net/wireless/brcm80211/brcmfmac/dhd_linux.c | 3 +--
drivers/net/wireless/brcm80211/brcmsmac/main.c | 12 ++++--------
drivers/net/wireless/ipw2x00/ipw2200.c | 6 ++----
drivers/net/wireless/ipw2x00/libipw_rx.c | 3 +--
drivers/net/wireless/ipw2x00/libipw_tx.c | 3 +--
drivers/net/wireless/mwifiex/init.c | 3 +--
drivers/s390/net/claw.c | 6 ++----
drivers/s390/net/ctcm_mpc.c | 6 ++----
drivers/s390/net/qeth_core_main.c | 6 ++----
drivers/staging/rtl8187se/ieee80211/ieee80211_rx.c | 3 +--
drivers/staging/rtl8187se/ieee80211/ieee80211_tx.c | 3 +--
drivers/staging/rtl8188eu/core/rtw_recv.c | 6 ++----
drivers/staging/rtl8192e/rtllib_rx.c | 3 +--
drivers/staging/rtl8192u/ieee80211/ieee80211_rx.c | 3 +--
drivers/staging/rtl8712/recv_linux.c | 3 +--
drivers/staging/rtl8712/rtl8712_recv.c | 6 ++----
drivers/staging/rtl8712/xmit_linux.c | 3 +--
drivers/staging/sbe-2t3e3/dc.c | 12 ++++--------
drivers/staging/slicoss/slicoss.c | 3 +--
drivers/usb/gadget/f_phonet.c | 6 ++----
drivers/usb/gadget/u_ether.c | 6 ++----
net/core/dev.c | 2 +-
scripts/checkpatch.pl | 2 +-
78 files changed, 163 insertions(+), 324 deletions(-)
--
1.8.4.2
^ permalink raw reply
* [PATCH net-next 02/13] driver: net: remove unnecessary skb NULL check before calling dev_kfree_skb_irq
From: Govindarajulu Varadarajan @ 2013-11-02 13:47 UTC (permalink / raw)
To: davem, gregkh, linux-usb, linux-kernel, schwidefsky, linville,
linux-wireless, netdev, IvDoorn, sbhatewara, samuel, chas, roland,
isdn, jcliburn, benve, ssujith, jeffrey.t.kirsher,
jesse.brandeburg, shahed.shaikh, joe, apw
Cc: Govindarajulu Varadarajan
In-Reply-To: <1383400074-30555-1-git-send-email-govindarajulu90@gmail.com>
dev_kfree_skb_irq is protected from NULL. No need to check for NULL
while calling this function.
Signed-off-by: Govindarajulu Varadarajan <govindarajulu90@gmail.com>
---
drivers/net/ethernet/amd/ni65.c | 6 ++----
drivers/net/ethernet/atheros/atl1c/atl1c_main.c | 10 ++++------
drivers/net/ethernet/atheros/atl1e/atl1e_main.c | 6 ++----
drivers/net/ethernet/atheros/atlx/atl1.c | 6 ++----
drivers/net/ethernet/icplus/ipg.c | 6 ++----
drivers/net/ethernet/intel/e1000e/netdev.c | 3 +--
drivers/net/ethernet/marvell/pxa168_eth.c | 3 +--
drivers/net/ethernet/xilinx/ll_temac_main.c | 3 +--
drivers/net/ethernet/xilinx/xilinx_axienet_main.c | 6 ++----
drivers/net/hamradio/scc.c | 10 +++-------
drivers/net/vmxnet3/vmxnet3_drv.c | 3 +--
drivers/net/wireless/ath/ar5523/ar5523.c | 6 ++----
12 files changed, 23 insertions(+), 45 deletions(-)
diff --git a/drivers/net/ethernet/amd/ni65.c b/drivers/net/ethernet/amd/ni65.c
index 1cf33ad..0695ce2 100644
--- a/drivers/net/ethernet/amd/ni65.c
+++ b/drivers/net/ethernet/amd/ni65.c
@@ -1030,10 +1030,8 @@ static void ni65_xmit_intr(struct net_device *dev,int csr0)
}
#ifdef XMT_VIA_SKB
- if(p->tmd_skb[p->tmdlast]) {
- dev_kfree_skb_irq(p->tmd_skb[p->tmdlast]);
- p->tmd_skb[p->tmdlast] = NULL;
- }
+ dev_kfree_skb_irq(p->tmd_skb[p->tmdlast]);
+ p->tmd_skb[p->tmdlast] = NULL;
#endif
p->tmdlast = (p->tmdlast + 1) & (TMDNUM-1);
diff --git a/drivers/net/ethernet/atheros/atl1c/atl1c_main.c b/drivers/net/ethernet/atheros/atl1c/atl1c_main.c
index a36a760..cf89008 100644
--- a/drivers/net/ethernet/atheros/atl1c/atl1c_main.c
+++ b/drivers/net/ethernet/atheros/atl1c/atl1c_main.c
@@ -848,12 +848,10 @@ static inline void atl1c_clean_buffer(struct pci_dev *pdev,
pci_unmap_page(pdev, buffer_info->dma,
buffer_info->length, pci_driection);
}
- if (buffer_info->skb) {
- if (in_irq)
- dev_kfree_skb_irq(buffer_info->skb);
- else
- dev_kfree_skb(buffer_info->skb);
- }
+ if (in_irq)
+ dev_kfree_skb_irq(buffer_info->skb);
+ else
+ dev_kfree_skb(buffer_info->skb);
buffer_info->dma = 0;
buffer_info->skb = NULL;
ATL1C_SET_BUFFER_STATE(buffer_info, ATL1C_BUFFER_FREE);
diff --git a/drivers/net/ethernet/atheros/atl1e/atl1e_main.c b/drivers/net/ethernet/atheros/atl1e/atl1e_main.c
index 7a73f3a..c3ca8c6 100644
--- a/drivers/net/ethernet/atheros/atl1e/atl1e_main.c
+++ b/drivers/net/ethernet/atheros/atl1e/atl1e_main.c
@@ -1257,10 +1257,8 @@ static bool atl1e_clean_tx_irq(struct atl1e_adapter *adapter)
tx_buffer->dma = 0;
}
- if (tx_buffer->skb) {
- dev_kfree_skb_irq(tx_buffer->skb);
- tx_buffer->skb = NULL;
- }
+ dev_kfree_skb_irq(tx_buffer->skb);
+ tx_buffer->skb = NULL;
if (++next_to_clean == tx_ring->count)
next_to_clean = 0;
diff --git a/drivers/net/ethernet/atheros/atlx/atl1.c b/drivers/net/ethernet/atheros/atlx/atl1.c
index 538211d..b8cc654 100644
--- a/drivers/net/ethernet/atheros/atlx/atl1.c
+++ b/drivers/net/ethernet/atheros/atlx/atl1.c
@@ -2082,10 +2082,8 @@ static int atl1_intr_tx(struct atl1_adapter *adapter)
buffer_info->dma = 0;
}
- if (buffer_info->skb) {
- dev_kfree_skb_irq(buffer_info->skb);
- buffer_info->skb = NULL;
- }
+ dev_kfree_skb_irq(buffer_info->skb);
+ buffer_info->skb = NULL;
if (++sw_tpd_next_to_clean == tpd_ring->count)
sw_tpd_next_to_clean = 0;
diff --git a/drivers/net/ethernet/icplus/ipg.c b/drivers/net/ethernet/icplus/ipg.c
index 25045ae..d3a5e1f 100644
--- a/drivers/net/ethernet/icplus/ipg.c
+++ b/drivers/net/ethernet/icplus/ipg.c
@@ -823,10 +823,8 @@ static void init_tfdlist(struct net_device *dev)
txfd->tfc = cpu_to_le64(IPG_TFC_TFDDONE);
- if (sp->tx_buff[i]) {
- dev_kfree_skb_irq(sp->tx_buff[i]);
- sp->tx_buff[i] = NULL;
- }
+ dev_kfree_skb_irq(sp->tx_buff[i]);
+ sp->tx_buff[i] = NULL;
txfd->next_desc = cpu_to_le64(sp->txd_map +
sizeof(struct ipg_tx)*(i + 1));
diff --git a/drivers/net/ethernet/intel/e1000e/netdev.c b/drivers/net/ethernet/intel/e1000e/netdev.c
index 4ef7867..4c22a1a 100644
--- a/drivers/net/ethernet/intel/e1000e/netdev.c
+++ b/drivers/net/ethernet/intel/e1000e/netdev.c
@@ -1526,8 +1526,7 @@ static bool e1000_clean_jumbo_rx_irq(struct e1000_ring *rx_ring, int *work_done,
/* recycle both page and skb */
buffer_info->skb = skb;
/* an error means any chain goes out the window too */
- if (rx_ring->rx_skb_top)
- dev_kfree_skb_irq(rx_ring->rx_skb_top);
+ dev_kfree_skb_irq(rx_ring->rx_skb_top);
rx_ring->rx_skb_top = NULL;
goto next_desc;
}
diff --git a/drivers/net/ethernet/marvell/pxa168_eth.c b/drivers/net/ethernet/marvell/pxa168_eth.c
index fff6246..7443b11 100644
--- a/drivers/net/ethernet/marvell/pxa168_eth.c
+++ b/drivers/net/ethernet/marvell/pxa168_eth.c
@@ -749,8 +749,7 @@ static int txq_reclaim(struct net_device *dev, int force)
dev->stats.tx_errors++;
}
dma_unmap_single(NULL, addr, count, DMA_TO_DEVICE);
- if (skb)
- dev_kfree_skb_irq(skb);
+ dev_kfree_skb_irq(skb);
released++;
}
txq_reclaim_end:
diff --git a/drivers/net/ethernet/xilinx/ll_temac_main.c b/drivers/net/ethernet/xilinx/ll_temac_main.c
index 0029148..3d21741 100644
--- a/drivers/net/ethernet/xilinx/ll_temac_main.c
+++ b/drivers/net/ethernet/xilinx/ll_temac_main.c
@@ -629,8 +629,7 @@ static void temac_start_xmit_done(struct net_device *ndev)
while (stat & STS_CTRL_APP0_CMPLT) {
dma_unmap_single(ndev->dev.parent, cur_p->phys, cur_p->len,
DMA_TO_DEVICE);
- if (cur_p->app4)
- dev_kfree_skb_irq((struct sk_buff *)cur_p->app4);
+ dev_kfree_skb_irq((struct sk_buff *)cur_p->app4);
cur_p->app0 = 0;
cur_p->app1 = 0;
cur_p->app2 = 0;
diff --git a/drivers/net/ethernet/xilinx/xilinx_axienet_main.c b/drivers/net/ethernet/xilinx/xilinx_axienet_main.c
index b2ff038..f3bcabb 100644
--- a/drivers/net/ethernet/xilinx/xilinx_axienet_main.c
+++ b/drivers/net/ethernet/xilinx/xilinx_axienet_main.c
@@ -589,8 +589,7 @@ static void axienet_start_xmit_done(struct net_device *ndev)
dma_unmap_single(ndev->dev.parent, cur_p->phys,
(cur_p->cntrl & XAXIDMA_BD_CTRL_LENGTH_MASK),
DMA_TO_DEVICE);
- if (cur_p->app4)
- dev_kfree_skb_irq((struct sk_buff *)cur_p->app4);
+ dev_kfree_skb_irq((struct sk_buff *)cur_p->app4);
/*cur_p->phys = 0;*/
cur_p->app0 = 0;
cur_p->app1 = 0;
@@ -1367,8 +1366,7 @@ static void axienet_dma_err_handler(unsigned long data)
(cur_p->cntrl &
XAXIDMA_BD_CTRL_LENGTH_MASK),
DMA_TO_DEVICE);
- if (cur_p->app4)
- dev_kfree_skb_irq((struct sk_buff *) cur_p->app4);
+ dev_kfree_skb_irq((struct sk_buff *) cur_p->app4);
cur_p->phys = 0;
cur_p->cntrl = 0;
cur_p->status = 0;
diff --git a/drivers/net/hamradio/scc.c b/drivers/net/hamradio/scc.c
index 4bc6ee8..0abd1e3 100644
--- a/drivers/net/hamradio/scc.c
+++ b/drivers/net/hamradio/scc.c
@@ -496,11 +496,8 @@ static inline void scc_exint(struct scc_channel *scc)
scc->stat.tx_under++; /* oops, an underrun! count 'em */
Outb(scc->ctrl, RES_EXT_INT); /* reset ext/status interrupts */
- if (scc->tx_buff != NULL)
- {
- dev_kfree_skb_irq(scc->tx_buff);
- scc->tx_buff = NULL;
- }
+ dev_kfree_skb_irq(scc->tx_buff);
+ scc->tx_buff = NULL;
or(scc,R10,ABUNDER);
scc_start_tx_timer(scc, t_txdelay, 0); /* restart transmission */
@@ -577,8 +574,7 @@ static inline void scc_spint(struct scc_channel *scc)
scc->stat.rx_over++; /* count them */
or(scc,R3,ENT_HM); /* enter hunt mode for next flag */
- if (skb != NULL)
- dev_kfree_skb_irq(skb);
+ dev_kfree_skb_irq(skb);
scc->rx_buff = skb = NULL;
}
diff --git a/drivers/net/vmxnet3/vmxnet3_drv.c b/drivers/net/vmxnet3/vmxnet3_drv.c
index 7e2788c..64ca248 100644
--- a/drivers/net/vmxnet3/vmxnet3_drv.c
+++ b/drivers/net/vmxnet3/vmxnet3_drv.c
@@ -1142,8 +1142,7 @@ vmxnet3_rx_error(struct vmxnet3_rx_queue *rq, struct Vmxnet3_RxCompDesc *rcd,
* ctx->skb may be NULL if this is the first and the only one
* desc for the pkt
*/
- if (ctx->skb)
- dev_kfree_skb_irq(ctx->skb);
+ dev_kfree_skb_irq(ctx->skb);
ctx->skb = NULL;
}
diff --git a/drivers/net/wireless/ath/ar5523/ar5523.c b/drivers/net/wireless/ath/ar5523/ar5523.c
index 280fc3d..cb0dd61 100644
--- a/drivers/net/wireless/ath/ar5523/ar5523.c
+++ b/drivers/net/wireless/ath/ar5523/ar5523.c
@@ -601,10 +601,8 @@ static void ar5523_data_rx_cb(struct urb *urb)
data->skb = NULL;
skip:
- if (data->skb) {
- dev_kfree_skb_irq(data->skb);
- data->skb = NULL;
- }
+ dev_kfree_skb_irq(data->skb);
+ data->skb = NULL;
ar5523_rx_data_put(ar, data);
if (atomic_inc_return(&ar->rx_data_free_cnt) >=
--
1.8.4.2
^ permalink raw reply related
* [PATCH net-next 10/13] driver: infiniband: remove unnecessary NULL check before dev_kfree_skb_any
From: Govindarajulu Varadarajan @ 2013-11-02 13:47 UTC (permalink / raw)
To: davem, gregkh, linux-usb, linux-kernel, schwidefsky, linville,
linux-wireless, netdev, IvDoorn, sbhatewara, samuel, chas, roland,
isdn, jcliburn, benve, ssujith, jeffrey.t.kirsher,
jesse.brandeburg, shahed.shaikh, joe, apw
Cc: Govindarajulu Varadarajan
In-Reply-To: <1383400074-30555-1-git-send-email-govindarajulu90@gmail.com>
dev_kfree_skb_any is protected from NULL. No need to check for NULL
while calling this function.
Signed-off-by: Govindarajulu Varadarajan <govindarajulu90@gmail.com>
---
drivers/infiniband/hw/amso1100/c2.c | 6 ++----
drivers/infiniband/hw/nes/nes_hw.c | 3 +--
2 files changed, 3 insertions(+), 6 deletions(-)
diff --git a/drivers/infiniband/hw/amso1100/c2.c b/drivers/infiniband/hw/amso1100/c2.c
index d53cf51..30c4d00 100644
--- a/drivers/infiniband/hw/amso1100/c2.c
+++ b/drivers/infiniband/hw/amso1100/c2.c
@@ -312,10 +312,8 @@ static inline int c2_tx_free(struct c2_dev *c2dev, struct c2_element *elem)
pci_unmap_single(c2dev->pcidev, elem->mapaddr, elem->maplen,
PCI_DMA_TODEVICE);
- if (elem->skb) {
- dev_kfree_skb_any(elem->skb);
- elem->skb = NULL;
- }
+ dev_kfree_skb_any(elem->skb);
+ elem->skb = NULL;
return 0;
}
diff --git a/drivers/infiniband/hw/nes/nes_hw.c b/drivers/infiniband/hw/nes/nes_hw.c
index 9020024..2275a8e 100644
--- a/drivers/infiniband/hw/nes/nes_hw.c
+++ b/drivers/infiniband/hw/nes/nes_hw.c
@@ -2856,8 +2856,7 @@ void nes_nic_ce_handler(struct nes_device *nesdev, struct nes_hw_nic_cq *cq)
break;
}
}
- if (skb)
- dev_kfree_skb_any(skb);
+ dev_kfree_skb_any(skb);
nesnic->sq_tail++;
nesnic->sq_tail &= nesnic->sq_size-1;
if (sq_cqes > 128) {
--
1.8.4.2
^ permalink raw reply related
* [PATCH net-next 12/13] driver: net: fix space before '(' and remove extra variable
From: Govindarajulu Varadarajan @ 2013-11-02 13:47 UTC (permalink / raw)
To: davem, gregkh, linux-usb, linux-kernel, schwidefsky, linville,
linux-wireless, netdev, IvDoorn, sbhatewara, samuel, chas, roland,
isdn, jcliburn, benve, ssujith, jeffrey.t.kirsher,
jesse.brandeburg, shahed.shaikh, joe, apw
Cc: Govindarajulu Varadarajan
In-Reply-To: <1383400074-30555-1-git-send-email-govindarajulu90@gmail.com>
Signed-off-by: Govindarajulu Varadarajan <govindarajulu90@gmail.com>
---
drivers/net/ethernet/sgi/ioc3-eth.c | 4 +---
drivers/net/usb/usbnet.c | 2 +-
2 files changed, 2 insertions(+), 4 deletions(-)
diff --git a/drivers/net/ethernet/sgi/ioc3-eth.c b/drivers/net/ethernet/sgi/ioc3-eth.c
index 6bd90f2..80dcfd9 100644
--- a/drivers/net/ethernet/sgi/ioc3-eth.c
+++ b/drivers/net/ethernet/sgi/ioc3-eth.c
@@ -851,13 +851,11 @@ static inline void ioc3_clean_rx_ring(struct ioc3_private *ip)
static inline void ioc3_clean_tx_ring(struct ioc3_private *ip)
{
- struct sk_buff *skb;
int i;
for (i=0; i < 128; i++) {
- skb = ip->tx_skbs[i];
+ dev_kfree_skb_any(ip->tx_skbs[i]);
ip->tx_skbs[i] = NULL;
- dev_kfree_skb_any(skb);
ip->txr[i].cmd = 0;
}
ip->tx_pi = 0;
diff --git a/drivers/net/usb/usbnet.c b/drivers/net/usb/usbnet.c
index b37f812..bd18155 100644
--- a/drivers/net/usb/usbnet.c
+++ b/drivers/net/usb/usbnet.c
@@ -1377,7 +1377,7 @@ netdev_tx_t usbnet_start_xmit (struct sk_buff *skb,
drop:
dev->net->stats.tx_dropped++;
not_drop:
- dev_kfree_skb_any (skb);
+ dev_kfree_skb_any(skb);
if (urb) {
kfree(urb->sg);
usb_free_urb(urb);
--
1.8.4.2
^ permalink raw reply related
* [PATCH net-next v2] ipv6: remove old conditions on flow label sharing
From: Florent Fourcot @ 2013-11-02 13:55 UTC (permalink / raw)
To: netdev; +Cc: Florent Fourcot
The code of flow label in Linux Kernel follows
the rules of RFC 1809 (an informational one) for
conditions on flow label sharing. There rules are
not in the last proposed standard for flow label
(RFC 6437), or in the previous one (RFC 3697).
Since this code does not follow any current or
old standard, we can remove it.
With this removal, the ipv6_opt_cmp function is
now a dead code and it can be removed too.
Changelog to v1:
* add justification for the change
* remove the condition on IPv6 options
Signed-off-by: Florent Fourcot <florent.fourcot@enst-bretagne.fr>
---
net/ipv6/ip6_flowlabel.c | 22 ----------------------
1 file changed, 22 deletions(-)
diff --git a/net/ipv6/ip6_flowlabel.c b/net/ipv6/ip6_flowlabel.c
index 46e8843..ff20f5a 100644
--- a/net/ipv6/ip6_flowlabel.c
+++ b/net/ipv6/ip6_flowlabel.c
@@ -476,23 +476,6 @@ static bool ipv6_hdr_cmp(struct ipv6_opt_hdr *h1, struct ipv6_opt_hdr *h2)
return memcmp(h1+1, h2+1, ((h1->hdrlen+1)<<3) - sizeof(*h1));
}
-static bool ipv6_opt_cmp(struct ipv6_txoptions *o1, struct ipv6_txoptions *o2)
-{
- if (o1 == o2)
- return false;
- if (o1 == NULL || o2 == NULL)
- return true;
- if (o1->opt_nflen != o2->opt_nflen)
- return true;
- if (ipv6_hdr_cmp(o1->hopopt, o2->hopopt))
- return true;
- if (ipv6_hdr_cmp(o1->dst0opt, o2->dst0opt))
- return true;
- if (ipv6_hdr_cmp((struct ipv6_opt_hdr *)o1->srcrt, (struct ipv6_opt_hdr *)o2->srcrt))
- return true;
- return false;
-}
-
static inline void fl_link(struct ipv6_pinfo *np, struct ipv6_fl_socklist *sfl,
struct ip6_flowlabel *fl)
{
@@ -603,11 +586,6 @@ recheck:
uid_eq(fl1->owner.uid, fl->owner.uid)))
goto release;
- err = -EINVAL;
- if (!ipv6_addr_equal(&fl1->dst, &fl->dst) ||
- ipv6_opt_cmp(fl1->opt, fl->opt))
- goto release;
-
err = -ENOMEM;
if (sfl1 == NULL)
goto release;
--
1.8.4.rc3
^ permalink raw reply related
* [PATCH v3 net-next] net: introduce dev_set_forwarding()
From: Eric Dumazet @ 2013-11-02 14:01 UTC (permalink / raw)
To: Ben Hutchings
Cc: David Miller, christoph.paasch, herbert, netdev, hkchu, mwdalton
In-Reply-To: <1383091610.1534.29.camel@bwh-desktop.uk.level5networks.com>
From: Eric Dumazet <edumazet@google.com>
Christoph Paasch and Jerry Chu reported crashes in skb_segment() caused
by commit 8a29111c7ca6 ("net: gro: allow to build full sized skb")
skb_segment() only deals with a frag_list chain containing MSS sized
fragments. Even if we fix this problem, its better if GRO layer
doesn't build skb with a frag_list in the first place, to let TSO
packets reaching output devices.
David Miller and Ben Hutchings suggested we keep track of number of
forwarding users to be able to :
- Disable LRO
- Make sure GRO layer do not use skb frag_list to extend skb capacity
Note that after this patch, LRO is automatically re-enabled if
forwarding is disabled on the device, or if a device is removed
from a bridge.
Tested:
lpq84:~# ethtool -k eth0 | grep "large-receive"
large-receive-offload: on
lpq84:~# echo 1 >/proc/sys/net/ipv4/conf/eth0/forwarding
lpq84:~# ethtool -k eth0 | grep "large-receive"
large-receive-offload: off
lpq84:~# echo 0 >/proc/sys/net/ipv4/conf/eth0/forwarding
lpq84:~# ethtool -k eth0 | grep "large-receive"
large-receive-offload: on
lpq84:~# cat /proc/sys/net/ipv4/ip_forward
0
lpq84:~# echo 1 >/proc/sys/net/ipv4/ip_forward
lpq84:~# ethtool -k eth0 | grep "large-receive"
large-receive-offload: off
lpq84:~# echo 0 >/proc/sys/net/ipv4/ip_forward
lpq84:~# ethtool -k eth0 | grep "large-receive"
large-receive-offload: on
Signed-off-by: Eric Dumazet <edumazet@google.com>
Reported-by: Christoph Paasch <christoph.paasch@uclouvain.be>
Reported-by: Jerry Chu <hkchu@google.com>
Cc: Michael Dalton <mwdalton@google.com>
Fixes: 8a29111c7ca6 ("net: gro: allow to build full sized skb")
---
include/linux/netdevice.h | 3 ++-
net/bridge/br_if.c | 4 +++-
net/core/dev.c | 30 +++++++++++++++++++-----------
net/core/skbuff.c | 11 ++++++++---
net/ipv4/devinet.c | 14 ++++++++------
net/ipv6/addrconf.c | 5 ++---
net/ipv6/addrconf_core.c | 2 ++
7 files changed, 44 insertions(+), 25 deletions(-)
diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
index cb1d918ecdf1..6ddd0fa85ae2 100644
--- a/include/linux/netdevice.h
+++ b/include/linux/netdevice.h
@@ -1295,6 +1295,7 @@ struct net_device {
struct netdev_queue __rcu *ingress_queue;
unsigned char broadcast[MAX_ADDR_LEN]; /* hw bcast add */
+ unsigned int forwarding_count;
/*
@@ -1787,7 +1788,7 @@ struct net_device *__dev_get_by_name(struct net *net, const char *name);
int dev_alloc_name(struct net_device *dev, const char *name);
int dev_open(struct net_device *dev);
int dev_close(struct net_device *dev);
-void dev_disable_lro(struct net_device *dev);
+void dev_set_forwarding(struct net_device *dev, int inc);
int dev_loopback_xmit(struct sk_buff *newskb);
int dev_queue_xmit(struct sk_buff *skb);
int register_netdevice(struct net_device *dev);
diff --git a/net/bridge/br_if.c b/net/bridge/br_if.c
index c41d5fbb91d0..959164374ce8 100644
--- a/net/bridge/br_if.c
+++ b/net/bridge/br_if.c
@@ -150,6 +150,8 @@ static void del_nbp(struct net_bridge_port *p)
netdev_rx_handler_unregister(dev);
+ dev_set_forwarding(dev, -1);
+
netdev_upper_dev_unlink(dev, br->dev);
br_multicast_del_port(p);
@@ -377,7 +379,7 @@ int br_add_if(struct net_bridge *br, struct net_device *dev)
dev->priv_flags |= IFF_BRIDGE_PORT;
- dev_disable_lro(dev);
+ dev_set_forwarding(dev, 1);
list_add_rcu(&p->list, &br->port_list);
diff --git a/net/core/dev.c b/net/core/dev.c
index 0054c8c75f50..d1276ea6baf7 100644
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -1408,29 +1408,37 @@ EXPORT_SYMBOL(dev_close);
/**
- * dev_disable_lro - disable Large Receive Offload on a device
- * @dev: device
- *
- * Disable Large Receive Offload (LRO) on a net device. Must be
- * called under RTNL. This is needed if received packets may be
- * forwarded to another interface.
+ * dev_set_forwarding - Keep count of forwarding users for a device
+ * @dev: device
+ * @inc: +1 or -1
+ *
+ * Add or remove forwarding from a device.
+ * When the count of forwarding users is above 0 :
+ * 1) disable LRO (Large Receive Offload) on this device.
+ * 2) instruct GRO layer to not use frag_list to extend skb capacity.
+ * Must be called under RTNL.
+ * This is needed if received packets may be forwarded to another interface.
*/
-void dev_disable_lro(struct net_device *dev)
+void dev_set_forwarding(struct net_device *dev, int inc)
{
/*
- * If we're trying to disable lro on a vlan device
+ * If we're trying to enable forwarding from a vlan device
* use the underlying physical device instead
*/
if (is_vlan_dev(dev))
dev = vlan_dev_real_dev(dev);
- dev->wanted_features &= ~NETIF_F_LRO;
+ dev->forwarding_count += inc;
+ if (dev->forwarding_count)
+ dev->wanted_features &= ~NETIF_F_LRO;
+ else
+ dev->wanted_features |= NETIF_F_LRO;
netdev_update_features(dev);
- if (unlikely(dev->features & NETIF_F_LRO))
+ if (unlikely(dev->forwarding_count && (dev->features & NETIF_F_LRO)))
netdev_WARN(dev, "failed to disable LRO!\n");
}
-EXPORT_SYMBOL(dev_disable_lro);
+EXPORT_SYMBOL(dev_set_forwarding);
static int call_netdevice_notifier(struct notifier_block *nb, unsigned long val,
struct net_device *dev)
diff --git a/net/core/skbuff.c b/net/core/skbuff.c
index 0ab32faa520f..7b1cff884d50 100644
--- a/net/core/skbuff.c
+++ b/net/core/skbuff.c
@@ -2944,9 +2944,11 @@ int skb_gro_receive(struct sk_buff **head, struct sk_buff *skb)
int i = skbinfo->nr_frags;
int nr_frags = pinfo->nr_frags + i;
- if (nr_frags > MAX_SKB_FRAGS)
+ if (nr_frags > MAX_SKB_FRAGS) {
+ if (skb->dev->forwarding_count)
+ return -E2BIG;
goto merge;
-
+ }
offset -= headlen;
pinfo->nr_frags = nr_frags;
skbinfo->nr_frags = 0;
@@ -2977,8 +2979,11 @@ int skb_gro_receive(struct sk_buff **head, struct sk_buff *skb)
unsigned int first_size = headlen - offset;
unsigned int first_offset;
- if (nr_frags + 1 + skbinfo->nr_frags > MAX_SKB_FRAGS)
+ if (nr_frags + 1 + skbinfo->nr_frags > MAX_SKB_FRAGS) {
+ if (skb->dev->forwarding_count)
+ return -E2BIG;
goto merge;
+ }
first_offset = skb->data -
(unsigned char *)page_address(page) +
diff --git a/net/ipv4/devinet.c b/net/ipv4/devinet.c
index a1b5bcbd04ae..cf01e6fb77c5 100644
--- a/net/ipv4/devinet.c
+++ b/net/ipv4/devinet.c
@@ -223,6 +223,8 @@ void in_dev_finish_destroy(struct in_device *idev)
#ifdef NET_REFCNT_DEBUG
pr_debug("%s: %p=%s\n", __func__, idev, dev ? dev->name : "NIL");
#endif
+ if (IPV4_DEVCONF(idev->cnf, FORWARDING))
+ dev_set_forwarding(dev, -1);
dev_put(dev);
if (!idev->dead)
pr_err("Freeing alive in_device %p\n", idev);
@@ -248,7 +250,7 @@ static struct in_device *inetdev_init(struct net_device *dev)
if (!in_dev->arp_parms)
goto out_kfree;
if (IPV4_DEVCONF(in_dev->cnf, FORWARDING))
- dev_disable_lro(dev);
+ dev_set_forwarding(dev, 1);
/* Reference in_dev->dev */
dev_hold(dev);
/* Account for reference dev->ip_ptr (below) */
@@ -1932,8 +1934,8 @@ static void inet_forward_change(struct net *net)
for_each_netdev(net, dev) {
struct in_device *in_dev;
- if (on)
- dev_disable_lro(dev);
+
+ dev_set_forwarding(dev, on ? 1 : -1);
rcu_read_lock();
in_dev = __in_dev_get_rcu(dev);
if (in_dev) {
@@ -1997,7 +1999,7 @@ static int devinet_sysctl_forward(struct ctl_table *ctl, int write,
loff_t pos = *ppos;
int ret = proc_dointvec(ctl, write, buffer, lenp, ppos);
- if (write && *valp != val) {
+ if (write && (!(*valp) != !val)) {
struct net *net = ctl->extra2;
if (valp != &IPV4_DEVCONF_DFLT(net, FORWARDING)) {
@@ -2013,8 +2015,8 @@ static int devinet_sysctl_forward(struct ctl_table *ctl, int write,
struct ipv4_devconf *cnf = ctl->extra1;
struct in_device *idev =
container_of(cnf, struct in_device, cnf);
- if (*valp)
- dev_disable_lro(idev->dev);
+
+ dev_set_forwarding(idev->dev, *valp ? 1 : -1);
inet_netconf_notify_devconf(net,
NETCONFA_FORWARDING,
idev->dev->ifindex,
diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c
index 542d09561ed6..5b8406c6c868 100644
--- a/net/ipv6/addrconf.c
+++ b/net/ipv6/addrconf.c
@@ -322,7 +322,7 @@ static struct inet6_dev *ipv6_add_dev(struct net_device *dev)
return NULL;
}
if (ndev->cnf.forwarding)
- dev_disable_lro(dev);
+ dev_set_forwarding(dev, 1);
/* We refer to the device */
dev_hold(dev);
@@ -638,8 +638,7 @@ static void dev_forward_change(struct inet6_dev *idev)
if (!idev)
return;
dev = idev->dev;
- if (idev->cnf.forwarding)
- dev_disable_lro(dev);
+ dev_set_forwarding(dev, idev->cnf.forwarding ? 1 : -1);
if (dev->flags & IFF_MULTICAST) {
if (idev->cnf.forwarding) {
ipv6_dev_mc_inc(dev, &in6addr_linklocal_allrouters);
diff --git a/net/ipv6/addrconf_core.c b/net/ipv6/addrconf_core.c
index 4c11cbcf8308..b7620ad8366f 100644
--- a/net/ipv6/addrconf_core.c
+++ b/net/ipv6/addrconf_core.c
@@ -139,6 +139,8 @@ void in6_dev_finish_destroy(struct inet6_dev *idev)
#ifdef NET_REFCNT_DEBUG
pr_debug("%s: %s\n", __func__, dev ? dev->name : "NIL");
#endif
+ if (idev->cnf.forwarding)
+ dev_set_forwarding(dev, -1);
dev_put(dev);
if (!idev->dead) {
pr_warn("Freeing alive inet6 device %p\n", idev);
^ permalink raw reply related
* Re: [PATCH v3 net-next] net: introduce dev_set_forwarding()
From: Ben Hutchings @ 2013-11-02 15:46 UTC (permalink / raw)
To: Eric Dumazet
Cc: David Miller, christoph.paasch, herbert, netdev, hkchu, mwdalton
In-Reply-To: <1383400897.4291.47.camel@edumazet-glaptop2.roam.corp.google.com>
On Sat, 2013-11-02 at 07:01 -0700, Eric Dumazet wrote:
[...]
> --- a/net/core/dev.c
> +++ b/net/core/dev.c
[...]
> -void dev_disable_lro(struct net_device *dev)
> +void dev_set_forwarding(struct net_device *dev, int inc)
> {
> /*
> - * If we're trying to disable lro on a vlan device
> + * If we're trying to enable forwarding from a vlan device
> * use the underlying physical device instead
> */
> if (is_vlan_dev(dev))
> dev = vlan_dev_real_dev(dev);
>
> - dev->wanted_features &= ~NETIF_F_LRO;
> + dev->forwarding_count += inc;
> + if (dev->forwarding_count)
> + dev->wanted_features &= ~NETIF_F_LRO;
> + else
> + dev->wanted_features |= NETIF_F_LRO;
> netdev_update_features(dev);
[...]
We should not change dev->wanted_features any more. It should only be
set as requested by userland.
Instead, netdev_update_features() should mask out NETIF_F_LRO based on
dev->forwarding_count.
Ben.
--
Ben Hutchings, Staff Engineer, Solarflare
Not speaking for my employer; that's the marketing department's job.
They asked us to note that Solarflare product names are trademarked.
^ permalink raw reply
* [PATCH RFC] ipv6: enable IPV6_FLOWLABEL_MGR for getsockopt
From: Florent Fourcot @ 2013-11-02 16:58 UTC (permalink / raw)
To: netdev; +Cc: Florent Fourcot
It is already possible to set/put/renew a label
with IPV6_FLOWLABEL_MGR and setsockopt. This patch
add the possibility to get information about this
label (current value, time before expiration, etc).
It helps application to take decision for a renew
or a release of the label.
Signed-off-by: Florent Fourcot <florent.fourcot@enst-bretagne.fr>
---
include/net/ipv6.h | 1 +
net/ipv6/ip6_flowlabel.c | 23 +++++++++++++++++++++++
net/ipv6/ipv6_sockglue.c | 23 +++++++++++++++++++++++
3 files changed, 47 insertions(+)
diff --git a/include/net/ipv6.h b/include/net/ipv6.h
index dd96638..2a5f668 100644
--- a/include/net/ipv6.h
+++ b/include/net/ipv6.h
@@ -250,6 +250,7 @@ struct ipv6_txoptions *fl6_merge_options(struct ipv6_txoptions *opt_space,
struct ipv6_txoptions *fopt);
void fl6_free_socklist(struct sock *sk);
int ipv6_flowlabel_opt(struct sock *sk, char __user *optval, int optlen);
+int ipv6_flowlabel_opt_get(struct sock *sk, struct in6_flowlabel_req *freq);
int ip6_flowlabel_init(void);
void ip6_flowlabel_cleanup(void);
diff --git a/net/ipv6/ip6_flowlabel.c b/net/ipv6/ip6_flowlabel.c
index 819578e..34f58b7 100644
--- a/net/ipv6/ip6_flowlabel.c
+++ b/net/ipv6/ip6_flowlabel.c
@@ -475,6 +475,29 @@ static inline void fl_link(struct ipv6_pinfo *np, struct ipv6_fl_socklist *sfl,
spin_unlock_bh(&ip6_sk_fl_lock);
}
+int ipv6_flowlabel_opt_get(struct sock *sk, struct in6_flowlabel_req *freq)
+{
+ struct ipv6_pinfo *np = inet6_sk(sk);
+ struct ipv6_fl_socklist *sfl;
+
+ rcu_read_lock_bh();
+ for_each_sk_fl_rcu(np, sfl) {
+ if (sfl->fl->label == (np->flow_label & IPV6_FLOWLABEL_MASK)) {
+ freq->flr_label = sfl->fl->label;
+ freq->flr_dst = sfl->fl->dst;
+ freq->flr_share = sfl->fl->share;
+ freq->flr_expires = (sfl->fl->expires - jiffies) / HZ;
+ freq->flr_linger = sfl->fl->linger / HZ;
+
+ rcu_read_unlock_bh();
+ return 0;
+ }
+ }
+ rcu_read_unlock_bh();
+
+ return 0;
+}
+
int ipv6_flowlabel_opt(struct sock *sk, char __user *optval, int optlen)
{
int uninitialized_var(err);
diff --git a/net/ipv6/ipv6_sockglue.c b/net/ipv6/ipv6_sockglue.c
index 4919a8e..9ca96c2 100644
--- a/net/ipv6/ipv6_sockglue.c
+++ b/net/ipv6/ipv6_sockglue.c
@@ -1212,6 +1212,29 @@ static int do_ipv6_getsockopt(struct sock *sk, int level, int optname,
val = np->sndflow;
break;
+ case IPV6_FLOWLABEL_MGR:
+ {
+ struct in6_flowlabel_req freq;
+
+ if (len < sizeof(freq))
+ return -EINVAL;
+
+ len = sizeof(freq);
+ memset(&freq, 0, sizeof(freq));
+
+ val = ipv6_flowlabel_opt_get(sk, &freq);
+ if (val < 0)
+ return val;
+
+ if (put_user(len, optlen))
+ return -EFAULT;
+ if (copy_to_user(optval, &freq, len))
+ return -EFAULT;
+
+ return 0;
+ break;
+ }
+
case IPV6_ADDR_PREFERENCES:
val = 0;
--
1.8.4.rc3
^ permalink raw reply related
* Re: [PATCH v3 net-next] net: introduce dev_set_forwarding()
From: Eric Dumazet @ 2013-11-02 18:20 UTC (permalink / raw)
To: Ben Hutchings
Cc: David Miller, christoph.paasch, herbert, netdev, hkchu, mwdalton
In-Reply-To: <1383407176.2764.17.camel@deadeye.wl.decadent.org.uk>
On Sat, 2013-11-02 at 15:46 +0000, Ben Hutchings wrote:
> We should not change dev->wanted_features any more. It should only be
> set as requested by userland.
>
> Instead, netdev_update_features() should mask out NETIF_F_LRO based on
> dev->forwarding_count.
Oh right, I'll send a V4 to make the right thing in
netdev_fix_features()
Thanks !
^ permalink raw reply
* Re: [PATCH v2 net-next] net: introduce gro_frag_list_enable sysctl
From: Eric Dumazet @ 2013-11-02 18:28 UTC (permalink / raw)
To: Oleg A.Arkhangelsky
Cc: David Miller, hkchu@google.com, herbert@gondor.apana.org.au,
christoph.paasch@uclouvain.be, netdev@vger.kernel.org,
mwdalton@google.com
In-Reply-To: <44571383414236@web13j.yandex.ru>
On Sat, 2013-11-02 at 21:43 +0400, Oleg A.Arkhangelsky wrote:
>
> 30.10.2013, 06:33, "David Miller" <davem@davemloft.net>:
>
> > GRO should always win, even on a router, because it decreases the
> > number of fundamental operations (routing lookups) that the stack
> > needs to perform.
>
> Yes, unless the case when you're using Linux as IP router which is
> forwarding 500K mixed IP (TCP and UDP) flows traffic @ 10-20 Gbit/s.
> Then GRO is unnecessarily overhead, cause there's no possibility to
> accumulate adequate GRO list in such scenario.
>
This was assuming the aggregation factor was not 0.
Even with 500K flows, you can have typically bursts of two packets per
flow.
Thats one of the reason why I chose to default
/proc/sys/net/ipv4/tcp_min_tso_segs to 2
^ permalink raw reply
* Re: [PATCH net-next 00/10] Mellanox driver updates Oct 31 2013
From: Or Gerlitz @ 2013-11-02 19:14 UTC (permalink / raw)
To: David Miller
Cc: Or Gerlitz, netdev@vger.kernel.org, Amir Vadai, Roland Dreier,
Jack Morgenstein
In-Reply-To: <20131102.022003.626036008640723018.davem@davemloft.net>
On Sat, Nov 2, 2013 at 8:20 AM, David Miller <davem@davemloft.net> wrote:
> From: Or Gerlitz <ogerlitz@mellanox.com>
>> The series is against net-next commit ba48650 "ipv6: remove the
>> unnecessary statement in find_match()"
>> Patch #1 is bug fix which needs to go into -stable of kernels >= 3.10
> You cannot submit via net-next a bug fix that you want to go to -stable.
> I've stated this a thousand times.
> You MUST submit the bug fix for "net", not "net-next".
> I'm tossing this entire series, submit your changes correctly.
Dave, I was under the impression that since its way very late into the
3.12 cycle, the fix should land in 3.13-rc1 and fly to 3.12-stable
from there. I understand now (and sorry but this stating of your I
probably missed) that such fixes we need to submit for "net" and you
will take it from there, will do.
Or.
^ permalink raw reply
* Re: [PATCH NEXT V2] rtlwifi: Fix endian error in extracting packet type
From: Larry Finger @ 2013-11-02 19:22 UTC (permalink / raw)
To: Joe Perches, Ben Hutchings
Cc: linville, linux-wireless, Mark Cave-Ayland, netdev, Stable
In-Reply-To: <1383270515.2769.15.camel@joe-AO722>
On 10/31/2013 08:48 PM, Joe Perches wrote:
> On Fri, 2013-11-01 at 01:02 +0000, Ben Hutchings wrote:
>> On Thu, 2013-10-31 at 19:43 -0500, Larry Finger wrote:
>>> From: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
>>>
>>> All of the rtlwifi drivers have an error in the routine that tests if
>>> the data is "special". If it is, the subsequant transmission will be
>>> at the lowest rate to enhance reliability. The 16-bit quantity is
>>> big-endian, but was being extracted in native CPU mode. One of the
>>> effects of this bug is to inhibit association under some conditions
>>> as the TX rate is too high.
>>>
>>> A statement that would have made the code correct had been changed to
>>> a comment. Rather than just reinstating that code, the fix here passes
>>> sparse tests. A side effect of fixing this problem would have been to force
>>> all IPv6 frames to run at the lowest rate. The test for that frame type
>>> is removed.
>>>
>>> The original code only checked the lower-order byte of UDP ports for BOOTP
>>> protocol. That is extended to the full 16-bit source and destination ports.
>>>
>>> One of the local headers contained duplicates of some of the ETH_P_XXX
>>> definitions. These are deleted.
>>>
>>> Signed-off-by: Larry Finger <Larry.Finger@lwfinger.net>
>>> Cc: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
>>> Cc: Stable <stable@vger.kernel.org> [2.6.38+]
>>> ---
>>>
>>> V2 - Addresses comments by Ben Hutchings and Bjorn Mork.
>>>
>>> drivers/net/wireless/rtlwifi/base.c | 15 ++++++---------
>>> drivers/net/wireless/rtlwifi/wifi.h | 6 +-----
>>> 2 files changed, 7 insertions(+), 14 deletions(-)
>>> Index: wireless-testing-save/drivers/net/wireless/rtlwifi/base.c
>>> ===================================================================
>>> --- wireless-testing-save.orig/drivers/net/wireless/rtlwifi/base.c
>>> +++ wireless-testing-save/drivers/net/wireless/rtlwifi/base.c
>>> @@ -1077,17 +1077,17 @@ u8 rtl_is_special_data(struct ieee80211_
>>>
>>> ip = (struct iphdr *)((u8 *) skb->data + mac_hdr_len +
>>> SNAP_SIZE + PROTOC_TYPE_SIZE);
>>> - ether_type = *(u16 *) ((u8 *) skb->data + mac_hdr_len + SNAP_SIZE);
>>> - /* ether_type = ntohs(ether_type); */
>>> + ether_type = be16_to_cpu(*(__be16 *)((u8 *)skb->data + mac_hdr_len +
>>> + SNAP_SIZE));
>>>
>>> if (ETH_P_IP == ether_type) {
>>> if (IPPROTO_UDP == ip->protocol) {
>>> struct udphdr *udp = (struct udphdr *)((u8 *) ip +
>>> (ip->ihl << 2));
>>> - if (((((u8 *) udp)[1] == 68) &&
>>> - (((u8 *) udp)[3] == 67)) ||
>>> - ((((u8 *) udp)[1] == 67) &&
>>> - (((u8 *) udp)[3] == 68))) {
>>> + if (((((u16 *) udp)[0] == 68) &&
>>> + (((u16 *) udp)[2] == 67)) ||
>>> + ((((u16 *) udp)[0] == 67) &&
>>> + (((u16 *) udp)[2] == 68))) {
>> [...]
>>
>> Now you're missing byte-swapping here, and using the wrong offset for
>> the dest port (4 bytes rather than 2).
>>
>> If you really think this is necessary then use something like:
>> if ((udp->source == htons(68) &&
>> udp->dest == htons(67)) ||
>> ...
>
> Or maybe something like this?
> ---
> drivers/net/wireless/rtlwifi/base.c | 91 +++++++++++++++++--------------------
> 1 file changed, 41 insertions(+), 50 deletions(-)
>
> diff --git a/drivers/net/wireless/rtlwifi/base.c b/drivers/net/wireless/rtlwifi/base.c
> index 9a78e3d..7e9df65 100644
> --- a/drivers/net/wireless/rtlwifi/base.c
> +++ b/drivers/net/wireless/rtlwifi/base.c
> @@ -37,6 +37,7 @@
>
> #include <linux/ip.h>
> #include <linux/module.h>
> +#include <linux/udp.h>
>
> /*
> *NOTICE!!!: This file will be very big, we should
> @@ -1074,64 +1075,54 @@ u8 rtl_is_special_data(struct ieee80211_hw *hw, struct sk_buff *skb, u8 is_tx)
> if (!ieee80211_is_data(fc))
> return false;
>
> + ip = (const struct iphdr *)(skb->data + mac_hdr_len +
> + SNAP_SIZE + PROTOC_TYPE_SIZE);
> + ether_type = be16_to_cpup((__be16 *)
> + (skb->data + mac_hdr_len + SNAP_SIZE));
>
> - ip = (struct iphdr *)((u8 *) skb->data + mac_hdr_len +
> - SNAP_SIZE + PROTOC_TYPE_SIZE);
> - ether_type = *(u16 *) ((u8 *) skb->data + mac_hdr_len + SNAP_SIZE);
> - /* ether_type = ntohs(ether_type); */
> -
> - if (ETH_P_IP == ether_type) {
> - if (IPPROTO_UDP == ip->protocol) {
> - struct udphdr *udp = (struct udphdr *)((u8 *) ip +
> - (ip->ihl << 2));
> - if (((((u8 *) udp)[1] == 68) &&
> - (((u8 *) udp)[3] == 67)) ||
> - ((((u8 *) udp)[1] == 67) &&
> - (((u8 *) udp)[3] == 68))) {
> - /*
> - * 68 : UDP BOOTP client
> - * 67 : UDP BOOTP server
> - */
> - RT_TRACE(rtlpriv, (COMP_SEND | COMP_RECV),
> - DBG_DMESG, "dhcp %s !!\n",
> - is_tx ? "Tx" : "Rx");
> -
> - if (is_tx) {
> - rtlpriv->enter_ps = false;
> - schedule_work(&rtlpriv->
> - works.lps_change_work);
> - ppsc->last_delaylps_stamp_jiffies =
> - jiffies;
> - }
> + switch (ether_type) {
> + case ETH_P_IP: {
> + struct udphdr *udp;
> + u16 src;
> + u16 dst;
>
> - return true;
> - }
> - }
> - } else if (ETH_P_ARP == ether_type) {
> - if (is_tx) {
> - rtlpriv->enter_ps = false;
> - schedule_work(&rtlpriv->works.lps_change_work);
> - ppsc->last_delaylps_stamp_jiffies = jiffies;
> - }
> + if (ip->protocol != IPPROTO_UDP)
> + return false;
>
> - return true;
> - } else if (ETH_P_PAE == ether_type) {
> - RT_TRACE(rtlpriv, (COMP_SEND | COMP_RECV), DBG_DMESG,
> - "802.1X %s EAPOL pkt!!\n", is_tx ? "Tx" : "Rx");
> + udp = (struct udphdr *)((u8 *)ip + (ip->ihl << 2));
> + src = be16_to_cpu(udp->source) >> 8;
> + dst = be16_to_cpu(udp->dest) >> 8;
>
> - if (is_tx) {
> - rtlpriv->enter_ps = false;
> - schedule_work(&rtlpriv->works.lps_change_work);
> - ppsc->last_delaylps_stamp_jiffies = jiffies;
> - }
> + /*
> + * 68 : UDP BOOTP client
> + * 67 : UDP BOOTP server
> + */
> + if (!((src == 68 && dst == 67) || (src == 67 && dst == 68)))
> + return false;
>
> + RT_TRACE(rtlpriv, (COMP_SEND | COMP_RECV), DBG_DMESG,
> + "dhcp %s !!\n", is_tx ? "Tx" : "Rx");
> + break;
> + }
> + case ETH_P_ARP:
> + break;
> + case ETH_P_PAE:
> + RT_TRACE(rtlpriv, (COMP_SEND | COMP_RECV), DBG_DMESG,
> + "802.1X %s EAPOL pkt!!\n", is_tx ? "Tx" : "Rx");
> + break;
> + case ETH_P_IPV6:
> return true;
> - } else if (ETH_P_IPV6 == ether_type) {
> - /* IPv6 */
> - return true;
> + default:
> + return false;
> }
>
> - return false;
> + if (is_tx) {
> + rtlpriv->enter_ps = false;
> + schedule_work(&rtlpriv->works.lps_change_work);
> + ppsc->last_delaylps_stamp_jiffies = jiffies;
> + }
> +
> + return true;
> }
> EXPORT_SYMBOL_GPL(rtl_is_special_data);
Joe,
Thanks for this. I have rewritten the function somewhat along these lines. It is
much cleaner this way.
Larry
^ permalink raw reply
* [PATCH NEXT V2] rtlwifi: Fix endian error in extracting packet type
From: Larry Finger @ 2013-11-02 19:23 UTC (permalink / raw)
To: linville; +Cc: linux-wireless, Mark Cave-Ayland, netdev, Larry Finger, Stable
From: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
All of the rtlwifi drivers have an error in the routine that tests if
the data is "special". If it is, the subsequant transmission will be
at the lowest rate to enhance reliability. The 16-bit quantity is
big-endian, but was being extracted in native CPU mode. One of the
effects of this bug is to inhibit association under some conditions
as the TX rate is too high.
Based on suggestions by Joe Perches, the entire routine is rewritten.
One of the local headers contained duplicates of some of the ETH_P_XXX
definitions. These are deleted.
Signed-off-by: Larry Finger <Larry.Finger@lwfinger.net>
Cc: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
Cc: Stable <stable@vger.kernel.org> [2.6.38+]
---
V2 - Addresses comments by Ben Hutchings and Bjorn Mork.
V3 - Rewrite of rtl_is_special_data()
drivers/net/wireless/rtlwifi/base.c | 15 ++++++---------
drivers/net/wireless/rtlwifi/wifi.h | 6 +-----
2 files changed, 7 insertions(+), 14 deletions(-)
Index: wireless-testing/drivers/net/wireless/rtlwifi/base.c
===================================================================
--- wireless-testing.orig/drivers/net/wireless/rtlwifi/base.c
+++ wireless-testing/drivers/net/wireless/rtlwifi/base.c
@@ -37,6 +37,7 @@
#include <linux/ip.h>
#include <linux/module.h>
+#include <linux/udp.h>
/*
*NOTICE!!!: This file will be very big, we should
@@ -1074,64 +1075,52 @@ u8 rtl_is_special_data(struct ieee80211_
if (!ieee80211_is_data(fc))
return false;
+ ip = (const struct iphdr *)(skb->data + mac_hdr_len +
+ SNAP_SIZE + PROTOC_TYPE_SIZE);
+ ether_type = be16_to_cpup((__be16 *)
+ (skb->data + mac_hdr_len + SNAP_SIZE));
+
+ switch (ether_type) {
+ case ETH_P_IP: {
+ struct udphdr *udp;
+ u16 src;
+ u16 dst;
+
+ if (ip->protocol != IPPROTO_UDP)
+ return false;
+ udp = (struct udphdr *)((u8 *)ip + (ip->ihl << 2));
+ src = be16_to_cpu(udp->source);
+ dst = be16_to_cpu(udp->dest);
+
+ /* If this case involves port 68 (UDP BOOTP client) connecting
+ * with port 67 (UDP BOOTP server), then return true so that
+ * the lowest speed is used.
+ */
+ if (!((src == 68 && dst == 67) || (src == 67 && dst == 68)))
+ return false;
- ip = (struct iphdr *)((u8 *) skb->data + mac_hdr_len +
- SNAP_SIZE + PROTOC_TYPE_SIZE);
- ether_type = *(u16 *) ((u8 *) skb->data + mac_hdr_len + SNAP_SIZE);
- /* ether_type = ntohs(ether_type); */
-
- if (ETH_P_IP == ether_type) {
- if (IPPROTO_UDP == ip->protocol) {
- struct udphdr *udp = (struct udphdr *)((u8 *) ip +
- (ip->ihl << 2));
- if (((((u8 *) udp)[1] == 68) &&
- (((u8 *) udp)[3] == 67)) ||
- ((((u8 *) udp)[1] == 67) &&
- (((u8 *) udp)[3] == 68))) {
- /*
- * 68 : UDP BOOTP client
- * 67 : UDP BOOTP server
- */
- RT_TRACE(rtlpriv, (COMP_SEND | COMP_RECV),
- DBG_DMESG, "dhcp %s !!\n",
- is_tx ? "Tx" : "Rx");
-
- if (is_tx) {
- rtlpriv->enter_ps = false;
- schedule_work(&rtlpriv->
- works.lps_change_work);
- ppsc->last_delaylps_stamp_jiffies =
- jiffies;
- }
-
- return true;
- }
- }
- } else if (ETH_P_ARP == ether_type) {
- if (is_tx) {
- rtlpriv->enter_ps = false;
- schedule_work(&rtlpriv->works.lps_change_work);
- ppsc->last_delaylps_stamp_jiffies = jiffies;
- }
-
- return true;
- } else if (ETH_P_PAE == ether_type) {
+ RT_TRACE(rtlpriv, (COMP_SEND | COMP_RECV), DBG_DMESG,
+ "dhcp %s !!\n", is_tx ? "Tx" : "Rx");
+ break;
+ }
+ case ETH_P_ARP:
+ break;
+ case ETH_P_PAE:
RT_TRACE(rtlpriv, (COMP_SEND | COMP_RECV), DBG_DMESG,
"802.1X %s EAPOL pkt!!\n", is_tx ? "Tx" : "Rx");
-
- if (is_tx) {
- rtlpriv->enter_ps = false;
- schedule_work(&rtlpriv->works.lps_change_work);
- ppsc->last_delaylps_stamp_jiffies = jiffies;
- }
-
- return true;
- } else if (ETH_P_IPV6 == ether_type) {
- /* IPv6 */
- return true;
+ break;
+ case ETH_P_IPV6:
+ /* TODO: Is this right? */
+ return false;
+ default:
+ return false;
}
-
- return false;
+ if (is_tx) {
+ rtlpriv->enter_ps = false;
+ schedule_work(&rtlpriv->works.lps_change_work);
+ ppsc->last_delaylps_stamp_jiffies = jiffies;
+ }
+ return true;
}
EXPORT_SYMBOL_GPL(rtl_is_special_data);
Index: wireless-testing/drivers/net/wireless/rtlwifi/wifi.h
===================================================================
--- wireless-testing.orig/drivers/net/wireless/rtlwifi/wifi.h
+++ wireless-testing/drivers/net/wireless/rtlwifi/wifi.h
@@ -77,11 +77,7 @@
#define RTL_SLOT_TIME_9 9
#define RTL_SLOT_TIME_20 20
-/*related with tcp/ip. */
-/*if_ehther.h*/
-#define ETH_P_PAE 0x888E /*Port Access Entity (IEEE 802.1X) */
-#define ETH_P_IP 0x0800 /*Internet Protocol packet */
-#define ETH_P_ARP 0x0806 /*Address Resolution packet */
+/*related to tcp/ip. */
#define SNAP_SIZE 6
#define PROTOC_TYPE_SIZE 2
^ permalink raw reply
* [PATCH NEXT V3] rtlwifi: Fix endian error in extracting packet type
From: Larry Finger @ 2013-11-02 19:28 UTC (permalink / raw)
To: linville; +Cc: linux-wireless, Mark Cave-Ayland, netdev, Larry Finger, Stable
From: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
All of the rtlwifi drivers have an error in the routine that tests if
the data is "special". If it is, the subsequant transmission will be
at the lowest rate to enhance reliability. The 16-bit quantity is
big-endian, but was being extracted in native CPU mode. One of the
effects of this bug is to inhibit association under some conditions
as the TX rate is too high.
Based on suggestions by Joe Perches, the entire routine is rewritten.
One of the local headers contained duplicates of some of the ETH_P_XXX
definitions. These are deleted.
Signed-off-by: Larry Finger <Larry.Finger@lwfinger.net>
Cc: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
Cc: Stable <stable@vger.kernel.org> [2.6.38+]
---
V2 - Addresses comments by Ben Hutchings and Bjorn Mork.
V3 - Rewrite of rtl_is_special_data()
drivers/net/wireless/rtlwifi/base.c | 15 ++++++---------
drivers/net/wireless/rtlwifi/wifi.h | 6 +-----
2 files changed, 7 insertions(+), 14 deletions(-)
Index: wireless-testing/drivers/net/wireless/rtlwifi/base.c
===================================================================
--- wireless-testing.orig/drivers/net/wireless/rtlwifi/base.c
+++ wireless-testing/drivers/net/wireless/rtlwifi/base.c
@@ -37,6 +37,7 @@
#include <linux/ip.h>
#include <linux/module.h>
+#include <linux/udp.h>
/*
*NOTICE!!!: This file will be very big, we should
@@ -1074,64 +1075,52 @@ u8 rtl_is_special_data(struct ieee80211_
if (!ieee80211_is_data(fc))
return false;
+ ip = (const struct iphdr *)(skb->data + mac_hdr_len +
+ SNAP_SIZE + PROTOC_TYPE_SIZE);
+ ether_type = be16_to_cpup((__be16 *)
+ (skb->data + mac_hdr_len + SNAP_SIZE));
+
+ switch (ether_type) {
+ case ETH_P_IP: {
+ struct udphdr *udp;
+ u16 src;
+ u16 dst;
+
+ if (ip->protocol != IPPROTO_UDP)
+ return false;
+ udp = (struct udphdr *)((u8 *)ip + (ip->ihl << 2));
+ src = be16_to_cpu(udp->source);
+ dst = be16_to_cpu(udp->dest);
+
+ /* If this case involves port 68 (UDP BOOTP client) connecting
+ * with port 67 (UDP BOOTP server), then return true so that
+ * the lowest speed is used.
+ */
+ if (!((src == 68 && dst == 67) || (src == 67 && dst == 68)))
+ return false;
- ip = (struct iphdr *)((u8 *) skb->data + mac_hdr_len +
- SNAP_SIZE + PROTOC_TYPE_SIZE);
- ether_type = *(u16 *) ((u8 *) skb->data + mac_hdr_len + SNAP_SIZE);
- /* ether_type = ntohs(ether_type); */
-
- if (ETH_P_IP == ether_type) {
- if (IPPROTO_UDP == ip->protocol) {
- struct udphdr *udp = (struct udphdr *)((u8 *) ip +
- (ip->ihl << 2));
- if (((((u8 *) udp)[1] == 68) &&
- (((u8 *) udp)[3] == 67)) ||
- ((((u8 *) udp)[1] == 67) &&
- (((u8 *) udp)[3] == 68))) {
- /*
- * 68 : UDP BOOTP client
- * 67 : UDP BOOTP server
- */
- RT_TRACE(rtlpriv, (COMP_SEND | COMP_RECV),
- DBG_DMESG, "dhcp %s !!\n",
- is_tx ? "Tx" : "Rx");
-
- if (is_tx) {
- rtlpriv->enter_ps = false;
- schedule_work(&rtlpriv->
- works.lps_change_work);
- ppsc->last_delaylps_stamp_jiffies =
- jiffies;
- }
-
- return true;
- }
- }
- } else if (ETH_P_ARP == ether_type) {
- if (is_tx) {
- rtlpriv->enter_ps = false;
- schedule_work(&rtlpriv->works.lps_change_work);
- ppsc->last_delaylps_stamp_jiffies = jiffies;
- }
-
- return true;
- } else if (ETH_P_PAE == ether_type) {
+ RT_TRACE(rtlpriv, (COMP_SEND | COMP_RECV), DBG_DMESG,
+ "dhcp %s !!\n", is_tx ? "Tx" : "Rx");
+ break;
+ }
+ case ETH_P_ARP:
+ break;
+ case ETH_P_PAE:
RT_TRACE(rtlpriv, (COMP_SEND | COMP_RECV), DBG_DMESG,
"802.1X %s EAPOL pkt!!\n", is_tx ? "Tx" : "Rx");
-
- if (is_tx) {
- rtlpriv->enter_ps = false;
- schedule_work(&rtlpriv->works.lps_change_work);
- ppsc->last_delaylps_stamp_jiffies = jiffies;
- }
-
- return true;
- } else if (ETH_P_IPV6 == ether_type) {
- /* IPv6 */
- return true;
+ break;
+ case ETH_P_IPV6:
+ /* TODO: Is this right? */
+ return false;
+ default:
+ return false;
}
-
- return false;
+ if (is_tx) {
+ rtlpriv->enter_ps = false;
+ schedule_work(&rtlpriv->works.lps_change_work);
+ ppsc->last_delaylps_stamp_jiffies = jiffies;
+ }
+ return true;
}
EXPORT_SYMBOL_GPL(rtl_is_special_data);
Index: wireless-testing/drivers/net/wireless/rtlwifi/wifi.h
===================================================================
--- wireless-testing.orig/drivers/net/wireless/rtlwifi/wifi.h
+++ wireless-testing/drivers/net/wireless/rtlwifi/wifi.h
@@ -77,11 +77,7 @@
#define RTL_SLOT_TIME_9 9
#define RTL_SLOT_TIME_20 20
-/*related with tcp/ip. */
-/*if_ehther.h*/
-#define ETH_P_PAE 0x888E /*Port Access Entity (IEEE 802.1X) */
-#define ETH_P_IP 0x0800 /*Internet Protocol packet */
-#define ETH_P_ARP 0x0806 /*Address Resolution packet */
+/*related to tcp/ip. */
#define SNAP_SIZE 6
#define PROTOC_TYPE_SIZE 2
^ permalink raw reply
* Re: [PATCH v4 net-next] net: introduce dev_set_forwarding()
From: Eric Dumazet @ 2013-11-02 19:58 UTC (permalink / raw)
To: Ben Hutchings
Cc: David Miller, christoph.paasch, herbert, netdev, hkchu, mwdalton
In-Reply-To: <1383400897.4291.47.camel@edumazet-glaptop2.roam.corp.google.com>
From: Eric Dumazet <edumazet@google.com>
Christoph Paasch and Jerry Chu reported crashes in skb_segment() caused
by commit 8a29111c7ca6 ("net: gro: allow to build full sized skb")
skb_segment() only deals with a frag_list chain containing MSS sized
fragments. Even if we fix this problem, its better if GRO layer
doesn't build skb with a frag_list in the first place, to let TSO
packets reaching output devices.
David Miller and Ben Hutchings suggested we keep track of number of
forwarding users to be able to :
- Disable LRO
- Make sure GRO layer do not use skb frag_list to extend skb capacity
Note that after this patch, LRO is automatically re-enabled if
forwarding is disabled on the device, or if a device is removed
from a bridge.
Tested:
lpq84:~# ethtool -k eth0 | grep "large-receive"
large-receive-offload: on
lpq84:~# echo 1 >/proc/sys/net/ipv4/conf/eth0/forwarding
lpq84:~# ethtool -k eth0 | grep "large-receive"
large-receive-offload: off [requested on]
lpq84:~# echo 0 >/proc/sys/net/ipv4/conf/eth0/forwarding
lpq84:~# ethtool -k eth0 | grep "large-receive"
large-receive-offload: on
lpq84:~# ethtool -K eth0 lro off
lpq84:~# ethtool -k eth0 | grep "large-receive"
large-receive-offload: off
lpq84:~# echo 1 >/proc/sys/net/ipv4/conf/eth0/forwarding
lpq84:~# ethtool -k eth0 | grep "large-receive"
large-receive-offload: off
lpq84:~# echo 0 >/proc/sys/net/ipv4/conf/eth0/forwarding
lpq84:~# ethtool -k eth0 | grep "large-receive"
large-receive-offload: off
lpq84:~# ethtool -K eth0 lro on
lpq84:~# cat /proc/sys/net/ipv4/ip_forward
0
lpq84:~# echo 1 >/proc/sys/net/ipv4/ip_forward
lpq84:~# ethtool -k eth0 | grep "large-receive"
large-receive-offload: off [requested on]
lpq84:~# echo 0 >/proc/sys/net/ipv4/ip_forward
lpq84:~# ethtool -k eth0 | grep "large-receive"
large-receive-offload: on
Signed-off-by: Eric Dumazet <edumazet@google.com>
Reported-by: Christoph Paasch <christoph.paasch@uclouvain.be>
Reported-by: Jerry Chu <hkchu@google.com>
Cc: Michael Dalton <mwdalton@google.com>
Fixes: 8a29111c7ca6 ("net: gro: allow to build full sized skb")
---
v4: drop LRO in netdev_fix_features(), ase Ben pointed out.
include/linux/netdevice.h | 3 ++-
net/bridge/br_if.c | 4 +++-
net/core/dev.c | 31 ++++++++++++++++++++-----------
net/core/skbuff.c | 11 ++++++++---
net/ipv4/devinet.c | 14 ++++++++------
net/ipv6/addrconf.c | 5 ++---
net/ipv6/addrconf_core.c | 2 ++
7 files changed, 45 insertions(+), 25 deletions(-)
diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
index cb1d918..6ddd0fa 100644
--- a/include/linux/netdevice.h
+++ b/include/linux/netdevice.h
@@ -1295,6 +1295,7 @@ struct net_device {
struct netdev_queue __rcu *ingress_queue;
unsigned char broadcast[MAX_ADDR_LEN]; /* hw bcast add */
+ unsigned int forwarding_count;
/*
@@ -1787,7 +1788,7 @@ struct net_device *__dev_get_by_name(struct net *net, const char *name);
int dev_alloc_name(struct net_device *dev, const char *name);
int dev_open(struct net_device *dev);
int dev_close(struct net_device *dev);
-void dev_disable_lro(struct net_device *dev);
+void dev_set_forwarding(struct net_device *dev, int inc);
int dev_loopback_xmit(struct sk_buff *newskb);
int dev_queue_xmit(struct sk_buff *skb);
int register_netdevice(struct net_device *dev);
diff --git a/net/bridge/br_if.c b/net/bridge/br_if.c
index c41d5fb..9591643 100644
--- a/net/bridge/br_if.c
+++ b/net/bridge/br_if.c
@@ -150,6 +150,8 @@ static void del_nbp(struct net_bridge_port *p)
netdev_rx_handler_unregister(dev);
+ dev_set_forwarding(dev, -1);
+
netdev_upper_dev_unlink(dev, br->dev);
br_multicast_del_port(p);
@@ -377,7 +379,7 @@ int br_add_if(struct net_bridge *br, struct net_device *dev)
dev->priv_flags |= IFF_BRIDGE_PORT;
- dev_disable_lro(dev);
+ dev_set_forwarding(dev, 1);
list_add_rcu(&p->list, &br->port_list);
diff --git a/net/core/dev.c b/net/core/dev.c
index 0054c8c..f95bde6 100644
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -1408,29 +1408,33 @@ EXPORT_SYMBOL(dev_close);
/**
- * dev_disable_lro - disable Large Receive Offload on a device
- * @dev: device
- *
- * Disable Large Receive Offload (LRO) on a net device. Must be
- * called under RTNL. This is needed if received packets may be
- * forwarded to another interface.
+ * dev_set_forwarding - Keep count of forwarding users for a device
+ * @dev: device
+ * @inc: +1 or -1
+ *
+ * Add or remove forwarding from a device.
+ * When the count of forwarding users is above 0 :
+ * 1) disable LRO (Large Receive Offload) on this device.
+ * 2) instruct GRO layer to not use frag_list to extend skb capacity.
+ * Must be called under RTNL.
+ * This is needed if received packets may be forwarded to another interface.
*/
-void dev_disable_lro(struct net_device *dev)
+void dev_set_forwarding(struct net_device *dev, int inc)
{
/*
- * If we're trying to disable lro on a vlan device
+ * If we're trying to enable forwarding from a vlan device
* use the underlying physical device instead
*/
if (is_vlan_dev(dev))
dev = vlan_dev_real_dev(dev);
- dev->wanted_features &= ~NETIF_F_LRO;
+ dev->forwarding_count += inc;
netdev_update_features(dev);
- if (unlikely(dev->features & NETIF_F_LRO))
+ if (unlikely(dev->forwarding_count && (dev->features & NETIF_F_LRO)))
netdev_WARN(dev, "failed to disable LRO!\n");
}
-EXPORT_SYMBOL(dev_disable_lro);
+EXPORT_SYMBOL(dev_set_forwarding);
static int call_netdevice_notifier(struct notifier_block *nb, unsigned long val,
struct net_device *dev)
@@ -5584,6 +5588,11 @@ static netdev_features_t netdev_fix_features(struct net_device *dev,
}
}
+ if ((features & NETIF_F_LRO) && dev->forwarding_count) {
+ netdev_dbg(dev, "Dropping LRO because of forwarding.\n");
+ features &= ~NETIF_F_LRO;
+ }
+
return features;
}
diff --git a/net/core/skbuff.c b/net/core/skbuff.c
index 0ab32fa..7b1cff8 100644
--- a/net/core/skbuff.c
+++ b/net/core/skbuff.c
@@ -2944,9 +2944,11 @@ int skb_gro_receive(struct sk_buff **head, struct sk_buff *skb)
int i = skbinfo->nr_frags;
int nr_frags = pinfo->nr_frags + i;
- if (nr_frags > MAX_SKB_FRAGS)
+ if (nr_frags > MAX_SKB_FRAGS) {
+ if (skb->dev->forwarding_count)
+ return -E2BIG;
goto merge;
-
+ }
offset -= headlen;
pinfo->nr_frags = nr_frags;
skbinfo->nr_frags = 0;
@@ -2977,8 +2979,11 @@ int skb_gro_receive(struct sk_buff **head, struct sk_buff *skb)
unsigned int first_size = headlen - offset;
unsigned int first_offset;
- if (nr_frags + 1 + skbinfo->nr_frags > MAX_SKB_FRAGS)
+ if (nr_frags + 1 + skbinfo->nr_frags > MAX_SKB_FRAGS) {
+ if (skb->dev->forwarding_count)
+ return -E2BIG;
goto merge;
+ }
first_offset = skb->data -
(unsigned char *)page_address(page) +
diff --git a/net/ipv4/devinet.c b/net/ipv4/devinet.c
index a1b5bcb..cf01e6f 100644
--- a/net/ipv4/devinet.c
+++ b/net/ipv4/devinet.c
@@ -223,6 +223,8 @@ void in_dev_finish_destroy(struct in_device *idev)
#ifdef NET_REFCNT_DEBUG
pr_debug("%s: %p=%s\n", __func__, idev, dev ? dev->name : "NIL");
#endif
+ if (IPV4_DEVCONF(idev->cnf, FORWARDING))
+ dev_set_forwarding(dev, -1);
dev_put(dev);
if (!idev->dead)
pr_err("Freeing alive in_device %p\n", idev);
@@ -248,7 +250,7 @@ static struct in_device *inetdev_init(struct net_device *dev)
if (!in_dev->arp_parms)
goto out_kfree;
if (IPV4_DEVCONF(in_dev->cnf, FORWARDING))
- dev_disable_lro(dev);
+ dev_set_forwarding(dev, 1);
/* Reference in_dev->dev */
dev_hold(dev);
/* Account for reference dev->ip_ptr (below) */
@@ -1932,8 +1934,8 @@ static void inet_forward_change(struct net *net)
for_each_netdev(net, dev) {
struct in_device *in_dev;
- if (on)
- dev_disable_lro(dev);
+
+ dev_set_forwarding(dev, on ? 1 : -1);
rcu_read_lock();
in_dev = __in_dev_get_rcu(dev);
if (in_dev) {
@@ -1997,7 +1999,7 @@ static int devinet_sysctl_forward(struct ctl_table *ctl, int write,
loff_t pos = *ppos;
int ret = proc_dointvec(ctl, write, buffer, lenp, ppos);
- if (write && *valp != val) {
+ if (write && (!(*valp) != !val)) {
struct net *net = ctl->extra2;
if (valp != &IPV4_DEVCONF_DFLT(net, FORWARDING)) {
@@ -2013,8 +2015,8 @@ static int devinet_sysctl_forward(struct ctl_table *ctl, int write,
struct ipv4_devconf *cnf = ctl->extra1;
struct in_device *idev =
container_of(cnf, struct in_device, cnf);
- if (*valp)
- dev_disable_lro(idev->dev);
+
+ dev_set_forwarding(idev->dev, *valp ? 1 : -1);
inet_netconf_notify_devconf(net,
NETCONFA_FORWARDING,
idev->dev->ifindex,
diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c
index 542d095..232b2c4 100644
--- a/net/ipv6/addrconf.c
+++ b/net/ipv6/addrconf.c
@@ -322,7 +322,7 @@ static struct inet6_dev *ipv6_add_dev(struct net_device *dev)
return NULL;
}
if (ndev->cnf.forwarding)
- dev_disable_lro(dev);
+ dev_set_forwarding(dev, 1);
/* We refer to the device */
dev_hold(dev);
@@ -638,8 +638,7 @@ static void dev_forward_change(struct inet6_dev *idev)
if (!idev)
return;
dev = idev->dev;
- if (idev->cnf.forwarding)
- dev_disable_lro(dev);
+ dev_set_forwarding(dev, idev->cnf.forwarding ? 1 : -1);
if (dev->flags & IFF_MULTICAST) {
if (idev->cnf.forwarding) {
ipv6_dev_mc_inc(dev, &in6addr_linklocal_allrouters);
diff --git a/net/ipv6/addrconf_core.c b/net/ipv6/addrconf_core.c
index 4c11cbc..b7620ad 100644
--- a/net/ipv6/addrconf_core.c
+++ b/net/ipv6/addrconf_core.c
@@ -139,6 +139,8 @@ void in6_dev_finish_destroy(struct inet6_dev *idev)
#ifdef NET_REFCNT_DEBUG
pr_debug("%s: %s\n", __func__, dev ? dev->name : "NIL");
#endif
+ if (idev->cnf.forwarding)
+ dev_set_forwarding(dev, -1);
dev_put(dev);
if (!idev->dead) {
pr_warn("Freeing alive inet6 device %p\n", idev);
^ permalink raw reply related
* Re: [PATCH net] net: flow_dissector: fail on evil iph->ihl
From: Michael S. Tsirkin @ 2013-11-02 20:22 UTC (permalink / raw)
To: Jason Wang
Cc: davem, edumazet, netdev, linux-kernel, Petr Matousek,
Daniel Borkmann
In-Reply-To: <1383289270-18952-1-git-send-email-jasowang@redhat.com>
On Fri, Nov 01, 2013 at 03:01:10PM +0800, Jason Wang wrote:
> We don't validate iph->ihl which may lead a dead loop if we meet a IPIP
> skb whose iph->ihl is zero. Fix this by failing immediately when iph->ihl
> is evil (less than 5).
>
> This issue were introduced by commit ec5efe7946280d1e84603389a1030ccec0a767ae
> (rps: support IPIP encapsulation).
>
> Cc: Eric Dumazet <edumazet@google.com>
> Cc: Petr Matousek <pmatouse@redhat.com>
> Cc: Michael S. Tsirkin <mst@redhat.com>
> Cc: Daniel Borkmann <dborkman@redhat.com>
> Signed-off-by: Jason Wang <jasowang@redhat.com>
Acked-by: Michael S. Tsirkin <mst@redhat.com>
> ---
> This patch is needed for stable.
> ---
> net/core/flow_dissector.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/net/core/flow_dissector.c b/net/core/flow_dissector.c
> index 8d7d0dd..143b6fd 100644
> --- a/net/core/flow_dissector.c
> +++ b/net/core/flow_dissector.c
> @@ -40,7 +40,7 @@ again:
> struct iphdr _iph;
> ip:
> iph = skb_header_pointer(skb, nhoff, sizeof(_iph), &_iph);
> - if (!iph)
> + if (!iph || iph->ihl < 5)
> return false;
>
> if (ip_is_fragment(iph))
> --
> 1.8.1.2
^ permalink raw reply
page: next (older) | prev (newer) | latest
- recent:[subjects (threaded)|topics (new)|topics (active)]
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox