atm: sk_wmem_alloc initial value is one

commit 2b85a34e91
(net: No more expensive sock_hold()/sock_put() on each tx)
changed initial sk_wmem_alloc value.

This broke net/atm since this protocol assumed a null
initial value. This patch makes necessary changes.

Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Eric Dumazet 2009-06-17 19:06:12 -07:00 committed by David S. Miller
parent 31e6d363ab
commit 81e2a3d5b7
4 changed files with 10 additions and 11 deletions

View file

@ -62,15 +62,15 @@ static struct sk_buff *alloc_tx(struct atm_vcc *vcc,unsigned int size)
struct sk_buff *skb; struct sk_buff *skb;
struct sock *sk = sk_atm(vcc); struct sock *sk = sk_atm(vcc);
if (atomic_read(&sk->sk_wmem_alloc) && !atm_may_send(vcc, size)) { if (sk_wmem_alloc_get(sk) && !atm_may_send(vcc, size)) {
pr_debug("Sorry: wmem_alloc = %d, size = %d, sndbuf = %d\n", pr_debug("Sorry: wmem_alloc = %d, size = %d, sndbuf = %d\n",
atomic_read(&sk->sk_wmem_alloc), size, sk_wmem_alloc_get(sk), size,
sk->sk_sndbuf); sk->sk_sndbuf);
return NULL; return NULL;
} }
while (!(skb = alloc_skb(size,GFP_KERNEL))) schedule(); while (!(skb = alloc_skb(size, GFP_KERNEL)))
pr_debug("AlTx %d += %d\n", atomic_read(&sk->sk_wmem_alloc), schedule();
skb->truesize); pr_debug("AlTx %d += %d\n", sk_wmem_alloc_get(sk), skb->truesize);
atomic_add(skb->truesize, &sk->sk_wmem_alloc); atomic_add(skb->truesize, &sk->sk_wmem_alloc);
return skb; return skb;
} }
@ -145,7 +145,7 @@ int vcc_create(struct net *net, struct socket *sock, int protocol, int family)
memset(&vcc->local,0,sizeof(struct sockaddr_atmsvc)); memset(&vcc->local,0,sizeof(struct sockaddr_atmsvc));
memset(&vcc->remote,0,sizeof(struct sockaddr_atmsvc)); memset(&vcc->remote,0,sizeof(struct sockaddr_atmsvc));
vcc->qos.txtp.max_sdu = 1 << 16; /* for meta VCs */ vcc->qos.txtp.max_sdu = 1 << 16; /* for meta VCs */
atomic_set(&sk->sk_wmem_alloc, 0); atomic_set(&sk->sk_wmem_alloc, 1);
atomic_set(&sk->sk_rmem_alloc, 0); atomic_set(&sk->sk_rmem_alloc, 0);
vcc->push = NULL; vcc->push = NULL;
vcc->pop = NULL; vcc->pop = NULL;

View file

@ -63,8 +63,7 @@ static int do_vcc_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg
error = -EINVAL; error = -EINVAL;
goto done; goto done;
} }
error = put_user(sk->sk_sndbuf - error = put_user(sk->sk_sndbuf - sk_wmem_alloc_get(sk),
atomic_read(&sk->sk_wmem_alloc),
(int __user *) argp) ? -EFAULT : 0; (int __user *) argp) ? -EFAULT : 0;
goto done; goto done;
case SIOCINQ: case SIOCINQ:

View file

@ -204,8 +204,8 @@ static void vcc_info(struct seq_file *seq, struct atm_vcc *vcc)
seq_printf(seq, "%3d", sk->sk_family); seq_printf(seq, "%3d", sk->sk_family);
} }
seq_printf(seq, " %04lx %5d %7d/%7d %7d/%7d [%d]\n", vcc->flags, sk->sk_err, seq_printf(seq, " %04lx %5d %7d/%7d %7d/%7d [%d]\n", vcc->flags, sk->sk_err,
atomic_read(&sk->sk_wmem_alloc), sk->sk_sndbuf, sk_wmem_alloc_get(sk), sk->sk_sndbuf,
atomic_read(&sk->sk_rmem_alloc), sk->sk_rcvbuf, sk_rmem_alloc_get(sk), sk->sk_rcvbuf,
atomic_read(&sk->sk_refcnt)); atomic_read(&sk->sk_refcnt));
} }

View file

@ -33,7 +33,7 @@ static void atm_pop_raw(struct atm_vcc *vcc,struct sk_buff *skb)
struct sock *sk = sk_atm(vcc); struct sock *sk = sk_atm(vcc);
pr_debug("APopR (%d) %d -= %d\n", vcc->vci, pr_debug("APopR (%d) %d -= %d\n", vcc->vci,
atomic_read(&sk->sk_wmem_alloc), skb->truesize); sk_wmem_alloc_get(sk), skb->truesize);
atomic_sub(skb->truesize, &sk->sk_wmem_alloc); atomic_sub(skb->truesize, &sk->sk_wmem_alloc);
dev_kfree_skb_any(skb); dev_kfree_skb_any(skb);
sk->sk_write_space(sk); sk->sk_write_space(sk);