Skip to content

Commit 29cfcdd

Browse files
committed
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6: net/ipv4: Eliminate kstrdup memory leak net/caif/cfrfml.c: use asm/unaligned.h ax25: missplaced sock_put(sk) qlge: reset the chip before freeing the buffers l2tp: test for ethernet header in l2tp_eth_dev_recv() tcp: select(writefds) don't hang up when a peer close connection tcp: fix three tcp sysctls tuning tcp: Combat per-cpu skew in orphan tests. pxa168_eth: silence gcc warnings pxa168_eth: update call to phy_mii_ioctl() pxa168_eth: fix error handling in prope pxa168_eth: remove unneeded null check phylib: Fix race between returning phydev and calling adjust_link caif-driver: add HAS_DMA dependency 3c59x: Fix deadlock between boomerang_interrupt and boomerang_start_tx qlcnic: fix poll implementation netxen: fix poll implementation bridge: netfilter: fix a memory leak
2 parents 303fd2c + c34186e commit 29cfcdd

File tree

15 files changed

+98
-72
lines changed

15 files changed

+98
-72
lines changed

drivers/net/3c59x.c

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -633,7 +633,8 @@ struct vortex_private {
633633
open:1,
634634
medialock:1,
635635
must_free_region:1, /* Flag: if zero, Cardbus owns the I/O region */
636-
large_frames:1; /* accept large frames */
636+
large_frames:1, /* accept large frames */
637+
handling_irq:1; /* private in_irq indicator */
637638
int drv_flags;
638639
u16 status_enable;
639640
u16 intr_enable;
@@ -2133,6 +2134,15 @@ boomerang_start_xmit(struct sk_buff *skb, struct net_device *dev)
21332134
dev->name, vp->cur_tx);
21342135
}
21352136

2137+
/*
2138+
* We can't allow a recursion from our interrupt handler back into the
2139+
* tx routine, as they take the same spin lock, and that causes
2140+
* deadlock. Just return NETDEV_TX_BUSY and let the stack try again in
2141+
* a bit
2142+
*/
2143+
if (vp->handling_irq)
2144+
return NETDEV_TX_BUSY;
2145+
21362146
if (vp->cur_tx - vp->dirty_tx >= TX_RING_SIZE) {
21372147
if (vortex_debug > 0)
21382148
pr_warning("%s: BUG! Tx Ring full, refusing to send buffer.\n",
@@ -2335,11 +2345,13 @@ boomerang_interrupt(int irq, void *dev_id)
23352345

23362346
ioaddr = vp->ioaddr;
23372347

2348+
23382349
/*
23392350
* It seems dopey to put the spinlock this early, but we could race against vortex_tx_timeout
23402351
* and boomerang_start_xmit
23412352
*/
23422353
spin_lock(&vp->lock);
2354+
vp->handling_irq = 1;
23432355

23442356
status = ioread16(ioaddr + EL3_STATUS);
23452357

@@ -2447,6 +2459,7 @@ boomerang_interrupt(int irq, void *dev_id)
24472459
pr_debug("%s: exiting interrupt, status %4.4x.\n",
24482460
dev->name, status);
24492461
handler_exit:
2462+
vp->handling_irq = 0;
24502463
spin_unlock(&vp->lock);
24512464
return IRQ_HANDLED;
24522465
}

drivers/net/caif/Kconfig

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ config CAIF_TTY
1515

1616
config CAIF_SPI_SLAVE
1717
tristate "CAIF SPI transport driver for slave interface"
18-
depends on CAIF
18+
depends on CAIF && HAS_DMA
1919
default n
2020
---help---
2121
The CAIF Link layer SPI Protocol driver for Slave SPI interface.

drivers/net/netxen/netxen_nic_main.c

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2131,9 +2131,16 @@ static int netxen_nic_poll(struct napi_struct *napi, int budget)
21312131
#ifdef CONFIG_NET_POLL_CONTROLLER
21322132
static void netxen_nic_poll_controller(struct net_device *netdev)
21332133
{
2134+
int ring;
2135+
struct nx_host_sds_ring *sds_ring;
21342136
struct netxen_adapter *adapter = netdev_priv(netdev);
2137+
struct netxen_recv_context *recv_ctx = &adapter->recv_ctx;
2138+
21352139
disable_irq(adapter->irq);
2136-
netxen_intr(adapter->irq, adapter);
2140+
for (ring = 0; ring < adapter->max_sds_rings; ring++) {
2141+
sds_ring = &recv_ctx->sds_rings[ring];
2142+
netxen_intr(adapter->irq, sds_ring);
2143+
}
21372144
enable_irq(adapter->irq);
21382145
}
21392146
#endif

drivers/net/phy/phy_device.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -466,6 +466,8 @@ int phy_attach_direct(struct net_device *dev, struct phy_device *phydev,
466466

467467
phydev->interface = interface;
468468

469+
phydev->state = PHY_READY;
470+
469471
/* Do initial configuration here, now that
470472
* we have certain key parameters
471473
* (dev_flags and interface) */

drivers/net/pxa168_eth.c

Lines changed: 28 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -654,15 +654,15 @@ static void eth_port_start(struct net_device *dev)
654654
/* Assignment of Tx CTRP of given queue */
655655
tx_curr_desc = pep->tx_curr_desc_q;
656656
wrl(pep, ETH_C_TX_DESC_1,
657-
(u32) ((struct tx_desc *)pep->tx_desc_dma + tx_curr_desc));
657+
(u32) (pep->tx_desc_dma + tx_curr_desc * sizeof(struct tx_desc)));
658658

659659
/* Assignment of Rx CRDP of given queue */
660660
rx_curr_desc = pep->rx_curr_desc_q;
661661
wrl(pep, ETH_C_RX_DESC_0,
662-
(u32) ((struct rx_desc *)pep->rx_desc_dma + rx_curr_desc));
662+
(u32) (pep->rx_desc_dma + rx_curr_desc * sizeof(struct rx_desc)));
663663

