* [net-2.6 PATCH 1/6] net: initialize rmem_alloc and omem_alloc to 0 in netlink socket
@ 2009-09-18 0:57 Jeff Kirsher
2009-09-18 0:57 ` [net-2.6 PATCH 2/6] net: remove kfree_skb on a NULL pointer in af_netlink.c Jeff Kirsher
` (5 more replies)
0 siblings, 6 replies; 11+ messages in thread
From: Jeff Kirsher @ 2009-09-18 0:57 UTC (permalink / raw)
To: davem; +Cc: netdev, gospo, linux-scsi, John Fastabend, Jeff Kirsher
From: John Fastabend <john.r.fastabend@intel.com>
The rmem_alloc and omem_alloc socket fields are not
initialized. This sets each variable to zero when a socket
is created. Note the sk_wmem_alloc is already initialized
in sock_init_data.
Signed-off-by: John Fastabend <john.r.fastabend@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
---
net/netlink/af_netlink.c | 3 +++
1 files changed, 3 insertions(+), 0 deletions(-)
diff --git a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c
index c5aab6a..4e673d2 100644
--- a/net/netlink/af_netlink.c
+++ b/net/netlink/af_netlink.c
@@ -423,6 +423,9 @@ static int __netlink_create(struct net *net, struct socket *sock,
}
init_waitqueue_head(&nlk->wait);
+ atomic_set(&sk->sk_rmem_alloc, 0);
+ atomic_set(&sk->sk_omem_alloc, 0);
+
sk->sk_destruct = netlink_sock_destruct;
sk->sk_protocol = protocol;
return 0;
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [net-2.6 PATCH 2/6] net: remove kfree_skb on a NULL pointer in af_netlink.c
2009-09-18 0:57 [net-2.6 PATCH 1/6] net: initialize rmem_alloc and omem_alloc to 0 in netlink socket Jeff Kirsher
@ 2009-09-18 0:57 ` Jeff Kirsher
2009-09-18 1:24 ` David Miller
2009-09-18 0:57 ` [net-2.6 PATCH 3/6] net: fix vlan_get_size to include vlan_flags size Jeff Kirsher
` (4 subsequent siblings)
5 siblings, 1 reply; 11+ messages in thread
From: Jeff Kirsher @ 2009-09-18 0:57 UTC (permalink / raw)
To: davem; +Cc: netdev, gospo, linux-scsi, John Fastabend, Jeff Kirsher
From: John Fastabend <john.r.fastabend@intel.com>
This removes a kfree_skb that is being called on a NULL pointer when
do_one_broadcast() is sucessful. And moves the kfree_skb into
do_one_broadcast() for the error case.
Signed-off-by: John Fastabend <john.r.fastabend@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
---
net/netlink/af_netlink.c | 4 ++--
1 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c
index 4e673d2..9934847 100644
--- a/net/netlink/af_netlink.c
+++ b/net/netlink/af_netlink.c
@@ -1021,6 +1021,8 @@ static inline int do_one_broadcast(struct sock *sk,
netlink_overrun(sk);
if (nlk->flags & NETLINK_BROADCAST_SEND_ERROR)
p->delivery_failure = 1;
+ kfree_skb(p->skb2);
+ p->skb2 = NULL;
} else {
p->congested |= val;
p->delivered = 1;
@@ -1065,8 +1067,6 @@ int netlink_broadcast(struct sock *ssk, struct sk_buff *skb, u32 pid,
netlink_unlock_table();
- kfree_skb(info.skb2);
-
if (info.delivery_failure)
return -ENOBUFS;
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [net-2.6 PATCH 3/6] net: fix vlan_get_size to include vlan_flags size
2009-09-18 0:57 [net-2.6 PATCH 1/6] net: initialize rmem_alloc and omem_alloc to 0 in netlink socket Jeff Kirsher
2009-09-18 0:57 ` [net-2.6 PATCH 2/6] net: remove kfree_skb on a NULL pointer in af_netlink.c Jeff Kirsher
@ 2009-09-18 0:57 ` Jeff Kirsher
2009-09-18 0:58 ` [net-2.6 PATCH 4/6] net: fix nlmsg len size for skb when error bit is set Jeff Kirsher
` (3 subsequent siblings)
5 siblings, 0 replies; 11+ messages in thread
From: Jeff Kirsher @ 2009-09-18 0:57 UTC (permalink / raw)
To: davem; +Cc: netdev, gospo, linux-scsi, John Fastabend, Jeff Kirsher
From: John Fastabend <john.r.fastabend@intel.com>
Fix vlan_get_size to include vlan->flags. Currently, the
size of the vlan flags is not included in the nlmsg size.
Signed-off-by: John Fastabend <john.r.fastabend@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
---
net/8021q/vlan_netlink.c | 1 +
1 files changed, 1 insertions(+), 0 deletions(-)
diff --git a/net/8021q/vlan_netlink.c b/net/8021q/vlan_netlink.c
index 343146e..a915048 100644
--- a/net/8021q/vlan_netlink.c
+++ b/net/8021q/vlan_netlink.c
@@ -169,6 +169,7 @@ static size_t vlan_get_size(const struct net_device *dev)
struct vlan_dev_info *vlan = vlan_dev_info(dev);
return nla_total_size(2) + /* IFLA_VLAN_ID */
+ sizeof(struct ifla_vlan_flags) + /* IFLA_VLAN_FLAGS */
vlan_qos_map_size(vlan->nr_ingress_mappings) +
vlan_qos_map_size(vlan->nr_egress_mappings);
}
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [net-2.6 PATCH 4/6] net: fix nlmsg len size for skb when error bit is set.
2009-09-18 0:57 [net-2.6 PATCH 1/6] net: initialize rmem_alloc and omem_alloc to 0 in netlink socket Jeff Kirsher
2009-09-18 0:57 ` [net-2.6 PATCH 2/6] net: remove kfree_skb on a NULL pointer in af_netlink.c Jeff Kirsher
2009-09-18 0:57 ` [net-2.6 PATCH 3/6] net: fix vlan_get_size to include vlan_flags size Jeff Kirsher
@ 2009-09-18 0:58 ` Jeff Kirsher
2009-09-18 0:58 ` [net-2.6 PATCH 5/6] net: fix sock locking for sk_err field in netlink Jeff Kirsher
` (2 subsequent siblings)
5 siblings, 0 replies; 11+ messages in thread
From: Jeff Kirsher @ 2009-09-18 0:58 UTC (permalink / raw)
To: davem; +Cc: netdev, gospo, linux-scsi, John Fastabend, Jeff Kirsher
From: John Fastabend <john.r.fastabend@intel.com>
Currently, the nlmsg->len field is not set correctly in netlink_ack()
for ack messages that include the nlmsg of the error frame. This
corrects the length field passed to __nlmsg_put to use the correct
payload size.
Signed-off-by: John Fastabend <john.r.fastabend@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
---
net/netlink/af_netlink.c | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c
index 9934847..aa74011 100644
--- a/net/netlink/af_netlink.c
+++ b/net/netlink/af_netlink.c
@@ -1788,7 +1788,7 @@ void netlink_ack(struct sk_buff *in_skb, struct nlmsghdr *nlh, int err)
}
rep = __nlmsg_put(skb, NETLINK_CB(in_skb).pid, nlh->nlmsg_seq,
- NLMSG_ERROR, sizeof(struct nlmsgerr), 0);
+ NLMSG_ERROR, payload, 0);
errmsg = nlmsg_data(rep);
errmsg->error = err;
memcpy(&errmsg->msg, nlh, err ? nlh->nlmsg_len : sizeof(*nlh));
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [net-2.6 PATCH 5/6] net: fix sock locking for sk_err field in netlink.
2009-09-18 0:57 [net-2.6 PATCH 1/6] net: initialize rmem_alloc and omem_alloc to 0 in netlink socket Jeff Kirsher
` (2 preceding siblings ...)
2009-09-18 0:58 ` [net-2.6 PATCH 4/6] net: fix nlmsg len size for skb when error bit is set Jeff Kirsher
@ 2009-09-18 0:58 ` Jeff Kirsher
2009-09-18 1:27 ` David Miller
2009-09-18 0:58 ` [net-2.6 PATCH 6/6] net: fix double skb free in dcbnl Jeff Kirsher
2009-09-18 1:29 ` [net-2.6 PATCH 1/6] net: initialize rmem_alloc and omem_alloc to 0 in netlink socket David Miller
5 siblings, 1 reply; 11+ messages in thread
From: Jeff Kirsher @ 2009-09-18 0:58 UTC (permalink / raw)
To: davem; +Cc: netdev, gospo, linux-scsi, John Fastabend, Jeff Kirsher
From: John Fastabend <john.r.fastabend@intel.com>
This adds the sock lock around setting the sk_err field
in sock struct. Without the lock multiple threads may
write to this field.
Signed-off-by: John Fastabend <john.r.fastabend@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
---
net/netlink/af_netlink.c | 6 ++++++
1 files changed, 6 insertions(+), 0 deletions(-)
diff --git a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c
index aa74011..1669dfc 100644
--- a/net/netlink/af_netlink.c
+++ b/net/netlink/af_netlink.c
@@ -732,7 +732,9 @@ static void netlink_overrun(struct sock *sk)
if (!(nlk->flags & NETLINK_RECV_NO_ENOBUFS)) {
if (!test_and_set_bit(0, &nlk_sk(sk)->state)) {
+ lock_sock(sk);
sk->sk_err = ENOBUFS;
+ release_sock(sk);
sk->sk_error_report(sk);
}
}
@@ -1101,7 +1103,9 @@ static inline int do_one_set_err(struct sock *sk,
!test_bit(p->group - 1, nlk->groups))
goto out;
+ lock_sock(sk);
sk->sk_err = p->code;
+ release_sock(sk);
sk->sk_error_report(sk);
out:
return 0;
@@ -1780,7 +1784,9 @@ void netlink_ack(struct sk_buff *in_skb, struct nlmsghdr *nlh, int err)
in_skb->sk->sk_protocol,
NETLINK_CB(in_skb).pid);
if (sk) {
+ lock_sock(sk);
sk->sk_err = ENOBUFS;
+ release_sock(sk);
sk->sk_error_report(sk);
sock_put(sk);
}
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [net-2.6 PATCH 6/6] net: fix double skb free in dcbnl
2009-09-18 0:57 [net-2.6 PATCH 1/6] net: initialize rmem_alloc and omem_alloc to 0 in netlink socket Jeff Kirsher
` (3 preceding siblings ...)
2009-09-18 0:58 ` [net-2.6 PATCH 5/6] net: fix sock locking for sk_err field in netlink Jeff Kirsher
@ 2009-09-18 0:58 ` Jeff Kirsher
2009-09-18 1:29 ` [net-2.6 PATCH 1/6] net: initialize rmem_alloc and omem_alloc to 0 in netlink socket David Miller
5 siblings, 0 replies; 11+ messages in thread
From: Jeff Kirsher @ 2009-09-18 0:58 UTC (permalink / raw)
To: davem; +Cc: netdev, gospo, linux-scsi, John Fastabend, Jeff Kirsher
From: John Fastabend <john.r.fastabend@intel.com>
netlink_unicast() calls kfree_skb even in the error case.
dcbnl calls netlink_unicast() which when it fails free's the
skb and returns an error value. dcbnl is free'ing the skb
again when this error occurs. This patch removes the double
free.
Signed-off-by: John Fastabend <john.r.fastabend@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
---
net/dcb/dcbnl.c | 15 +++++++--------
1 files changed, 7 insertions(+), 8 deletions(-)
diff --git a/net/dcb/dcbnl.c b/net/dcb/dcbnl.c
index e0879bf..ac1205d 100644
--- a/net/dcb/dcbnl.c
+++ b/net/dcb/dcbnl.c
@@ -194,7 +194,7 @@ static int dcbnl_reply(u8 value, u8 event, u8 cmd, u8 attr, u32 pid,
nlmsg_end(dcbnl_skb, nlh);
ret = rtnl_unicast(dcbnl_skb, &init_net, pid);
if (ret)
- goto err;
+ return -EINVAL;
return 0;
nlmsg_failure:
@@ -275,7 +275,7 @@ static int dcbnl_getpfccfg(struct net_device *netdev, struct nlattr **tb,
ret = rtnl_unicast(dcbnl_skb, &init_net, pid);
if (ret)
- goto err;
+ goto err_out;
return 0;
nlmsg_failure:
@@ -316,12 +316,11 @@ static int dcbnl_getperm_hwaddr(struct net_device *netdev, struct nlattr **tb,
ret = rtnl_unicast(dcbnl_skb, &init_net, pid);
if (ret)
- goto err;
+ goto err_out;
return 0;
nlmsg_failure:
-err:
kfree_skb(dcbnl_skb);
err_out:
return -EINVAL;
@@ -383,7 +382,7 @@ static int dcbnl_getcap(struct net_device *netdev, struct nlattr **tb,
ret = rtnl_unicast(dcbnl_skb, &init_net, pid);
if (ret)
- goto err;
+ goto err_out;
return 0;
nlmsg_failure:
@@ -460,7 +459,7 @@ static int dcbnl_getnumtcs(struct net_device *netdev, struct nlattr **tb,
ret = rtnl_unicast(dcbnl_skb, &init_net, pid);
if (ret) {
ret = -EINVAL;
- goto err;
+ goto err_out;
}
return 0;
@@ -799,7 +798,7 @@ static int __dcbnl_pg_getcfg(struct net_device *netdev, struct nlattr **tb,
ret = rtnl_unicast(dcbnl_skb, &init_net, pid);
if (ret)
- goto err;
+ goto err_out;
return 0;
@@ -1063,7 +1062,7 @@ static int dcbnl_bcn_getcfg(struct net_device *netdev, struct nlattr **tb,
ret = rtnl_unicast(dcbnl_skb, &init_net, pid);
if (ret)
- goto err;
+ goto err_out;
return 0;
^ permalink raw reply related [flat|nested] 11+ messages in thread
* Re: [net-2.6 PATCH 2/6] net: remove kfree_skb on a NULL pointer in af_netlink.c
2009-09-18 0:57 ` [net-2.6 PATCH 2/6] net: remove kfree_skb on a NULL pointer in af_netlink.c Jeff Kirsher
@ 2009-09-18 1:24 ` David Miller
2009-09-21 12:04 ` John Fastabend
0 siblings, 1 reply; 11+ messages in thread
From: David Miller @ 2009-09-18 1:24 UTC (permalink / raw)
To: jeffrey.t.kirsher; +Cc: netdev, gospo, linux-scsi, john.r.fastabend
From: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
Date: Thu, 17 Sep 2009 17:57:29 -0700
> From: John Fastabend <john.r.fastabend@intel.com>
>
> This removes a kfree_skb that is being called on a NULL pointer when
> do_one_broadcast() is sucessful. And moves the kfree_skb into
> do_one_broadcast() for the error case.
>
> Signed-off-by: John Fastabend <john.r.fastabend@intel.com>
> Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
kfree_skb() on a NULL pointer is completely legal.
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [net-2.6 PATCH 5/6] net: fix sock locking for sk_err field in netlink.
2009-09-18 0:58 ` [net-2.6 PATCH 5/6] net: fix sock locking for sk_err field in netlink Jeff Kirsher
@ 2009-09-18 1:27 ` David Miller
0 siblings, 0 replies; 11+ messages in thread
From: David Miller @ 2009-09-18 1:27 UTC (permalink / raw)
To: jeffrey.t.kirsher; +Cc: netdev, gospo, linux-scsi, john.r.fastabend
From: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
Date: Thu, 17 Sep 2009 17:58:32 -0700
> From: John Fastabend <john.r.fastabend@intel.com>
>
> This adds the sock lock around setting the sk_err field
> in sock struct. Without the lock multiple threads may
> write to this field.
>
> Signed-off-by: John Fastabend <john.r.fastabend@intel.com>
> Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
This isn't right.
Writes to sk->sk_err can occur asynchronously just fine and
without any locking.
The only requirement is that consumers of the sk_err value
use sock_error() which uses xchg() to get and clear the
value atomically.
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [net-2.6 PATCH 1/6] net: initialize rmem_alloc and omem_alloc to 0 in netlink socket
2009-09-18 0:57 [net-2.6 PATCH 1/6] net: initialize rmem_alloc and omem_alloc to 0 in netlink socket Jeff Kirsher
` (4 preceding siblings ...)
2009-09-18 0:58 ` [net-2.6 PATCH 6/6] net: fix double skb free in dcbnl Jeff Kirsher
@ 2009-09-18 1:29 ` David Miller
5 siblings, 0 replies; 11+ messages in thread
From: David Miller @ 2009-09-18 1:29 UTC (permalink / raw)
To: jeffrey.t.kirsher; +Cc: netdev, gospo, linux-scsi, john.r.fastabend
From: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
Date: Thu, 17 Sep 2009 17:57:09 -0700
> From: John Fastabend <john.r.fastabend@intel.com>
>
> The rmem_alloc and omem_alloc socket fields are not
> initialized. This sets each variable to zero when a socket
> is created. Note the sk_wmem_alloc is already initialized
> in sock_init_data.
>
> Signed-off-by: John Fastabend <john.r.fastabend@intel.com>
> Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
It's set to zero implicitly by the memset() done at sock_alloc()
time.
Re-setting it again here explicitly will just add unnecessary
memory traffic.
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [net-2.6 PATCH 2/6] net: remove kfree_skb on a NULL pointer in af_netlink.c
2009-09-18 1:24 ` David Miller
@ 2009-09-21 12:04 ` John Fastabend
2009-09-21 20:54 ` David Miller
0 siblings, 1 reply; 11+ messages in thread
From: John Fastabend @ 2009-09-21 12:04 UTC (permalink / raw)
To: David Miller
Cc: Kirsher, Jeffrey T, netdev@vger.kernel.org, gospo@redhat.com,
linux-scsi@vger.kernel.org
David Miller wrote:
> From: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
> Date: Thu, 17 Sep 2009 17:57:29 -0700
>
>
>> From: John Fastabend <john.r.fastabend@intel.com>
>>
>> This removes a kfree_skb that is being called on a NULL pointer when
>> do_one_broadcast() is sucessful. And moves the kfree_skb into
>> do_one_broadcast() for the error case.
>>
>> Signed-off-by: John Fastabend <john.r.fastabend@intel.com>
>> Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
>>
>
> kfree_skb() on a NULL pointer is completely legal.
>
OK, but this depends on the unlikely() macro in kfree_skb() to catch a
case that is the expected non-error case. Would it be better to wrap the
kfree_skb() in an if statement to avoid hitting the unlikely() macro?
Or is the performance hit from the unlikely() macro so small this is not
an issue? Thanks for looking at these.
john.
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [net-2.6 PATCH 2/6] net: remove kfree_skb on a NULL pointer in af_netlink.c
2009-09-21 12:04 ` John Fastabend
@ 2009-09-21 20:54 ` David Miller
0 siblings, 0 replies; 11+ messages in thread
From: David Miller @ 2009-09-21 20:54 UTC (permalink / raw)
To: john.r.fastabend; +Cc: jeffrey.t.kirsher, netdev, gospo, linux-scsi
From: John Fastabend <john.r.fastabend@intel.com>
Date: Mon, 21 Sep 2009 12:04:35 +0000
>>
> OK, but this depends on the unlikely() macro in kfree_skb() to catch a
> case that is the expected non-error case. Would it be better to wrap
> the kfree_skb() in an if statement to avoid hitting the unlikely()
> macro? Or is the performance hit from the unlikely() macro so small
> this is not an issue? Thanks for looking at these.
>
Expands too much code inline, that's why we don't do it that
way.
^ permalink raw reply [flat|nested] 11+ messages in thread
end of thread, other threads:[~2009-09-21 20:54 UTC | newest]
Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-09-18 0:57 [net-2.6 PATCH 1/6] net: initialize rmem_alloc and omem_alloc to 0 in netlink socket Jeff Kirsher
2009-09-18 0:57 ` [net-2.6 PATCH 2/6] net: remove kfree_skb on a NULL pointer in af_netlink.c Jeff Kirsher
2009-09-18 1:24 ` David Miller
2009-09-21 12:04 ` John Fastabend
2009-09-21 20:54 ` David Miller
2009-09-18 0:57 ` [net-2.6 PATCH 3/6] net: fix vlan_get_size to include vlan_flags size Jeff Kirsher
2009-09-18 0:58 ` [net-2.6 PATCH 4/6] net: fix nlmsg len size for skb when error bit is set Jeff Kirsher
2009-09-18 0:58 ` [net-2.6 PATCH 5/6] net: fix sock locking for sk_err field in netlink Jeff Kirsher
2009-09-18 1:27 ` David Miller
2009-09-18 0:58 ` [net-2.6 PATCH 6/6] net: fix double skb free in dcbnl Jeff Kirsher
2009-09-18 1:29 ` [net-2.6 PATCH 1/6] net: initialize rmem_alloc and omem_alloc to 0 in netlink socket David Miller
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.