* Re: Unable to create more than 1 guest virtio-net device using vhost-net backend
From: Avi Kivity @ 2010-03-21 10:31 UTC (permalink / raw)
To: Gleb Natapov
Cc: Michael S. Tsirkin, Sridhar Samudrala, netdev,
kvm@vger.kernel.org
In-Reply-To: <20100321102143.GC13522@redhat.com>
On 03/21/2010 12:21 PM, Gleb Natapov wrote:
> On Sun, Mar 21, 2010 at 12:11:33PM +0200, Avi Kivity wrote:
>
>> On 03/21/2010 11:55 AM, Michael S. Tsirkin wrote:
>>
>>> On Fri, Mar 19, 2010 at 03:19:27PM -0700, Sridhar Samudrala wrote:
>>>
>>>> When creating a guest with 2 virtio-net interfaces, i am running
>>>> into a issue causing the 2nd i/f falling back to userpace virtio
>>>> even when vhost is enabled.
>>>>
>>>> After some debugging, it turned out that KVM_IOEVENTFD ioctl()
>>>> call in qemu is failing with ENOSPC.
>>>> This is because of the NR_IOBUS_DEVS(6) limit in kvm_io_bus_register_dev()
>>>> routine in the host kernel.
>>>>
>>>> I think we need to increase this limit if we want to support multiple
>>>> network interfaces using vhost-net.
>>>> Is there an alternate solution?
>>>>
>>>> Thanks
>>>> Sridhar
>>>>
>>> Nothing easy that I can see. Each device needs 2 of these. Avi, Gleb,
>>> any objections to increasing the limit to say 16? That would give us
>>> 5 more devices to the limit of 6 per guest.
>>>
>> Increase it to 200, then.
>>
>>
> Currently on each device read/write we iterate over all registered
> devices. This is not scalable.
>
Yeah. We need first to drop the callback based matching and replace it
with explicit ranges, then to replace the search with a hash table for
small ranges (keeping a linear search for large ranges, can happen for
coalesced mmio).
--
error compiling committee.c: too many arguments to function
^ permalink raw reply
* Re: Unable to create more than 1 guest virtio-net device using vhost-net backend
From: Avi Kivity @ 2010-03-21 10:29 UTC (permalink / raw)
To: Michael S. Tsirkin; +Cc: Sridhar Samudrala, netdev, kvm@vger.kernel.org, gleb
In-Reply-To: <20100321101527.GH6443@redhat.com>
On 03/21/2010 12:15 PM, Michael S. Tsirkin wrote:
>>> Nothing easy that I can see. Each device needs 2 of these. Avi, Gleb,
>>> any objections to increasing the limit to say 16? That would give us
>>> 5 more devices to the limit of 6 per guest.
>>>
>>>
>> Increase it to 200, then.
>>
> OK. I think we'll also need a smarter allocator
> than bus->dev_count++ than we now have. Right?
>
No, why?
Eventually we'll want faster scanning than the linear search we employ
now, though.
>> Is the limit visible to userspace? If not, we need to expose it.
>>
> I don't think it's visible: it seems to be used in a single
> place in kvm. Let's add an ioctl? Note that qemu doesn't
> need it now ...
>
We usually expose limits via KVM_CHECK_EXTENSION(KVM_CAP_BLAH). We can
expose it via KVM_CAP_IOEVENTFD (and need to reserve iodev entries for
those).
--
error compiling committee.c: too many arguments to function
^ permalink raw reply
* Re: Unable to create more than 1 guest virtio-net device using vhost-net backend
From: Gleb Natapov @ 2010-03-21 10:21 UTC (permalink / raw)
To: Avi Kivity
Cc: Michael S. Tsirkin, Sridhar Samudrala, netdev,
kvm@vger.kernel.org
In-Reply-To: <4BA5F0D5.6020801@redhat.com>
On Sun, Mar 21, 2010 at 12:11:33PM +0200, Avi Kivity wrote:
> On 03/21/2010 11:55 AM, Michael S. Tsirkin wrote:
> >On Fri, Mar 19, 2010 at 03:19:27PM -0700, Sridhar Samudrala wrote:
> >>When creating a guest with 2 virtio-net interfaces, i am running
> >>into a issue causing the 2nd i/f falling back to userpace virtio
> >>even when vhost is enabled.
> >>
> >>After some debugging, it turned out that KVM_IOEVENTFD ioctl()
> >>call in qemu is failing with ENOSPC.
> >>This is because of the NR_IOBUS_DEVS(6) limit in kvm_io_bus_register_dev()
> >>routine in the host kernel.
> >>
> >>I think we need to increase this limit if we want to support multiple
> >>network interfaces using vhost-net.
> >>Is there an alternate solution?
> >>
> >>Thanks
> >>Sridhar
> >Nothing easy that I can see. Each device needs 2 of these. Avi, Gleb,
> >any objections to increasing the limit to say 16? That would give us
> >5 more devices to the limit of 6 per guest.
>
> Increase it to 200, then.
>
Currently on each device read/write we iterate over all registered
devices. This is not scalable.
> Is the limit visible to userspace? If not, we need to expose it.
>
> --
> error compiling committee.c: too many arguments to function
--
Gleb.
^ permalink raw reply
* Re: Unable to create more than 1 guest virtio-net device using vhost-net backend
From: Michael S. Tsirkin @ 2010-03-21 10:15 UTC (permalink / raw)
To: Avi Kivity; +Cc: Sridhar Samudrala, netdev, kvm@vger.kernel.org, gleb
In-Reply-To: <4BA5F0D5.6020801@redhat.com>
On Sun, Mar 21, 2010 at 12:11:33PM +0200, Avi Kivity wrote:
> On 03/21/2010 11:55 AM, Michael S. Tsirkin wrote:
>> On Fri, Mar 19, 2010 at 03:19:27PM -0700, Sridhar Samudrala wrote:
>>
>>> When creating a guest with 2 virtio-net interfaces, i am running
>>> into a issue causing the 2nd i/f falling back to userpace virtio
>>> even when vhost is enabled.
>>>
>>> After some debugging, it turned out that KVM_IOEVENTFD ioctl()
>>> call in qemu is failing with ENOSPC.
>>> This is because of the NR_IOBUS_DEVS(6) limit in kvm_io_bus_register_dev()
>>> routine in the host kernel.
>>>
>>> I think we need to increase this limit if we want to support multiple
>>> network interfaces using vhost-net.
>>> Is there an alternate solution?
>>>
>>> Thanks
>>> Sridhar
>>>
>> Nothing easy that I can see. Each device needs 2 of these. Avi, Gleb,
>> any objections to increasing the limit to say 16? That would give us
>> 5 more devices to the limit of 6 per guest.
>>
>
> Increase it to 200, then.
OK. I think we'll also need a smarter allocator
than bus->dev_count++ than we now have. Right?
> Is the limit visible to userspace? If not, we need to expose it.
I don't think it's visible: it seems to be used in a single
place in kvm. Let's add an ioctl? Note that qemu doesn't
need it now ...
> --
> error compiling committee.c: too many arguments to function
^ permalink raw reply
* Re: Unable to create more than 1 guest virtio-net device using vhost-net backend
From: Avi Kivity @ 2010-03-21 10:11 UTC (permalink / raw)
To: Michael S. Tsirkin; +Cc: Sridhar Samudrala, netdev, kvm@vger.kernel.org, gleb
In-Reply-To: <20100321095544.GA6443@redhat.com>
On 03/21/2010 11:55 AM, Michael S. Tsirkin wrote:
> On Fri, Mar 19, 2010 at 03:19:27PM -0700, Sridhar Samudrala wrote:
>
>> When creating a guest with 2 virtio-net interfaces, i am running
>> into a issue causing the 2nd i/f falling back to userpace virtio
>> even when vhost is enabled.
>>
>> After some debugging, it turned out that KVM_IOEVENTFD ioctl()
>> call in qemu is failing with ENOSPC.
>> This is because of the NR_IOBUS_DEVS(6) limit in kvm_io_bus_register_dev()
>> routine in the host kernel.
>>
>> I think we need to increase this limit if we want to support multiple
>> network interfaces using vhost-net.
>> Is there an alternate solution?
>>
>> Thanks
>> Sridhar
>>
> Nothing easy that I can see. Each device needs 2 of these. Avi, Gleb,
> any objections to increasing the limit to say 16? That would give us
> 5 more devices to the limit of 6 per guest.
>
Increase it to 200, then.
Is the limit visible to userspace? If not, we need to expose it.
--
error compiling committee.c: too many arguments to function
^ permalink raw reply
* Re: Unable to create more than 1 guest virtio-net device using vhost-net backend
From: Michael S. Tsirkin @ 2010-03-21 9:55 UTC (permalink / raw)
To: Sridhar Samudrala; +Cc: netdev, kvm@vger.kernel.org, avi, gleb
In-Reply-To: <1269037167.5127.12.camel@w-sridhar.beaverton.ibm.com>
On Fri, Mar 19, 2010 at 03:19:27PM -0700, Sridhar Samudrala wrote:
> When creating a guest with 2 virtio-net interfaces, i am running
> into a issue causing the 2nd i/f falling back to userpace virtio
> even when vhost is enabled.
>
> After some debugging, it turned out that KVM_IOEVENTFD ioctl()
> call in qemu is failing with ENOSPC.
> This is because of the NR_IOBUS_DEVS(6) limit in kvm_io_bus_register_dev()
> routine in the host kernel.
>
> I think we need to increase this limit if we want to support multiple
> network interfaces using vhost-net.
> Is there an alternate solution?
>
> Thanks
> Sridhar
Nothing easy that I can see. Each device needs 2 of these. Avi, Gleb,
any objections to increasing the limit to say 16? That would give us
5 more devices to the limit of 6 per guest.
--
MST
^ permalink raw reply
* [patch] sunrpc: handle allocation errors from __rpc_lookup_create()
From: Dan Carpenter @ 2010-03-21 9:28 UTC (permalink / raw)
To: Trond Myklebust
Cc: J. Bruce Fields, Neil Brown, David S. Miller,
linux-nfs-u79uwXL29TY76Z2rM5mHXA, netdev-u79uwXL29TY76Z2rM5mHXA,
kernel-janitors-u79uwXL29TY76Z2rM5mHXA
__rpc_lookup_create() can return ERR_PTR(-ENOMEM).
Signed-off-by: Dan Carpenter <error27-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
diff --git a/net/sunrpc/rpc_pipe.c b/net/sunrpc/rpc_pipe.c
index 8d63f8f..20e30c6 100644
--- a/net/sunrpc/rpc_pipe.c
+++ b/net/sunrpc/rpc_pipe.c
@@ -587,6 +587,8 @@ static struct dentry *__rpc_lookup_create_exclusive(struct dentry *parent,
struct dentry *dentry;
dentry = __rpc_lookup_create(parent, name);
+ if (IS_ERR(dentry))
+ return dentry;
if (dentry->d_inode == NULL)
return dentry;
dput(dentry);
--
To unsubscribe from this list: send the line "unsubscribe linux-nfs" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply related
* Re: [PATCH] xfrm: cache bundle lookup results in flow cache
From: Timo Teräs @ 2010-03-21 8:31 UTC (permalink / raw)
To: Herbert Xu; +Cc: netdev, David S. Miller
In-Reply-To: <4BA5CC16.9040606@iki.fi>
Timo Teräs wrote:
> Herbert Xu wrote:
>> On Sat, Mar 20, 2010 at 06:26:00PM +0200, Timo Teräs wrote:
>>> So should go ahead and:
>>> 1. modify flow cache to be more generic (have virtual put and get
>>> for each object; and remove the atomic_t pointer)
>>> 2. modify flow cache to have slow and fast resolvers so we can
>>> copy with the current sleeping requirement
>>
>> I don't think we need either of these. To support the sleep
>> requirement, just return -EAGAIN from the resolver when the
>> template can't be resolved. Then the caller of flow_cache_lookup
>> can sleep as it does now. It simply has to repeat the flow
>> cache lookup afterwards.
>
> Ok, we can do that to skip 2. But I think 1 would be still useful.
> It'd probably be good to actually have flow_cache_ops pointer in
> each entry instead of the atomic_t pointer.
>
> The reasoning:
> - we can then have type-based checks that the reference count
> is valid (e.g. policy's refcount must not go to zero, it's bug,
> and we can call dst_release which warns if refcount goes to
> negative); imho it's hack to call atomic_dec instead of the
> real type's xxx_put
> - the flow cache needs to somehow know if the entry is stale so
> it'll try to refresh it atomically; e.g. if there's no
> check for 'stale', the lookup returns stale xfrm_dst. we'd
> then need new api to update the stale entry, or flush it out
> and repeat the lookup. the virtual get could check for it being
> stale (if so release the entry) and then return null for the
> generic code to call the resolver atomically
> - for paranoia we can actually check the type of the object in
> cache via the ops (if needed)
- could cache bundle OR policy for outgoing stuff. it's useful
to cache the policy in case we need to sleep, or if it's a
policy forbidding traffic. in those cases there's no bundle
to cache at all. alternatively we can make dummy bundles that
are marked invalid and are just used to keep a reference to
the policy.
Oh, this also implies that the resolver function should be
changed to get the old stale object so it can re-use it to
get the policy object instead of searching it all over again.
- Timo
^ permalink raw reply
* Re: [PATCH] xfrm: cache bundle lookup results in flow cache
From: Timo Teräs @ 2010-03-21 7:34 UTC (permalink / raw)
To: Herbert Xu; +Cc: netdev, David S. Miller
In-Reply-To: <20100321004659.GA5895@gondor.apana.org.au>
Herbert Xu wrote:
> On Sat, Mar 20, 2010 at 06:26:00PM +0200, Timo Teräs wrote:
>> So should go ahead and:
>> 1. modify flow cache to be more generic (have virtual put and get
>> for each object; and remove the atomic_t pointer)
>> 2. modify flow cache to have slow and fast resolvers so we can
>> copy with the current sleeping requirement
>
> I don't think we need either of these. To support the sleep
> requirement, just return -EAGAIN from the resolver when the
> template can't be resolved. Then the caller of flow_cache_lookup
> can sleep as it does now. It simply has to repeat the flow
> cache lookup afterwards.
Ok, we can do that to skip 2. But I think 1 would be still useful.
It'd probably be good to actually have flow_cache_ops pointer in
each entry instead of the atomic_t pointer.
The reasoning:
- we can then have type-based checks that the reference count
is valid (e.g. policy's refcount must not go to zero, it's bug,
and we can call dst_release which warns if refcount goes to
negative); imho it's hack to call atomic_dec instead of the
real type's xxx_put
- the flow cache needs to somehow know if the entry is stale so
it'll try to refresh it atomically; e.g. if there's no
check for 'stale', the lookup returns stale xfrm_dst. we'd
then need new api to update the stale entry, or flush it out
and repeat the lookup. the virtual get could check for it being
stale (if so release the entry) and then return null for the
generic code to call the resolver atomically
- for paranoia we can actually check the type of the object in
cache via the ops (if needed)
>> 3. cache bundles instead of policies for outgoing stuff
>> 4. kill find_bundle and just instantiate new ones if we get cache
>> miss
>> 5. put all bundles to global hlist (since only place that walks
>> through them is gc, and stale bundle can be dst_free'd right
>> away); use genid's for policy to flush old bundles
>> 6. dst_free and unlink bundle immediately if it's found to be stale
>
> Sounds good.
Okay. Sounds like a plan. I'll work on this next week.
I'll also try to make it a series of patches instead of the big
hunk I sent initially.
- Timo
^ permalink raw reply
* [PATCH 3/3] Bluetooth: Fix kernel crash on L2CAP stress tests
From: Marcel Holtmann @ 2010-03-21 5:41 UTC (permalink / raw)
To: David Miller, Linus Torvalds; +Cc: netdev
In-Reply-To: <cover.1269149354.git.marcel@holtmann.org>
From: Andrei Emeltchenko <andrei.emeltchenko@nokia.com>
Added very simple check that req buffer has enough space to
fit configuration parameters. Shall be enough to reject packets
with configuration size more than req buffer.
Crash trace below
[ 6069.659393] Unable to handle kernel paging request at virtual address 02000205
[ 6069.673034] Internal error: Oops: 805 [#1] PREEMPT
...
[ 6069.727172] PC is at l2cap_add_conf_opt+0x70/0xf0 [l2cap]
[ 6069.732604] LR is at l2cap_recv_frame+0x1350/0x2e78 [l2cap]
...
[ 6070.030303] Backtrace:
[ 6070.032806] [<bf1c2880>] (l2cap_add_conf_opt+0x0/0xf0 [l2cap]) from
[<bf1c6624>] (l2cap_recv_frame+0x1350/0x2e78 [l2cap])
[ 6070.043823] r8:dc5d3100 r7:df2a91d6 r6:00000001 r5:df2a8000 r4:00000200
[ 6070.050659] [<bf1c52d4>] (l2cap_recv_frame+0x0/0x2e78 [l2cap]) from
[<bf1c8408>] (l2cap_recv_acldata+0x2bc/0x350 [l2cap])
[ 6070.061798] [<bf1c814c>] (l2cap_recv_acldata+0x0/0x350 [l2cap]) from
[<bf0037a4>] (hci_rx_task+0x244/0x478 [bluetooth])
[ 6070.072631] r6:dc647700 r5:00000001 r4:df2ab740
[ 6070.077362] [<bf003560>] (hci_rx_task+0x0/0x478 [bluetooth]) from
[<c006b9fc>] (tasklet_action+0x78/0xd8)
[ 6070.087005] [<c006b984>] (tasklet_action+0x0/0xd8) from [<c006c160>]
Signed-off-by: Andrei Emeltchenko <andrei.emeltchenko@nokia.com>
Acked-by: Gustavo F. Padovan <gustavo@padovan.org>
Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
---
net/bluetooth/l2cap.c | 5 +++++
1 files changed, 5 insertions(+), 0 deletions(-)
diff --git a/net/bluetooth/l2cap.c b/net/bluetooth/l2cap.c
index 43e17f7..7794a2e 100644
--- a/net/bluetooth/l2cap.c
+++ b/net/bluetooth/l2cap.c
@@ -2832,6 +2832,11 @@ static inline int l2cap_config_rsp(struct l2cap_conn *conn, struct l2cap_cmd_hdr
int len = cmd->len - sizeof(*rsp);
char req[64];
+ if (len > sizeof(req) - sizeof(struct l2cap_conf_req)) {
+ l2cap_send_disconn_req(conn, sk);
+ goto done;
+ }
+
/* throw out any old stored conf requests */
result = L2CAP_CONF_SUCCESS;
len = l2cap_parse_conf_rsp(sk, rsp->data,
--
1.6.6.1
^ permalink raw reply related
* [PATCH 2/3] Bluetooth: Convert debug files to actually use debugfs instead of sysfs
From: Marcel Holtmann @ 2010-03-21 5:41 UTC (permalink / raw)
To: David Miller, Linus Torvalds; +Cc: netdev
In-Reply-To: <cover.1269149354.git.marcel@holtmann.org>
Some of the debug files ended up wrongly in sysfs, because at that point
of time, debugfs didn't exist. Convert these files to use debugfs and
also seq_file. This patch converts all of these files at once and then
removes the exported symbol for the Bluetooth sysfs class.
Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
---
include/net/bluetooth/bluetooth.h | 2 +-
net/bluetooth/hci_sysfs.c | 3 +-
net/bluetooth/l2cap.c | 51 +++++++++++++++++++++---------------
net/bluetooth/rfcomm/core.c | 52 ++++++++++++++++++++----------------
net/bluetooth/rfcomm/sock.c | 47 +++++++++++++++++++--------------
net/bluetooth/sco.c | 47 ++++++++++++++++++---------------
6 files changed, 114 insertions(+), 88 deletions(-)
diff --git a/include/net/bluetooth/bluetooth.h b/include/net/bluetooth/bluetooth.h
index 04a6908..ff77e8f 100644
--- a/include/net/bluetooth/bluetooth.h
+++ b/include/net/bluetooth/bluetooth.h
@@ -176,6 +176,6 @@ extern void hci_sock_cleanup(void);
extern int bt_sysfs_init(void);
extern void bt_sysfs_cleanup(void);
-extern struct class *bt_class;
+extern struct dentry *bt_debugfs;
#endif /* __BLUETOOTH_H */
diff --git a/net/bluetooth/hci_sysfs.c b/net/bluetooth/hci_sysfs.c
index cafb55b..05fd125 100644
--- a/net/bluetooth/hci_sysfs.c
+++ b/net/bluetooth/hci_sysfs.c
@@ -8,8 +8,7 @@
#include <net/bluetooth/bluetooth.h>
#include <net/bluetooth/hci_core.h>
-struct class *bt_class = NULL;
-EXPORT_SYMBOL_GPL(bt_class);
+static struct class *bt_class;
struct dentry *bt_debugfs = NULL;
EXPORT_SYMBOL_GPL(bt_debugfs);
diff --git a/net/bluetooth/l2cap.c b/net/bluetooth/l2cap.c
index 2755182..43e17f7 100644
--- a/net/bluetooth/l2cap.c
+++ b/net/bluetooth/l2cap.c
@@ -40,6 +40,8 @@
#include <linux/skbuff.h>
#include <linux/list.h>
#include <linux/device.h>
+#include <linux/debugfs.h>
+#include <linux/seq_file.h>
#include <linux/uaccess.h>
#include <linux/crc16.h>
#include <net/sock.h>
@@ -3937,39 +3939,42 @@ drop:
return 0;
}
-static ssize_t l2cap_sysfs_show(struct class *dev,
- struct class_attribute *attr,
- char *buf)
+static int l2cap_debugfs_show(struct seq_file *f, void *p)
{
struct sock *sk;
struct hlist_node *node;
- char *str = buf;
- int size = PAGE_SIZE;
read_lock_bh(&l2cap_sk_list.lock);
sk_for_each(sk, node, &l2cap_sk_list.head) {
struct l2cap_pinfo *pi = l2cap_pi(sk);
- int len;
-
- len = snprintf(str, size, "%s %s %d %d 0x%4.4x 0x%4.4x %d %d %d\n",
- batostr(&bt_sk(sk)->src), batostr(&bt_sk(sk)->dst),
- sk->sk_state, __le16_to_cpu(pi->psm), pi->scid,
- pi->dcid, pi->imtu, pi->omtu, pi->sec_level);
-
- size -= len;
- if (size <= 0)
- break;
- str += len;
+ seq_printf(f, "%s %s %d %d 0x%4.4x 0x%4.4x %d %d %d\n",
+ batostr(&bt_sk(sk)->src),
+ batostr(&bt_sk(sk)->dst),
+ sk->sk_state, __le16_to_cpu(pi->psm),
+ pi->scid, pi->dcid,
+ pi->imtu, pi->omtu, pi->sec_level);
}
read_unlock_bh(&l2cap_sk_list.lock);
- return str - buf;
+ return 0;
}
-static CLASS_ATTR(l2cap, S_IRUGO, l2cap_sysfs_show, NULL);
+static int l2cap_debugfs_open(struct inode *inode, struct file *file)
+{
+ return single_open(file, l2cap_debugfs_show, inode->i_private);
+}
+
+static const struct file_operations l2cap_debugfs_fops = {
+ .open = l2cap_debugfs_open,
+ .read = seq_read,
+ .llseek = seq_lseek,
+ .release = single_release,
+};
+
+static struct dentry *l2cap_debugfs;
static const struct proto_ops l2cap_sock_ops = {
.family = PF_BLUETOOTH,
@@ -4029,8 +4034,12 @@ static int __init l2cap_init(void)
goto error;
}
- if (class_create_file(bt_class, &class_attr_l2cap) < 0)
- BT_ERR("Failed to create L2CAP info file");
+ if (bt_debugfs) {
+ l2cap_debugfs = debugfs_create_file("l2cap", 0444,
+ bt_debugfs, NULL, &l2cap_debugfs_fops);
+ if (!l2cap_debugfs)
+ BT_ERR("Failed to create L2CAP debug file");
+ }
BT_INFO("L2CAP ver %s", VERSION);
BT_INFO("L2CAP socket layer initialized");
@@ -4044,7 +4053,7 @@ error:
static void __exit l2cap_exit(void)
{
- class_remove_file(bt_class, &class_attr_l2cap);
+ debugfs_remove(l2cap_debugfs);
if (bt_sock_unregister(BTPROTO_L2CAP) < 0)
BT_ERR("L2CAP socket unregistration failed");
diff --git a/net/bluetooth/rfcomm/core.c b/net/bluetooth/rfcomm/core.c
index cf16407..13f114e 100644
--- a/net/bluetooth/rfcomm/core.c
+++ b/net/bluetooth/rfcomm/core.c
@@ -33,6 +33,8 @@
#include <linux/init.h>
#include <linux/wait.h>
#include <linux/device.h>
+#include <linux/debugfs.h>
+#include <linux/seq_file.h>
#include <linux/net.h>
#include <linux/mutex.h>
#include <linux/kthread.h>
@@ -2098,14 +2100,10 @@ static struct hci_cb rfcomm_cb = {
.security_cfm = rfcomm_security_cfm
};
-static ssize_t rfcomm_dlc_sysfs_show(struct class *dev,
- struct class_attribute *attr,
- char *buf)
+static int rfcomm_dlc_debugfs_show(struct seq_file *f, void *x)
{
struct rfcomm_session *s;
struct list_head *pp, *p;
- char *str = buf;
- int size = PAGE_SIZE;
rfcomm_lock();
@@ -2114,29 +2112,33 @@ static ssize_t rfcomm_dlc_sysfs_show(struct class *dev,
list_for_each(pp, &s->dlcs) {
struct sock *sk = s->sock->sk;
struct rfcomm_dlc *d = list_entry(pp, struct rfcomm_dlc, list);
- int len;
- len = snprintf(str, size, "%s %s %ld %d %d %d %d\n",
- batostr(&bt_sk(sk)->src), batostr(&bt_sk(sk)->dst),
- d->state, d->dlci, d->mtu, d->rx_credits, d->tx_credits);
-
- size -= len;
- if (size <= 0)
- break;
-
- str += len;
+ seq_printf(f, "%s %s %ld %d %d %d %d\n",
+ batostr(&bt_sk(sk)->src),
+ batostr(&bt_sk(sk)->dst),
+ d->state, d->dlci, d->mtu,
+ d->rx_credits, d->tx_credits);
}
-
- if (size <= 0)
- break;
}
rfcomm_unlock();
- return (str - buf);
+ return 0;
+}
+
+static int rfcomm_dlc_debugfs_open(struct inode *inode, struct file *file)
+{
+ return single_open(file, rfcomm_dlc_debugfs_show, inode->i_private);
}
-static CLASS_ATTR(rfcomm_dlc, S_IRUGO, rfcomm_dlc_sysfs_show, NULL);
+static const struct file_operations rfcomm_dlc_debugfs_fops = {
+ .open = rfcomm_dlc_debugfs_open,
+ .read = seq_read,
+ .llseek = seq_lseek,
+ .release = single_release,
+};
+
+static struct dentry *rfcomm_dlc_debugfs;
/* ---- Initialization ---- */
static int __init rfcomm_init(void)
@@ -2153,8 +2155,12 @@ static int __init rfcomm_init(void)
goto unregister;
}
- if (class_create_file(bt_class, &class_attr_rfcomm_dlc) < 0)
- BT_ERR("Failed to create RFCOMM info file");
+ if (bt_debugfs) {
+ rfcomm_dlc_debugfs = debugfs_create_file("rfcomm_dlc", 0444,
+ bt_debugfs, NULL, &rfcomm_dlc_debugfs_fops);
+ if (!rfcomm_dlc_debugfs)
+ BT_ERR("Failed to create RFCOMM debug file");
+ }
err = rfcomm_init_ttys();
if (err < 0)
@@ -2182,7 +2188,7 @@ unregister:
static void __exit rfcomm_exit(void)
{
- class_remove_file(bt_class, &class_attr_rfcomm_dlc);
+ debugfs_remove(rfcomm_dlc_debugfs);
hci_unregister_cb(&rfcomm_cb);
diff --git a/net/bluetooth/rfcomm/sock.c b/net/bluetooth/rfcomm/sock.c
index 8d0ee0b..7f43976 100644
--- a/net/bluetooth/rfcomm/sock.c
+++ b/net/bluetooth/rfcomm/sock.c
@@ -40,6 +40,8 @@
#include <linux/skbuff.h>
#include <linux/list.h>
#include <linux/device.h>
+#include <linux/debugfs.h>
+#include <linux/seq_file.h>
#include <net/sock.h>
#include <asm/system.h>
@@ -1061,37 +1063,38 @@ done:
return result;
}
-static ssize_t rfcomm_sock_sysfs_show(struct class *dev,
- struct class_attribute *attr,
- char *buf)
+static int rfcomm_sock_debugfs_show(struct seq_file *f, void *p)
{
struct sock *sk;
struct hlist_node *node;
- char *str = buf;
- int size = PAGE_SIZE;
read_lock_bh(&rfcomm_sk_list.lock);
sk_for_each(sk, node, &rfcomm_sk_list.head) {
- int len;
-
- len = snprintf(str, size, "%s %s %d %d\n",
- batostr(&bt_sk(sk)->src), batostr(&bt_sk(sk)->dst),
+ seq_printf(f, "%s %s %d %d\n",
+ batostr(&bt_sk(sk)->src),
+ batostr(&bt_sk(sk)->dst),
sk->sk_state, rfcomm_pi(sk)->channel);
-
- size -= len;
- if (size <= 0)
- break;
-
- str += len;
}
read_unlock_bh(&rfcomm_sk_list.lock);
- return (str - buf);
+ return 0;
}
-static CLASS_ATTR(rfcomm, S_IRUGO, rfcomm_sock_sysfs_show, NULL);
+static int rfcomm_sock_debugfs_open(struct inode *inode, struct file *file)
+{
+ return single_open(file, rfcomm_sock_debugfs_show, inode->i_private);
+}
+
+static const struct file_operations rfcomm_sock_debugfs_fops = {
+ .open = rfcomm_sock_debugfs_open,
+ .read = seq_read,
+ .llseek = seq_lseek,
+ .release = single_release,
+};
+
+static struct dentry *rfcomm_sock_debugfs;
static const struct proto_ops rfcomm_sock_ops = {
.family = PF_BLUETOOTH,
@@ -1131,8 +1134,12 @@ int __init rfcomm_init_sockets(void)
if (err < 0)
goto error;
- if (class_create_file(bt_class, &class_attr_rfcomm) < 0)
- BT_ERR("Failed to create RFCOMM info file");
+ if (bt_debugfs) {
+ rfcomm_sock_debugfs = debugfs_create_file("rfcomm", 0444,
+ bt_debugfs, NULL, &rfcomm_sock_debugfs_fops);
+ if (!rfcomm_sock_debugfs)
+ BT_ERR("Failed to create RFCOMM debug file");
+ }
BT_INFO("RFCOMM socket layer initialized");
@@ -1146,7 +1153,7 @@ error:
void rfcomm_cleanup_sockets(void)
{
- class_remove_file(bt_class, &class_attr_rfcomm);
+ debugfs_remove(rfcomm_sock_debugfs);
if (bt_sock_unregister(BTPROTO_RFCOMM) < 0)
BT_ERR("RFCOMM socket layer unregistration failed");
diff --git a/net/bluetooth/sco.c b/net/bluetooth/sco.c
index 967a751..e5b16b7 100644
--- a/net/bluetooth/sco.c
+++ b/net/bluetooth/sco.c
@@ -38,6 +38,8 @@
#include <linux/socket.h>
#include <linux/skbuff.h>
#include <linux/device.h>
+#include <linux/debugfs.h>
+#include <linux/seq_file.h>
#include <linux/list.h>
#include <net/sock.h>
@@ -953,37 +955,36 @@ drop:
return 0;
}
-static ssize_t sco_sysfs_show(struct class *dev,
- struct class_attribute *attr,
- char *buf)
+static int sco_debugfs_show(struct seq_file *f, void *p)
{
struct sock *sk;
struct hlist_node *node;
- char *str = buf;
- int size = PAGE_SIZE;
read_lock_bh(&sco_sk_list.lock);
sk_for_each(sk, node, &sco_sk_list.head) {
- int len;
-
- len = snprintf(str, size, "%s %s %d\n",
- batostr(&bt_sk(sk)->src), batostr(&bt_sk(sk)->dst),
- sk->sk_state);
-
- size -= len;
- if (size <= 0)
- break;
-
- str += len;
+ seq_printf(f, "%s %s %d\n", batostr(&bt_sk(sk)->src),
+ batostr(&bt_sk(sk)->dst), sk->sk_state);
}
read_unlock_bh(&sco_sk_list.lock);
- return (str - buf);
+ return 0;
}
-static CLASS_ATTR(sco, S_IRUGO, sco_sysfs_show, NULL);
+static int sco_debugfs_open(struct inode *inode, struct file *file)
+{
+ return single_open(file, sco_debugfs_show, inode->i_private);
+}
+
+static const struct file_operations sco_debugfs_fops = {
+ .open = sco_debugfs_open,
+ .read = seq_read,
+ .llseek = seq_lseek,
+ .release = single_release,
+};
+
+static struct dentry *sco_debugfs;
static const struct proto_ops sco_sock_ops = {
.family = PF_BLUETOOTH,
@@ -1041,8 +1042,12 @@ static int __init sco_init(void)
goto error;
}
- if (class_create_file(bt_class, &class_attr_sco) < 0)
- BT_ERR("Failed to create SCO info file");
+ if (bt_debugfs) {
+ sco_debugfs = debugfs_create_file("sco", 0444,
+ bt_debugfs, NULL, &sco_debugfs_fops);
+ if (!sco_debugfs)
+ BT_ERR("Failed to create SCO debug file");
+ }
BT_INFO("SCO (Voice Link) ver %s", VERSION);
BT_INFO("SCO socket layer initialized");
@@ -1056,7 +1061,7 @@ error:
static void __exit sco_exit(void)
{
- class_remove_file(bt_class, &class_attr_sco);
+ debugfs_remove(sco_debugfs);
if (bt_sock_unregister(BTPROTO_SCO) < 0)
BT_ERR("SCO socket unregistration failed");
--
1.6.6.1
^ permalink raw reply related
* [PATCH 1/3] Bluetooth: Fix potential bad memory access with sysfs files
From: Marcel Holtmann @ 2010-03-21 5:41 UTC (permalink / raw)
To: David Miller, Linus Torvalds; +Cc: netdev
In-Reply-To: <cover.1269149354.git.marcel@holtmann.org>
When creating a high number of Bluetooth sockets (L2CAP, SCO
and RFCOMM) it is possible to scribble repeatedly on arbitrary
pages of memory. Ensure that the content of these sysfs files is
always less than one page. Even if this means truncating. The
files in question are scheduled to be moved over to debugfs in
the future anyway.
Based on initial patches from Neil Brown and Linus Torvalds
Reported-by: Neil Brown <neilb@suse.de>
Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
---
net/bluetooth/l2cap.c | 10 +++++++++-
net/bluetooth/rfcomm/core.c | 13 ++++++++++++-
net/bluetooth/rfcomm/sock.c | 11 ++++++++++-
net/bluetooth/sco.c | 11 ++++++++++-
4 files changed, 41 insertions(+), 4 deletions(-)
diff --git a/net/bluetooth/l2cap.c b/net/bluetooth/l2cap.c
index 4db7ae2..2755182 100644
--- a/net/bluetooth/l2cap.c
+++ b/net/bluetooth/l2cap.c
@@ -3944,16 +3944,24 @@ static ssize_t l2cap_sysfs_show(struct class *dev,
struct sock *sk;
struct hlist_node *node;
char *str = buf;
+ int size = PAGE_SIZE;
read_lock_bh(&l2cap_sk_list.lock);
sk_for_each(sk, node, &l2cap_sk_list.head) {
struct l2cap_pinfo *pi = l2cap_pi(sk);
+ int len;
- str += sprintf(str, "%s %s %d %d 0x%4.4x 0x%4.4x %d %d %d\n",
+ len = snprintf(str, size, "%s %s %d %d 0x%4.4x 0x%4.4x %d %d %d\n",
batostr(&bt_sk(sk)->src), batostr(&bt_sk(sk)->dst),
sk->sk_state, __le16_to_cpu(pi->psm), pi->scid,
pi->dcid, pi->imtu, pi->omtu, pi->sec_level);
+
+ size -= len;
+ if (size <= 0)
+ break;
+
+ str += len;
}
read_unlock_bh(&l2cap_sk_list.lock);
diff --git a/net/bluetooth/rfcomm/core.c b/net/bluetooth/rfcomm/core.c
index db8a68e..cf16407 100644
--- a/net/bluetooth/rfcomm/core.c
+++ b/net/bluetooth/rfcomm/core.c
@@ -2105,6 +2105,7 @@ static ssize_t rfcomm_dlc_sysfs_show(struct class *dev,
struct rfcomm_session *s;
struct list_head *pp, *p;
char *str = buf;
+ int size = PAGE_SIZE;
rfcomm_lock();
@@ -2113,11 +2114,21 @@ static ssize_t rfcomm_dlc_sysfs_show(struct class *dev,
list_for_each(pp, &s->dlcs) {
struct sock *sk = s->sock->sk;
struct rfcomm_dlc *d = list_entry(pp, struct rfcomm_dlc, list);
+ int len;
- str += sprintf(str, "%s %s %ld %d %d %d %d\n",
+ len = snprintf(str, size, "%s %s %ld %d %d %d %d\n",
batostr(&bt_sk(sk)->src), batostr(&bt_sk(sk)->dst),
d->state, d->dlci, d->mtu, d->rx_credits, d->tx_credits);
+
+ size -= len;
+ if (size <= 0)
+ break;
+
+ str += len;
}
+
+ if (size <= 0)
+ break;
}
rfcomm_unlock();
diff --git a/net/bluetooth/rfcomm/sock.c b/net/bluetooth/rfcomm/sock.c
index ca87d6a..8d0ee0b 100644
--- a/net/bluetooth/rfcomm/sock.c
+++ b/net/bluetooth/rfcomm/sock.c
@@ -1068,13 +1068,22 @@ static ssize_t rfcomm_sock_sysfs_show(struct class *dev,
struct sock *sk;
struct hlist_node *node;
char *str = buf;
+ int size = PAGE_SIZE;
read_lock_bh(&rfcomm_sk_list.lock);
sk_for_each(sk, node, &rfcomm_sk_list.head) {
- str += sprintf(str, "%s %s %d %d\n",
+ int len;
+
+ len = snprintf(str, size, "%s %s %d %d\n",
batostr(&bt_sk(sk)->src), batostr(&bt_sk(sk)->dst),
sk->sk_state, rfcomm_pi(sk)->channel);
+
+ size -= len;
+ if (size <= 0)
+ break;
+
+ str += len;
}
read_unlock_bh(&rfcomm_sk_list.lock);
diff --git a/net/bluetooth/sco.c b/net/bluetooth/sco.c
index f93b939..967a751 100644
--- a/net/bluetooth/sco.c
+++ b/net/bluetooth/sco.c
@@ -960,13 +960,22 @@ static ssize_t sco_sysfs_show(struct class *dev,
struct sock *sk;
struct hlist_node *node;
char *str = buf;
+ int size = PAGE_SIZE;
read_lock_bh(&sco_sk_list.lock);
sk_for_each(sk, node, &sco_sk_list.head) {
- str += sprintf(str, "%s %s %d\n",
+ int len;
+
+ len = snprintf(str, size, "%s %s %d\n",
batostr(&bt_sk(sk)->src), batostr(&bt_sk(sk)->dst),
sk->sk_state);
+
+ size -= len;
+ if (size <= 0)
+ break;
+
+ str += len;
}
read_unlock_bh(&sco_sk_list.lock);
--
1.6.6.1
^ permalink raw reply related
* Pull request: bluetooth-2.6 2010-03-21
From: Marcel Holtmann @ 2010-03-21 5:41 UTC (permalink / raw)
To: David Miller, Linus Torvalds; +Cc: netdev
Hi Dave,
these patches fix a potential remote denial of service in the L2CAP
layer and a potential bad memory access with some sysfs files.
As agreed with Linus, I fixed the sysfs issue in two steps. The first
patch just avoids the invalid memory access while accepting that the
content might be truncated. The second patch moves everything over to
debugfs (where these files belong anyway) and switches to seq_file.
This two step approach allows an easy backport to -stable kernel by
only picking the first patch.
Linus, feel free to pull directly since both patches are security
related and should be merged as quickly as possible.
Regards
Marcel
Please pull from
git://git.kernel.org/pub/scm/linux/kernel/git/holtmann/bluetooth-2.6.git master
This will update the following files:
include/net/bluetooth/bluetooth.h | 2 +-
net/bluetooth/hci_sysfs.c | 3 +-
net/bluetooth/l2cap.c | 48 +++++++++++++++++++++++++++----------
net/bluetooth/rfcomm/core.c | 41 ++++++++++++++++++++++---------
net/bluetooth/rfcomm/sock.c | 38 ++++++++++++++++++++--------
net/bluetooth/sco.c | 38 ++++++++++++++++++++---------
6 files changed, 119 insertions(+), 51 deletions(-)
through these ChangeSets:
Andrei Emeltchenko (1):
Bluetooth: Fix kernel crash on L2CAP stress tests
Marcel Holtmann (2):
Bluetooth: Fix potential bad memory access with sysfs files
Bluetooth: Convert debug files to actually use debugfs instead of sysfs
^ permalink raw reply
* Re: [PATCH] xfrm: cache bundle lookup results in flow cache
From: Herbert Xu @ 2010-03-21 0:46 UTC (permalink / raw)
To: Timo Teräs; +Cc: netdev, David S. Miller
In-Reply-To: <4BA4F718.3020700@iki.fi>
On Sat, Mar 20, 2010 at 06:26:00PM +0200, Timo Teräs wrote:
>
> So should go ahead and:
> 1. modify flow cache to be more generic (have virtual put and get
> for each object; and remove the atomic_t pointer)
> 2. modify flow cache to have slow and fast resolvers so we can
> copy with the current sleeping requirement
I don't think we need either of these. To support the sleep
requirement, just return -EAGAIN from the resolver when the
template can't be resolved. Then the caller of flow_cache_lookup
can sleep as it does now. It simply has to repeat the flow
cache lookup afterwards.
> 3. cache bundles instead of policies for outgoing stuff
> 4. kill find_bundle and just instantiate new ones if we get cache
> miss
> 5. put all bundles to global hlist (since only place that walks
> through them is gc, and stale bundle can be dst_free'd right
> away); use genid's for policy to flush old bundles
> 6. dst_free and unlink bundle immediately if it's found to be stale
Sounds good.
Cheers,
--
Visit Openswan at http://www.openswan.org/
Email: Herbert Xu ~{PmV>HI~} <herbert@gondor.apana.org.au>
Home Page: http://gondor.apana.org.au/~herbert/
PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt
^ permalink raw reply
* Re: [PATCH] TCP: check min TTL on received ICMP packets
From: Stephen Hemminger @ 2010-03-21 0:05 UTC (permalink / raw)
To: David Miller; +Cc: netdev, pekkas
In-Reply-To: <20100319.210801.39166378.davem@davemloft.net>
----- "David Miller" <davem@davemloft.net> wrote:
> From: Stephen Hemminger <shemminger@vyatta.com>
> Date: Thu, 18 Mar 2010 14:27:32 -0700
>
> > This adds RFC5082 checks for TTL on received ICMP packets.
> > It adds some security against spoofed ICMP packets
> > disrupting GTSM protected sessions.
> >
> > Signed-off-by: Stephen Hemminger <shemminger@vyatta.com>
>
> Applied.
>
> > Please apply to 2.6.33 since it basically a "follow correct RFC"
> > fix to original GTSM patch.
>
I meant 2.6.34... min_ttl is not in 2.6.33
^ permalink raw reply
* [PATCH] Fix bug in addrconf hlist conversion
From: David Miller @ 2010-03-20 23:19 UTC (permalink / raw)
To: shemminger; +Cc: netdev
Committed to net-next-2.6
ipv6: Fix bug in ipv6_chk_same_addr().
hlist_for_each_entry(p...) will not necessarily initialize 'p'
to anything if the hlist is empty. GCC notices this and emits
a warning.
Just return true explicitly when we hit a match, and return
false is we fall out of the loop without one.
Signed-off-by: David S. Miller <davem@davemloft.net>
---
net/ipv6/addrconf.c | 15 +++++++--------
1 files changed, 7 insertions(+), 8 deletions(-)
diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c
index 7d7d4b1..68e5809 100644
--- a/net/ipv6/addrconf.c
+++ b/net/ipv6/addrconf.c
@@ -155,8 +155,8 @@ static void ipv6_ifa_notify(int event, struct inet6_ifaddr *ifa);
static void inet6_prefix_notify(int event, struct inet6_dev *idev,
struct prefix_info *pinfo);
-static int ipv6_chk_same_addr(struct net *net, const struct in6_addr *addr,
- struct net_device *dev);
+static bool ipv6_chk_same_addr(struct net *net, const struct in6_addr *addr,
+ struct net_device *dev);
static ATOMIC_NOTIFIER_HEAD(inet6addr_chain);
@@ -1295,23 +1295,22 @@ int ipv6_chk_addr(struct net *net, struct in6_addr *addr,
}
EXPORT_SYMBOL(ipv6_chk_addr);
-static
-int ipv6_chk_same_addr(struct net *net, const struct in6_addr *addr,
- struct net_device *dev)
+static bool ipv6_chk_same_addr(struct net *net, const struct in6_addr *addr,
+ struct net_device *dev)
{
+ unsigned int hash = ipv6_addr_hash(addr);
struct inet6_ifaddr *ifp;
struct hlist_node *node;
- unsigned int hash = ipv6_addr_hash(addr);
hlist_for_each_entry(ifp, node, &inet6_addr_lst[hash], addr_lst) {
if (!net_eq(dev_net(ifp->idev->dev), net))
continue;
if (ipv6_addr_equal(&ifp->addr, addr)) {
if (dev == NULL || ifp->idev->dev == dev)
- break;
+ return true;
}
}
- return ifp != NULL;
+ return false;
}
int ipv6_chk_prefix(struct in6_addr *addr, struct net_device *dev)
--
1.6.6.1
^ permalink raw reply related
* Re: [PATCH 9/9] IPv6: addrconf cleanup addrconf_verify
From: David Miller @ 2010-03-20 23:13 UTC (permalink / raw)
To: shemminger; +Cc: netdev
In-Reply-To: <20100318063123.441975388@vyatta.com>
From: Stephen Hemminger <shemminger@vyatta.com>
Date: Wed, 17 Mar 2010 23:31:17 -0700
> The variable regen_advance is only used in the privacy case.
> Move it to simplify code and eliminate ifdef's
>
> Signed-off-by: Stephen Hemminger <shemminger@vyatta.com>
Applied.
^ permalink raw reply
* Re: [PATCH 8/9] addrconf: checkpatch fixes
From: David Miller @ 2010-03-20 23:13 UTC (permalink / raw)
To: shemminger; +Cc: netdev
In-Reply-To: <20100318063123.372635144@vyatta.com>
From: Stephen Hemminger <shemminger@vyatta.com>
Date: Wed, 17 Mar 2010 23:31:16 -0700
> Fix some of the checkpatch complaints.
>
> Signed-off-by: Stephen Hemminger <shemminger@vyatta.com>
Applied.
^ permalink raw reply
* Re: [PATCH 7/9] IPv6: addrconf cleanups
From: David Miller @ 2010-03-20 23:12 UTC (permalink / raw)
To: shemminger; +Cc: netdev
In-Reply-To: <20100318063123.302950866@vyatta.com>
From: Stephen Hemminger <shemminger@vyatta.com>
Date: Wed, 17 Mar 2010 23:31:15 -0700
> Some minor stuff, reformat comments and add whitespace for clarity
>
> Signed-off-by: Stephen Hemminger <shemminger@vyatta.com>
Applied.
^ permalink raw reply
* Re: [PATCH net-next-2.6] ipv6: Reduce timer events for addrconf_verify().
From: David Miller @ 2010-03-20 23:12 UTC (permalink / raw)
To: yoshfuji; +Cc: netdev, stephen.hemminger
In-Reply-To: <201003190635.o2J6Z17W016418@94.43.138.210.xn.2iij.net>
From: YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>
Date: Thu, 18 Mar 2010 18:01:11 +0900
> This patch reduces timer events while keeping accuracy by rounding
> our timer and/or batching several address validations in addrconf_verify().
>
> addrconf_verify() is called at earliest timeout among interface addresses'
> timeouts, but at maximum ADDR_CHECK_FREQUENCY (120 secs).
>
> In most cases, all of timeouts of interface addresses are long enough
> (e.g. several hours or days vs 2 minutes), this timer is usually called
> every ADDR_CHECK_FREQUENCY, and it is okay to be lazy.
> (Note this timer could be eliminated if all code paths which modifies
> variables related to timeouts call us manually, but it is another story.)
>
> However, in other least but important cases, we try keeping accuracy.
>
> When the real interface address timeout is coming, and the timeout
> is just before the rounded timeout, we accept some error.
>
> When a timeout has been reached, we also try batching other several
> events in very near future.
>
> Signed-off-by: YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>
Applied.
^ permalink raw reply
* Re: [PATCH 5/9] ipv6: convert idev_list to list macros
From: David Miller @ 2010-03-20 23:05 UTC (permalink / raw)
To: shemminger; +Cc: netdev
In-Reply-To: <20100318063123.162276628@vyatta.com>
From: Stephen Hemminger <shemminger@vyatta.com>
Date: Wed, 17 Mar 2010 23:31:13 -0700
> Convert to list macro's for the list of addresses per interface
> in IPv6.
>
>
> Signed-off-by: Stephen Hemminger <shemminger@vyatta.com>
Applied.
^ permalink raw reply
* Re: [PATCH 4/9] ipv6: user better hash for addrconf
From: David Miller @ 2010-03-20 23:05 UTC (permalink / raw)
To: shemminger; +Cc: netdev
In-Reply-To: <20100318063123.092727548@vyatta.com>
From: Stephen Hemminger <shemminger@vyatta.com>
Date: Wed, 17 Mar 2010 23:31:12 -0700
> The existing hash function has a couple of issues:
> * it is hardwired to 16 for IN6_ADDR_HSIZE
> * limited to 256 and callers using int
> * use jhash2 rather than some old BSD algorithm
>
> No need for random seed since this is local only (based on assigned
> addresses) table.
>
> Signed-off-by: Stephen Hemminger <shemminger@vyatta.com>
Applied.
^ permalink raw reply
* Re: [PATCH 3/9] IPv6: convert addrconf hash list to RCU
From: David Miller @ 2010-03-20 23:05 UTC (permalink / raw)
To: shemminger; +Cc: netdev
In-Reply-To: <20100318063123.022778460@vyatta.com>
From: Stephen Hemminger <shemminger@vyatta.com>
Date: Wed, 17 Mar 2010 23:31:11 -0700
> Convert from reader/writer lock to RCU and spinlock for addrconf
> hash list.
>
> Adds an additional helper macro for hlist_for_each_entry_continue_rcu
> to handle the continue case.
>
> Signed-off-by: Stephen Hemminger <shemminger@vyatta.com>
Applied.
^ permalink raw reply
* Re: [PATCH 2/9] ipv6: convert addrconf list to hlist
From: David Miller @ 2010-03-20 23:05 UTC (permalink / raw)
To: shemminger; +Cc: netdev
In-Reply-To: <20100318063122.935061603@vyatta.com>
From: Stephen Hemminger <shemminger@vyatta.com>
Date: Wed, 17 Mar 2010 23:31:10 -0700
> Using hash list macros, simplifies code and helps later RCU.
>
> This patch includes some initialization that is not strictly necessary,
> since an empty hlist node/list is all zero; and list is in BSS
> and node is allocated with kzalloc.
>
> Signed-off-by: Stephen Hemminger <shemminger@vyatta.com>
Applied.
^ permalink raw reply
* Re: [PATCH 1/9] ipv6: convert temporary address list to list macros
From: David Miller @ 2010-03-20 23:05 UTC (permalink / raw)
To: shemminger; +Cc: netdev
In-Reply-To: <20100318063122.866367333@vyatta.com>
From: Stephen Hemminger <shemminger@vyatta.com>
Date: Wed, 17 Mar 2010 23:31:09 -0700
> Use list macros instead of open coded linked list.
>
> Signed-off-by: Stephen Hemminger <shemminger@vyatta.com>
Applied.
^ 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