664664
wrl(pep, ETH_F_RX_DESC_0,
665-
(u32) ((struct rx_desc *)pep->rx_desc_dma + rx_curr_desc));
665+
(u32) (pep->rx_desc_dma + rx_curr_desc * sizeof(struct rx_desc)));
666666

667667
/* Clear all interrupts */
668668
wrl(pep, INT_CAUSE, 0);
@@ -1350,7 +1350,7 @@ static int pxa168_eth_do_ioctl(struct net_device *dev, struct ifreq *ifr,
13501350
{
13511351
struct pxa168_eth_private *pep = netdev_priv(dev);
13521352
if (pep->phy != NULL)
1353-
return phy_mii_ioctl(pep->phy, if_mii(ifr), cmd);
1353+
return phy_mii_ioctl(pep->phy, ifr, cmd);
13541354

13551355
return -EOPNOTSUPP;
13561356
}
@@ -1414,10 +1414,8 @@ static int ethernet_phy_setup(struct net_device *dev)
14141414
{
14151415
struct pxa168_eth_private *pep = netdev_priv(dev);
14161416

1417-
if (pep->pd != NULL) {
1418-
if (pep->pd->init)
1419-
pep->pd->init();
1420-
}
1417+
if (pep->pd->init)
1418+
pep->pd->init();
14211419
pep->phy = phy_scan(pep, pep->pd->phy_addr & 0x1f);
14221420
if (pep->phy != NULL)
14231421
phy_init(pep, pep->pd->speed, pep->pd->duplex);
@@ -1499,7 +1497,7 @@ static int pxa168_eth_probe(struct platform_device *pdev)
14991497
dev = alloc_etherdev(sizeof(struct pxa168_eth_private));
15001498
if (!dev) {
15011499
err = -ENOMEM;
1502-
goto out;
1500+
goto err_clk;
15031501
}
15041502

15051503
platform_set_drvdata(pdev, dev);
@@ -1509,12 +1507,12 @@ static int pxa168_eth_probe(struct platform_device *pdev)
15091507
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
15101508
if (res == NULL) {
15111509
err = -ENODEV;
1512-
goto out;
1510+
goto err_netdev;
15131511
}
15141512
pep->base = ioremap(res->start, res->end - res->start + 1);
15151513
if (pep->base == NULL) {
15161514
err = -ENOMEM;
1517-
goto out;
1515+
goto err_netdev;
15181516
}
15191517
res = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
15201518
BUG_ON(!res);
@@ -1551,7 +1549,7 @@ static int pxa168_eth_probe(struct platform_device *pdev)
15511549
pep->smi_bus = mdiobus_alloc();
15521550
if (pep->smi_bus == NULL) {
15531551
err = -ENOMEM;
1554-
goto out;
1552+
goto err_base;
15551553
}
15561554
pep->smi_bus->priv = pep;
15571555
pep->smi_bus->name = "pxa168_eth smi";
@@ -1560,31 +1558,31 @@ static int pxa168_eth_probe(struct platform_device *pdev)
15601558
snprintf(pep->smi_bus->id, MII_BUS_ID_SIZE, "%d", pdev->id);
15611559
pep->smi_bus->parent = &pdev->dev;
15621560
pep->smi_bus->phy_mask = 0xffffffff;
1563-
if (mdiobus_register(pep->smi_bus) < 0) {
1564-
err = -ENOMEM;
1565-
goto out;
1566-
}
1561+
err = mdiobus_register(pep->smi_bus);
1562+
if (err)
1563+
goto err_free_mdio;
1564+
15671565
pxa168_init_hw(pep);
15681566
err = ethernet_phy_setup(dev);
15691567
if (err)
1570-
goto out;
1568+
goto err_mdiobus;
15711569
SET_NETDEV_DEV(dev, &pdev->dev);
15721570
err = register_netdev(dev);
15731571
if (err)
1574-
goto out;
1572+
goto err_mdiobus;
15751573
return 0;
1576-
out:
1577-
if (pep->clk) {
1578-
clk_disable(pep->clk);
1579-
clk_put(pep->clk);
1580-
pep->clk = NULL;
1581-
}
1582-
if (pep->base) {
1583-
iounmap(pep->base);
1584-
pep->base = NULL;
1585-
}
1586-
if (dev)
1587-
free_netdev(dev);
1574+
1575+
err_mdiobus:
1576+
mdiobus_unregister(pep->smi_bus);
1577+
err_free_mdio:
1578+
mdiobus_free(pep->smi_bus);
1579+
err_base:
1580+
iounmap(pep->base);
1581+
err_netdev:
1582+
free_netdev(dev);
1583+
err_clk:
1584+
clk_disable(clk);
1585+
clk_put(clk);
15881586
return err;
15891587
}
15901588

drivers/net/qlcnic/qlcnic_main.c

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2188,9 +2188,16 @@ static int qlcnic_rx_poll(struct napi_struct *napi, int budget)
21882188
#ifdef CONFIG_NET_POLL_CONTROLLER
21892189
static void qlcnic_poll_controller(struct net_device *netdev)
21902190
{
2191+
int ring;
2192+
struct qlcnic_host_sds_ring *sds_ring;
21912193
struct qlcnic_adapter *adapter = netdev_priv(netdev);
2194+
struct qlcnic_recv_context *recv_ctx = &adapter->recv_ctx;
2195+
21922196
disable_irq(adapter->irq);
2193-
qlcnic_intr(adapter->irq, adapter);
2197+
for (ring = 0; ring < adapter->max_sds_rings; ring++) {
2198+
sds_ring = &recv_ctx->sds_rings[ring];
2199+
qlcnic_intr(adapter->irq, sds_ring);
2200+
}
21942201
enable_irq(adapter->irq);
21952202
}
21962203
#endif

drivers/net/qlge/qlge_main.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3919,12 +3919,12 @@ static int ql_adapter_down(struct ql_adapter *qdev)
39193919
for (i = 0; i < qdev->rss_ring_count; i++)
39203920
netif_napi_del(&qdev->rx_ring[i].napi);
39213921

3922-
ql_free_rx_buffers(qdev);
3923-
39243922
status = ql_adapter_reset(qdev);
39253923
if (status)
39263924
netif_err(qdev, ifdown, qdev->ndev, "reset(func #%d) FAILED!\n",
39273925
qdev->func);
3926+
ql_free_rx_buffers(qdev);
3927+
39283928
return status;
39293929
}
39303930

include/net/tcp.h

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -268,11 +268,21 @@ static inline int between(__u32 seq1, __u32 seq2, __u32 seq3)
268268
return seq3 - seq2 >= seq1 - seq2;
269269
}
270270

271-
static inline int tcp_too_many_orphans(struct sock *sk, int num)
271+
static inline bool tcp_too_many_orphans(struct sock *sk, int shift)
272272
{
273-
return (num > sysctl_tcp_max_orphans) ||
274-
(sk->sk_wmem_queued > SOCK_MIN_SNDBUF &&
275-
atomic_read(&tcp_memory_allocated) > sysctl_tcp_mem[2]);
273+
struct percpu_counter *ocp = sk->sk_prot->orphan_count;
274+
int orphans = percpu_counter_read_positive(ocp);
275+
276+
if (orphans << shift > sysctl_tcp_max_orphans) {
277+
orphans = percpu_counter_sum_positive(ocp);
278+
if (orphans << shift > sysctl_tcp_max_orphans)
279+
return true;
280+
}
281+
282+
if (sk->sk_wmem_queued > SOCK_MIN_SNDBUF &&
283+
atomic_read(&tcp_memory_allocated) > sysctl_tcp_mem[2])
284+
return true;
285+
return false;
276286
}
277287

278288
/* syncookies: remember time of last synqueue overflow */

net/ax25/ax25_ds_timer.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,8 +112,8 @@ void ax25_ds_heartbeat_expiry(ax25_cb *ax25)
112112
if (sk) {
113113
sock_hold(sk);
114114
ax25_destroy_socket(ax25);
115-
sock_put(sk);
116115
bh_unlock_sock(sk);
116+
sock_put(sk);
117117
} else
118118
ax25_destroy_socket(ax25);
119119
return;

net/bridge/br_netfilter.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -162,8 +162,8 @@ static inline struct nf_bridge_info *nf_bridge_unshare(struct sk_buff *skb)
162162
if (tmp) {
163163
memcpy(tmp, nf_bridge, sizeof(struct nf_bridge_info));
164164
atomic_set(&tmp->use, 1);
165-
nf_bridge_put(nf_bridge);
166165
}
166+
nf_bridge_put(nf_bridge);
167167
nf_bridge = tmp;
168168
}
169169
return nf_bridge;

net/caif/cfrfml.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
#include <linux/stddef.h>
88
#include <linux/spinlock.h>
99
#include <linux/slab.h>
10-
#include <linux/unaligned/le_byteshift.h>
10+
#include <asm/unaligned.h>
1111
#include <net/caif/caif_layer.h>
1212
#include <net/caif/cfsrvl.h>
1313
#include <net/caif/cfpkt.h>

net/ipv4/tcp.c

Lines changed: 10 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -451,7 +451,8 @@ unsigned int tcp_poll(struct file *file, struct socket *sock, poll_table *wait)
451451
if (sk_stream_wspace(sk) >= sk_stream_min_wspace(sk))
452452
mask |= POLLOUT | POLLWRNORM;
453453
}
454-
}
454+
} else
455+
mask |= POLLOUT | POLLWRNORM;
455456

456457
if (tp->urg_data & TCP_URG_VALID)
457458
mask |= POLLPRI;
@@ -2011,11 +2012,8 @@ void tcp_close(struct sock *sk, long timeout)
20112012
}
20122013
}
20132014
if (sk->sk_state != TCP_CLOSE) {
2014-
int orphan_count = percpu_counter_read_positive(
2015-
sk->sk_prot->orphan_count);
2016-
20172015
sk_mem_reclaim(sk);
2018-
if (tcp_too_many_orphans(sk, orphan_count)) {
2016+
if (tcp_too_many_orphans(sk, 0)) {
20192017
if (net_ratelimit())
20202018
printk(KERN_INFO "TCP: too many of orphaned "
20212019
"sockets\n");
@@ -3212,7 +3210,7 @@ void __init tcp_init(void)
32123210
{
32133211
struct sk_buff *skb = NULL;
32143212
unsigned long nr_pages, limit;
3215-
int order, i, max_share;
3213+
int i, max_share, cnt;
32163214
unsigned long jiffy = jiffies;
32173215

32183216
BUILD_BUG_ON(sizeof(struct tcp_skb_cb) > sizeof(skb->cb));
@@ -3261,22 +3259,12 @@ void __init tcp_init(void)
32613259
INIT_HLIST_HEAD(&tcp_hashinfo.bhash[i].chain);
32623260
}
32633261

3264-
/* Try to be a bit smarter and adjust defaults depending
3265-
* on available memory.
3266-
*/
3267-
for (order = 0; ((1 << order) << PAGE_SHIFT) <
3268-
(tcp_hashinfo.bhash_size * sizeof(struct inet_bind_hashbucket));
3269-
order++)
3270-
;
3271-
if (order >= 4) {
3272-
tcp_death_row.sysctl_max_tw_buckets = 180000;
3273-
sysctl_tcp_max_orphans = 4096 << (order - 4);
3274-
sysctl_max_syn_backlog = 1024;
3275-
} else if (order < 3) {
3276-
tcp_death_row.sysctl_max_tw_buckets >>= (3 - order);
3277-
sysctl_tcp_max_orphans >>= (3 - order);
3278-
sysctl_max_syn_backlog = 128;
3279-
}
3262+
3263+
cnt = tcp_hashinfo.ehash_mask + 1;
3264+
3265+
tcp_death_row.sysctl_max_tw_buckets = cnt / 2;
3266+
sysctl_tcp_max_orphans = cnt / 2;
3267+
sysctl_max_syn_backlog = max(128, cnt / 256);
32803268

32813269
/* Set the pressure threshold to be a fraction of global memory that
32823270
* is up to 1/2 at 256 MB, decreasing toward zero with the amount of

net/ipv4/tcp_cong.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -196,10 +196,10 @@ void tcp_get_allowed_congestion_control(char *buf, size_t maxlen)
196196
int tcp_set_allowed_congestion_control(char *val)
197197
{
198198
struct tcp_congestion_ops *ca;
199-
char *clone, *name;
199+
char *saved_clone, *clone, *name;
200200
int ret = 0;
201201

202-
clone = kstrdup(val, GFP_USER);
202+
saved_clone = clone = kstrdup(val, GFP_USER);
203203
if (!clone)
204204
return -ENOMEM;
205205

@@ -226,6 +226,7 @@ int tcp_set_allowed_congestion_control(char *val)
226226
}
227227
out:
228228
spin_unlock(&tcp_cong_list_lock);
229+
kfree(saved_clone);
229230

230231
return ret;
231232
}

0 commit comments

Comments
 (0)