* [PATCH 10/12] igb: Change version to remove number after -k in kernel versions.
From: Jeff Kirsher @ 2011-06-10 3:47 UTC (permalink / raw)
To: davem; +Cc: Carolyn Wyborny, netdev, gospo, Jeff Kirsher
In-Reply-To: <1307677676-26690-1-git-send-email-jeffrey.t.kirsher@intel.com>
From: Carolyn Wyborny <carolyn.wyborny@intel.com>
This patch changes the way versioning is done for igb in the kernel by
removing the number after the "k." It has been determined that just the
"k" is sufficient to identify a kernel version and the following number
was used in an inconsistent manner.
Signed-off-by: Carolyn Wyborny <carolyn.wyborny@intel.com>
Tested-by: Jeff Pieper <jeffrey.e.pieper@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
---
drivers/net/igb/igb_main.c | 3 +--
1 files changed, 1 insertions(+), 2 deletions(-)
diff --git a/drivers/net/igb/igb_main.c b/drivers/net/igb/igb_main.c
index 18fccf9..c2e9670 100644
--- a/drivers/net/igb/igb_main.c
+++ b/drivers/net/igb/igb_main.c
@@ -54,9 +54,8 @@
#define MAJ 3
#define MIN 0
#define BUILD 6
-#define KFIX 2
#define DRV_VERSION __stringify(MAJ) "." __stringify(MIN) "." \
-__stringify(BUILD) "-k" __stringify(KFIX)
+__stringify(BUILD) "-k"
char igb_driver_name[] = "igb";
char igb_driver_version[] = DRV_VERSION;
static const char igb_driver_string[] =
--
1.7.5.2
^ permalink raw reply related
* [PATCH 12/12] ixgbevf: Update the driver string
From: Jeff Kirsher @ 2011-06-10 3:47 UTC (permalink / raw)
To: davem; +Cc: Greg Rose, netdev, gospo, Jeff Kirsher
In-Reply-To: <1307677676-26690-1-git-send-email-jeffrey.t.kirsher@intel.com>
From: Greg Rose <gregory.v.rose@intel.com>
Signed-off-by: Greg Rose <gregory.v.rose@intel.com>
Tested-by: Evan Swanson <evan.swanson@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
---
drivers/net/ixgbevf/ixgbevf_main.c | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/drivers/net/ixgbevf/ixgbevf_main.c b/drivers/net/ixgbevf/ixgbevf_main.c
index 28d3cb2..b2c5ecd 100644
--- a/drivers/net/ixgbevf/ixgbevf_main.c
+++ b/drivers/net/ixgbevf/ixgbevf_main.c
@@ -52,7 +52,7 @@ char ixgbevf_driver_name[] = "ixgbevf";
static const char ixgbevf_driver_string[] =
"Intel(R) 10 Gigabit PCI Express Virtual Function Network Driver";
-#define DRV_VERSION "2.0.0-k2"
+#define DRV_VERSION "2.1.0-k"
const char ixgbevf_driver_version[] = DRV_VERSION;
static char ixgbevf_copyright[] =
"Copyright (c) 2009 - 2010 Intel Corporation.";
--
1.7.5.2
^ permalink raw reply related
* [PATCH 11/12] rtnetlink: Compute and store minimum ifinfo dump size
From: Jeff Kirsher @ 2011-06-10 3:47 UTC (permalink / raw)
To: davem; +Cc: Greg Rose, netdev, gospo, Jeff Kirsher
In-Reply-To: <1307677676-26690-1-git-send-email-jeffrey.t.kirsher@intel.com>
From: Greg Rose <gregory.v.rose@intel.com>
The message size allocated for rtnl ifinfo dumps was limited to
a single page. This is not enough for additional interface info
available with devices that support SR-IOV and caused a bug in
which VF info would not be displayed if more than approximately
40 VFs were created per interface.
Implement a new function pointer for the rtnl_register service that will
calculate the amount of data required for the ifinfo dump and allocate
enough data to satisfy the request.
Signed-off-by: Greg Rose <gregory.v.rose@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
---
drivers/infiniband/core/netlink.c | 2 +-
include/linux/netlink.h | 6 ++-
include/net/rtnetlink.h | 7 +++-
net/bridge/br_netlink.c | 15 ++++++---
net/core/fib_rules.c | 6 ++--
net/core/neighbour.c | 11 +++---
net/core/rtnetlink.c | 60 +++++++++++++++++++++++++++------
net/dcb/dcbnl.c | 4 +-
net/decnet/dn_dev.c | 6 ++--
net/decnet/dn_fib.c | 4 +-
net/decnet/dn_route.c | 5 ++-
net/ipv4/devinet.c | 6 ++--
net/ipv4/fib_frontend.c | 6 ++--
net/ipv4/inet_diag.c | 2 +-
net/ipv4/ipmr.c | 3 +-
net/ipv4/route.c | 2 +-
net/ipv6/addrconf.c | 16 ++++++---
net/ipv6/addrlabel.c | 9 +++--
net/ipv6/ip6_fib.c | 3 +-
net/ipv6/ip6mr.c | 3 +-
net/ipv6/route.c | 6 ++--
net/netfilter/ipset/ip_set_core.c | 2 +-
net/netfilter/nf_conntrack_netlink.c | 4 +-
net/netlink/af_netlink.c | 17 ++++++---
net/netlink/genetlink.c | 2 +-
net/phonet/pn_netlink.c | 13 ++++---
net/sched/act_api.c | 7 ++--
net/sched/cls_api.c | 6 ++--
net/sched/sch_api.c | 12 +++---
net/xfrm/xfrm_user.c | 3 +-
30 files changed, 158 insertions(+), 90 deletions(-)
diff --git a/drivers/infiniband/core/netlink.c b/drivers/infiniband/core/netlink.c
index 4a5abaf..9227f4a 100644
--- a/drivers/infiniband/core/netlink.c
+++ b/drivers/infiniband/core/netlink.c
@@ -148,7 +148,7 @@ static int ibnl_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh)
return -EINVAL;
return netlink_dump_start(nls, skb, nlh,
client->cb_table[op].dump,
- NULL);
+ NULL, 0);
}
}
diff --git a/include/linux/netlink.h b/include/linux/netlink.h
index a9dd895..fdd0188 100644
--- a/include/linux/netlink.h
+++ b/include/linux/netlink.h
@@ -221,7 +221,8 @@ struct netlink_callback {
int (*dump)(struct sk_buff * skb,
struct netlink_callback *cb);
int (*done)(struct netlink_callback *cb);
- int family;
+ u16 family;
+ u16 min_dump_alloc;
long args[6];
};
@@ -259,7 +260,8 @@ __nlmsg_put(struct sk_buff *skb, u32 pid, u32 seq, int type, int len, int flags)
extern int netlink_dump_start(struct sock *ssk, struct sk_buff *skb,
const struct nlmsghdr *nlh,
int (*dump)(struct sk_buff *skb, struct netlink_callback*),
- int (*done)(struct netlink_callback*));
+ int (*done)(struct netlink_callback*),
+ u16 min_dump_alloc);
#define NL_NONROOT_RECV 0x1
diff --git a/include/net/rtnetlink.h b/include/net/rtnetlink.h
index 4093ca7..678f1ff 100644
--- a/include/net/rtnetlink.h
+++ b/include/net/rtnetlink.h
@@ -6,11 +6,14 @@
typedef int (*rtnl_doit_func)(struct sk_buff *, struct nlmsghdr *, void *);
typedef int (*rtnl_dumpit_func)(struct sk_buff *, struct netlink_callback *);
+typedef u16 (*rtnl_calcit_func)(struct sk_buff *);
extern int __rtnl_register(int protocol, int msgtype,
- rtnl_doit_func, rtnl_dumpit_func);
+ rtnl_doit_func, rtnl_dumpit_func,
+ rtnl_calcit_func);
extern void rtnl_register(int protocol, int msgtype,
- rtnl_doit_func, rtnl_dumpit_func);
+ rtnl_doit_func, rtnl_dumpit_func,
+ rtnl_calcit_func);
extern int rtnl_unregister(int protocol, int msgtype);
extern void rtnl_unregister_all(int protocol);
diff --git a/net/bridge/br_netlink.c b/net/bridge/br_netlink.c
index ffb0dc4..6814083 100644
--- a/net/bridge/br_netlink.c
+++ b/net/bridge/br_netlink.c
@@ -218,19 +218,24 @@ int __init br_netlink_init(void)
if (err < 0)
goto err1;
- err = __rtnl_register(PF_BRIDGE, RTM_GETLINK, NULL, br_dump_ifinfo);
+ err = __rtnl_register(PF_BRIDGE, RTM_GETLINK, NULL,
+ br_dump_ifinfo, NULL);
if (err)
goto err2;
- err = __rtnl_register(PF_BRIDGE, RTM_SETLINK, br_rtm_setlink, NULL);
+ err = __rtnl_register(PF_BRIDGE, RTM_SETLINK,
+ br_rtm_setlink, NULL, NULL);
if (err)
goto err3;
- err = __rtnl_register(PF_BRIDGE, RTM_NEWNEIGH, br_fdb_add, NULL);
+ err = __rtnl_register(PF_BRIDGE, RTM_NEWNEIGH,
+ br_fdb_add, NULL, NULL);
if (err)
goto err3;
- err = __rtnl_register(PF_BRIDGE, RTM_DELNEIGH, br_fdb_delete, NULL);
+ err = __rtnl_register(PF_BRIDGE, RTM_DELNEIGH,
+ br_fdb_delete, NULL, NULL);
if (err)
goto err3;
- err = __rtnl_register(PF_BRIDGE, RTM_GETNEIGH, NULL, br_fdb_dump);
+ err = __rtnl_register(PF_BRIDGE, RTM_GETNEIGH,
+ NULL, br_fdb_dump, NULL);
if (err)
goto err3;
diff --git a/net/core/fib_rules.c b/net/core/fib_rules.c
index 008dc70..e7ab0c0 100644
--- a/net/core/fib_rules.c
+++ b/net/core/fib_rules.c
@@ -740,9 +740,9 @@ static struct pernet_operations fib_rules_net_ops = {
static int __init fib_rules_init(void)
{
int err;
- rtnl_register(PF_UNSPEC, RTM_NEWRULE, fib_nl_newrule, NULL);
- rtnl_register(PF_UNSPEC, RTM_DELRULE, fib_nl_delrule, NULL);
- rtnl_register(PF_UNSPEC, RTM_GETRULE, NULL, fib_nl_dumprule);
+ rtnl_register(PF_UNSPEC, RTM_NEWRULE, fib_nl_newrule, NULL, NULL);
+ rtnl_register(PF_UNSPEC, RTM_DELRULE, fib_nl_delrule, NULL, NULL);
+ rtnl_register(PF_UNSPEC, RTM_GETRULE, NULL, fib_nl_dumprule, NULL);
err = register_pernet_subsys(&fib_rules_net_ops);
if (err < 0)
diff --git a/net/core/neighbour.c b/net/core/neighbour.c
index 799f06e..ceb505b 100644
--- a/net/core/neighbour.c
+++ b/net/core/neighbour.c
@@ -2909,12 +2909,13 @@ EXPORT_SYMBOL(neigh_sysctl_unregister);
static int __init neigh_init(void)
{
- rtnl_register(PF_UNSPEC, RTM_NEWNEIGH, neigh_add, NULL);
- rtnl_register(PF_UNSPEC, RTM_DELNEIGH, neigh_delete, NULL);
- rtnl_register(PF_UNSPEC, RTM_GETNEIGH, NULL, neigh_dump_info);
+ rtnl_register(PF_UNSPEC, RTM_NEWNEIGH, neigh_add, NULL, NULL);
+ rtnl_register(PF_UNSPEC, RTM_DELNEIGH, neigh_delete, NULL, NULL);
+ rtnl_register(PF_UNSPEC, RTM_GETNEIGH, NULL, neigh_dump_info, NULL);
- rtnl_register(PF_UNSPEC, RTM_GETNEIGHTBL, NULL, neightbl_dump_info);
- rtnl_register(PF_UNSPEC, RTM_SETNEIGHTBL, neightbl_set, NULL);
+ rtnl_register(PF_UNSPEC, RTM_GETNEIGHTBL, NULL, neightbl_dump_info,
+ NULL);
+ rtnl_register(PF_UNSPEC, RTM_SETNEIGHTBL, neightbl_set, NULL, NULL);
return 0;
}
diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c
index abd936d..a798fc6 100644
--- a/net/core/rtnetlink.c
+++ b/net/core/rtnetlink.c
@@ -56,9 +56,11 @@
struct rtnl_link {
rtnl_doit_func doit;
rtnl_dumpit_func dumpit;
+ rtnl_calcit_func calcit;
};
static DEFINE_MUTEX(rtnl_mutex);
+static u16 min_ifinfo_dump_size;
void rtnl_lock(void)
{
@@ -144,12 +146,28 @@ static rtnl_dumpit_func rtnl_get_dumpit(int protocol, int msgindex)
return tab ? tab[msgindex].dumpit : NULL;
}
+static rtnl_calcit_func rtnl_get_calcit(int protocol, int msgindex)
+{
+ struct rtnl_link *tab;
+
+ if (protocol <= RTNL_FAMILY_MAX)
+ tab = rtnl_msg_handlers[protocol];
+ else
+ tab = NULL;
+
+ if (tab == NULL || tab[msgindex].calcit == NULL)
+ tab = rtnl_msg_handlers[PF_UNSPEC];
+
+ return tab ? tab[msgindex].calcit : NULL;
+}
+
/**
* __rtnl_register - Register a rtnetlink message type
* @protocol: Protocol family or PF_UNSPEC
* @msgtype: rtnetlink message type
* @doit: Function pointer called for each request message
* @dumpit: Function pointer called for each dump request (NLM_F_DUMP) message
+ * @calcit: Function pointer to calc size of dump message
*
* Registers the specified function pointers (at least one of them has
* to be non-NULL) to be called whenever a request message for the
@@ -162,7 +180,8 @@ static rtnl_dumpit_func rtnl_get_dumpit(int protocol, int msgindex)
* Returns 0 on success or a negative error code.
*/
int __rtnl_register(int protocol, int msgtype,
- rtnl_doit_func doit, rtnl_dumpit_func dumpit)
+ rtnl_doit_func doit, rtnl_dumpit_func dumpit,
+ rtnl_calcit_func calcit)
{
struct rtnl_link *tab;
int msgindex;
@@ -185,6 +204,9 @@ int __rtnl_register(int protocol, int msgtype,
if (dumpit)
tab[msgindex].dumpit = dumpit;
+ if (calcit)
+ tab[msgindex].calcit = calcit;
+
return 0;
}
EXPORT_SYMBOL_GPL(__rtnl_register);
@@ -199,9 +221,10 @@ EXPORT_SYMBOL_GPL(__rtnl_register);
* of memory implies no sense in continuing.
*/
void rtnl_register(int protocol, int msgtype,
- rtnl_doit_func doit, rtnl_dumpit_func dumpit)
+ rtnl_doit_func doit, rtnl_dumpit_func dumpit,
+ rtnl_calcit_func calcit)
{
- if (__rtnl_register(protocol, msgtype, doit, dumpit) < 0)
+ if (__rtnl_register(protocol, msgtype, doit, dumpit, calcit) < 0)
panic("Unable to register rtnetlink message handler, "
"protocol = %d, message type = %d\n",
protocol, msgtype);
@@ -1818,6 +1841,11 @@ static int rtnl_getlink(struct sk_buff *skb, struct nlmsghdr* nlh, void *arg)
return err;
}
+static u16 rtnl_calcit(struct sk_buff *skb)
+{
+ return min_ifinfo_dump_size;
+}
+
static int rtnl_dump_all(struct sk_buff *skb, struct netlink_callback *cb)
{
int idx;
@@ -1847,11 +1875,14 @@ void rtmsg_ifinfo(int type, struct net_device *dev, unsigned change)
struct net *net = dev_net(dev);
struct sk_buff *skb;
int err = -ENOBUFS;
+ size_t if_info_size;
- skb = nlmsg_new(if_nlmsg_size(dev), GFP_KERNEL);
+ skb = nlmsg_new((if_info_size = if_nlmsg_size(dev)), GFP_KERNEL);
if (skb == NULL)
goto errout;
+ min_ifinfo_dump_size = max_t(u16, if_info_size, min_ifinfo_dump_size);
+
err = rtnl_fill_ifinfo(skb, dev, type, 0, 0, change, 0);
if (err < 0) {
/* -EMSGSIZE implies BUG in if_nlmsg_size() */
@@ -1902,14 +1933,20 @@ static int rtnetlink_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh)
if (kind == 2 && nlh->nlmsg_flags&NLM_F_DUMP) {
struct sock *rtnl;
rtnl_dumpit_func dumpit;
+ rtnl_calcit_func calcit;
+ u16 min_dump_alloc = 0;
dumpit = rtnl_get_dumpit(family, type);
if (dumpit == NULL)
return -EOPNOTSUPP;
+ calcit = rtnl_get_calcit(family, type);
+ if (calcit)
+ min_dump_alloc = calcit(skb);
__rtnl_unlock();
rtnl = net->rtnl;
- err = netlink_dump_start(rtnl, skb, nlh, dumpit, NULL);
+ err = netlink_dump_start(rtnl, skb, nlh, dumpit,
+ NULL, min_dump_alloc);
rtnl_lock();
return err;
}
@@ -2019,12 +2056,13 @@ void __init rtnetlink_init(void)
netlink_set_nonroot(NETLINK_ROUTE, NL_NONROOT_RECV);
register_netdevice_notifier(&rtnetlink_dev_notifier);
- rtnl_register(PF_UNSPEC, RTM_GETLINK, rtnl_getlink, rtnl_dump_ifinfo);
- rtnl_register(PF_UNSPEC, RTM_SETLINK, rtnl_setlink, NULL);
- rtnl_register(PF_UNSPEC, RTM_NEWLINK, rtnl_newlink, NULL);
- rtnl_register(PF_UNSPEC, RTM_DELLINK, rtnl_dellink, NULL);
+ rtnl_register(PF_UNSPEC, RTM_GETLINK, rtnl_getlink,
+ rtnl_dump_ifinfo, rtnl_calcit);
+ rtnl_register(PF_UNSPEC, RTM_SETLINK, rtnl_setlink, NULL, NULL);
+ rtnl_register(PF_UNSPEC, RTM_NEWLINK, rtnl_newlink, NULL, NULL);
+ rtnl_register(PF_UNSPEC, RTM_DELLINK, rtnl_dellink, NULL, NULL);
- rtnl_register(PF_UNSPEC, RTM_GETADDR, NULL, rtnl_dump_all);
- rtnl_register(PF_UNSPEC, RTM_GETROUTE, NULL, rtnl_dump_all);
+ rtnl_register(PF_UNSPEC, RTM_GETADDR, NULL, rtnl_dump_all, NULL);
+ rtnl_register(PF_UNSPEC, RTM_GETROUTE, NULL, rtnl_dump_all, NULL);
}
diff --git a/net/dcb/dcbnl.c b/net/dcb/dcbnl.c
index 3609eac..ed1bb8c 100644
--- a/net/dcb/dcbnl.c
+++ b/net/dcb/dcbnl.c
@@ -1819,8 +1819,8 @@ static int __init dcbnl_init(void)
{
INIT_LIST_HEAD(&dcb_app_list);
- rtnl_register(PF_UNSPEC, RTM_GETDCB, dcb_doit, NULL);
- rtnl_register(PF_UNSPEC, RTM_SETDCB, dcb_doit, NULL);
+ rtnl_register(PF_UNSPEC, RTM_GETDCB, dcb_doit, NULL, NULL);
+ rtnl_register(PF_UNSPEC, RTM_SETDCB, dcb_doit, NULL, NULL);
return 0;
}
diff --git a/net/decnet/dn_dev.c b/net/decnet/dn_dev.c
index cf26ac7..3780fd6 100644
--- a/net/decnet/dn_dev.c
+++ b/net/decnet/dn_dev.c
@@ -1414,9 +1414,9 @@ void __init dn_dev_init(void)
dn_dev_devices_on();
- rtnl_register(PF_DECnet, RTM_NEWADDR, dn_nl_newaddr, NULL);
- rtnl_register(PF_DECnet, RTM_DELADDR, dn_nl_deladdr, NULL);
- rtnl_register(PF_DECnet, RTM_GETADDR, NULL, dn_nl_dump_ifaddr);
+ rtnl_register(PF_DECnet, RTM_NEWADDR, dn_nl_newaddr, NULL, NULL);
+ rtnl_register(PF_DECnet, RTM_DELADDR, dn_nl_deladdr, NULL, NULL);
+ rtnl_register(PF_DECnet, RTM_GETADDR, NULL, dn_nl_dump_ifaddr, NULL);
proc_net_fops_create(&init_net, "decnet_dev", S_IRUGO, &dn_dev_seq_fops);
diff --git a/net/decnet/dn_fib.c b/net/decnet/dn_fib.c
index 1c74ed3..104324d 100644
--- a/net/decnet/dn_fib.c
+++ b/net/decnet/dn_fib.c
@@ -763,8 +763,8 @@ void __init dn_fib_init(void)
register_dnaddr_notifier(&dn_fib_dnaddr_notifier);
- rtnl_register(PF_DECnet, RTM_NEWROUTE, dn_fib_rtm_newroute, NULL);
- rtnl_register(PF_DECnet, RTM_DELROUTE, dn_fib_rtm_delroute, NULL);
+ rtnl_register(PF_DECnet, RTM_NEWROUTE, dn_fib_rtm_newroute, NULL, NULL);
+ rtnl_register(PF_DECnet, RTM_DELROUTE, dn_fib_rtm_delroute, NULL, NULL);
}
diff --git a/net/decnet/dn_route.c b/net/decnet/dn_route.c
index 74544bc..2949ca4 100644
--- a/net/decnet/dn_route.c
+++ b/net/decnet/dn_route.c
@@ -1841,10 +1841,11 @@ void __init dn_route_init(void)
proc_net_fops_create(&init_net, "decnet_cache", S_IRUGO, &dn_rt_cache_seq_fops);
#ifdef CONFIG_DECNET_ROUTER
- rtnl_register(PF_DECnet, RTM_GETROUTE, dn_cache_getroute, dn_fib_dump);
+ rtnl_register(PF_DECnet, RTM_GETROUTE, dn_cache_getroute,
+ dn_fib_dump, NULL);
#else
rtnl_register(PF_DECnet, RTM_GETROUTE, dn_cache_getroute,
- dn_cache_dump);
+ dn_cache_dump, NULL);
#endif
}
diff --git a/net/ipv4/devinet.c b/net/ipv4/devinet.c
index 0d4a184..37b3c18 100644
--- a/net/ipv4/devinet.c
+++ b/net/ipv4/devinet.c
@@ -1833,8 +1833,8 @@ void __init devinet_init(void)
rtnl_af_register(&inet_af_ops);
- rtnl_register(PF_INET, RTM_NEWADDR, inet_rtm_newaddr, NULL);
- rtnl_register(PF_INET, RTM_DELADDR, inet_rtm_deladdr, NULL);
- rtnl_register(PF_INET, RTM_GETADDR, NULL, inet_dump_ifaddr);
+ rtnl_register(PF_INET, RTM_NEWADDR, inet_rtm_newaddr, NULL, NULL);
+ rtnl_register(PF_INET, RTM_DELADDR, inet_rtm_deladdr, NULL, NULL);
+ rtnl_register(PF_INET, RTM_GETADDR, NULL, inet_dump_ifaddr, NULL);
}
diff --git a/net/ipv4/fib_frontend.c b/net/ipv4/fib_frontend.c
index 2252471..92fc5f6 100644
--- a/net/ipv4/fib_frontend.c
+++ b/net/ipv4/fib_frontend.c
@@ -1124,9 +1124,9 @@ static struct pernet_operations fib_net_ops = {
void __init ip_fib_init(void)
{
- rtnl_register(PF_INET, RTM_NEWROUTE, inet_rtm_newroute, NULL);
- rtnl_register(PF_INET, RTM_DELROUTE, inet_rtm_delroute, NULL);
- rtnl_register(PF_INET, RTM_GETROUTE, NULL, inet_dump_fib);
+ rtnl_register(PF_INET, RTM_NEWROUTE, inet_rtm_newroute, NULL, NULL);
+ rtnl_register(PF_INET, RTM_DELROUTE, inet_rtm_delroute, NULL, NULL);
+ rtnl_register(PF_INET, RTM_GETROUTE, NULL, inet_dump_fib, NULL);
register_pernet_subsys(&fib_net_ops);
register_netdevice_notifier(&fib_netdev_notifier);
diff --git a/net/ipv4/inet_diag.c b/net/ipv4/inet_diag.c
index 6ffe94c..5ff4765 100644
--- a/net/ipv4/inet_diag.c
+++ b/net/ipv4/inet_diag.c
@@ -871,7 +871,7 @@ static int inet_diag_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh)
}
return netlink_dump_start(idiagnl, skb, nlh,
- inet_diag_dump, NULL);
+ inet_diag_dump, NULL, 0);
}
return inet_diag_get_exact(skb, nlh);
diff --git a/net/ipv4/ipmr.c b/net/ipv4/ipmr.c
index 30a7763..aae2bd8 100644
--- a/net/ipv4/ipmr.c
+++ b/net/ipv4/ipmr.c
@@ -2544,7 +2544,8 @@ int __init ip_mr_init(void)
goto add_proto_fail;
}
#endif
- rtnl_register(RTNL_FAMILY_IPMR, RTM_GETROUTE, NULL, ipmr_rtm_dumproute);
+ rtnl_register(RTNL_FAMILY_IPMR, RTM_GETROUTE,
+ NULL, ipmr_rtm_dumproute, NULL);
return 0;
#ifdef CONFIG_IP_PIMSM_V2
diff --git a/net/ipv4/route.c b/net/ipv4/route.c
index 52b0b95..aa29c62 100644
--- a/net/ipv4/route.c
+++ b/net/ipv4/route.c
@@ -3295,7 +3295,7 @@ int __init ip_rt_init(void)
xfrm_init();
xfrm4_init(ip_rt_max_size);
#endif
- rtnl_register(PF_INET, RTM_GETROUTE, inet_rtm_getroute, NULL);
+ rtnl_register(PF_INET, RTM_GETROUTE, inet_rtm_getroute, NULL, NULL);
#ifdef CONFIG_SYSCTL
register_pernet_subsys(&sysctl_route_ops);
diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c
index 3e36942..05838c7 100644
--- a/net/ipv6/addrconf.c
+++ b/net/ipv6/addrconf.c
@@ -4727,16 +4727,20 @@ int __init addrconf_init(void)
if (err < 0)
goto errout_af;
- err = __rtnl_register(PF_INET6, RTM_GETLINK, NULL, inet6_dump_ifinfo);
+ err = __rtnl_register(PF_INET6, RTM_GETLINK, NULL, inet6_dump_ifinfo,
+ NULL);
if (err < 0)
goto errout;
/* Only the first call to __rtnl_register can fail */
- __rtnl_register(PF_INET6, RTM_NEWADDR, inet6_rtm_newaddr, NULL);
- __rtnl_register(PF_INET6, RTM_DELADDR, inet6_rtm_deladdr, NULL);
- __rtnl_register(PF_INET6, RTM_GETADDR, inet6_rtm_getaddr, inet6_dump_ifaddr);
- __rtnl_register(PF_INET6, RTM_GETMULTICAST, NULL, inet6_dump_ifmcaddr);
- __rtnl_register(PF_INET6, RTM_GETANYCAST, NULL, inet6_dump_ifacaddr);
+ __rtnl_register(PF_INET6, RTM_NEWADDR, inet6_rtm_newaddr, NULL, NULL);
+ __rtnl_register(PF_INET6, RTM_DELADDR, inet6_rtm_deladdr, NULL, NULL);
+ __rtnl_register(PF_INET6, RTM_GETADDR, inet6_rtm_getaddr,
+ inet6_dump_ifaddr, NULL);
+ __rtnl_register(PF_INET6, RTM_GETMULTICAST, NULL,
+ inet6_dump_ifmcaddr, NULL);
+ __rtnl_register(PF_INET6, RTM_GETANYCAST, NULL,
+ inet6_dump_ifacaddr, NULL);
ipv6_addr_label_rtnl_register();
diff --git a/net/ipv6/addrlabel.c b/net/ipv6/addrlabel.c
index c8993e5..2d8ddba 100644
--- a/net/ipv6/addrlabel.c
+++ b/net/ipv6/addrlabel.c
@@ -592,8 +592,11 @@ out:
void __init ipv6_addr_label_rtnl_register(void)
{
- __rtnl_register(PF_INET6, RTM_NEWADDRLABEL, ip6addrlbl_newdel, NULL);
- __rtnl_register(PF_INET6, RTM_DELADDRLABEL, ip6addrlbl_newdel, NULL);
- __rtnl_register(PF_INET6, RTM_GETADDRLABEL, ip6addrlbl_get, ip6addrlbl_dump);
+ __rtnl_register(PF_INET6, RTM_NEWADDRLABEL, ip6addrlbl_newdel,
+ NULL, NULL);
+ __rtnl_register(PF_INET6, RTM_DELADDRLABEL, ip6addrlbl_newdel,
+ NULL, NULL);
+ __rtnl_register(PF_INET6, RTM_GETADDRLABEL, ip6addrlbl_get,
+ ip6addrlbl_dump, NULL);
}
diff --git a/net/ipv6/ip6_fib.c b/net/ipv6/ip6_fib.c
index 4076a0b..3030bdf 100644
--- a/net/ipv6/ip6_fib.c
+++ b/net/ipv6/ip6_fib.c
@@ -1586,7 +1586,8 @@ int __init fib6_init(void)
if (ret)
goto out_kmem_cache_create;
- ret = __rtnl_register(PF_INET6, RTM_GETROUTE, NULL, inet6_dump_fib);
+ ret = __rtnl_register(PF_INET6, RTM_GETROUTE, NULL, inet6_dump_fib,
+ NULL);
if (ret)
goto out_unregister_subsys;
out:
diff --git a/net/ipv6/ip6mr.c b/net/ipv6/ip6mr.c
index 82a8099..705c828 100644
--- a/net/ipv6/ip6mr.c
+++ b/net/ipv6/ip6mr.c
@@ -1354,7 +1354,8 @@ int __init ip6_mr_init(void)
goto add_proto_fail;
}
#endif
- rtnl_register(RTNL_FAMILY_IP6MR, RTM_GETROUTE, NULL, ip6mr_rtm_dumproute);
+ rtnl_register(RTNL_FAMILY_IP6MR, RTM_GETROUTE, NULL,
+ ip6mr_rtm_dumproute, NULL);
return 0;
#ifdef CONFIG_IPV6_PIMSM_V2
add_proto_fail:
diff --git a/net/ipv6/route.c b/net/ipv6/route.c
index de2b1de..216ff31 100644
--- a/net/ipv6/route.c
+++ b/net/ipv6/route.c
@@ -2925,9 +2925,9 @@ int __init ip6_route_init(void)
goto xfrm6_init;
ret = -ENOBUFS;
- if (__rtnl_register(PF_INET6, RTM_NEWROUTE, inet6_rtm_newroute, NULL) ||
- __rtnl_register(PF_INET6, RTM_DELROUTE, inet6_rtm_delroute, NULL) ||
- __rtnl_register(PF_INET6, RTM_GETROUTE, inet6_rtm_getroute, NULL))
+ if (__rtnl_register(PF_INET6, RTM_NEWROUTE, inet6_rtm_newroute, NULL, NULL) ||
+ __rtnl_register(PF_INET6, RTM_DELROUTE, inet6_rtm_delroute, NULL, NULL) ||
+ __rtnl_register(PF_INET6, RTM_GETROUTE, inet6_rtm_getroute, NULL, NULL))
goto fib6_rules_init;
ret = register_netdevice_notifier(&ip6_route_dev_notifier);
diff --git a/net/netfilter/ipset/ip_set_core.c b/net/netfilter/ipset/ip_set_core.c
index 8041bef..333b0be 100644
--- a/net/netfilter/ipset/ip_set_core.c
+++ b/net/netfilter/ipset/ip_set_core.c
@@ -1120,7 +1120,7 @@ ip_set_dump(struct sock *ctnl, struct sk_buff *skb,
return netlink_dump_start(ctnl, skb, nlh,
ip_set_dump_start,
- ip_set_dump_done);
+ ip_set_dump_done, 0);
}
/* Add, del and test */
diff --git a/net/netfilter/nf_conntrack_netlink.c b/net/netfilter/nf_conntrack_netlink.c
index 482e90c..7dec88a 100644
--- a/net/netfilter/nf_conntrack_netlink.c
+++ b/net/netfilter/nf_conntrack_netlink.c
@@ -970,7 +970,7 @@ ctnetlink_get_conntrack(struct sock *ctnl, struct sk_buff *skb,
if (nlh->nlmsg_flags & NLM_F_DUMP)
return netlink_dump_start(ctnl, skb, nlh, ctnetlink_dump_table,
- ctnetlink_done);
+ ctnetlink_done, 0);
err = ctnetlink_parse_zone(cda[CTA_ZONE], &zone);
if (err < 0)
@@ -1840,7 +1840,7 @@ ctnetlink_get_expect(struct sock *ctnl, struct sk_buff *skb,
if (nlh->nlmsg_flags & NLM_F_DUMP) {
return netlink_dump_start(ctnl, skb, nlh,
ctnetlink_exp_dump_table,
- ctnetlink_exp_done);
+ ctnetlink_exp_done, 0);
}
err = ctnetlink_parse_zone(cda[CTA_EXPECT_ZONE], &zone);
diff --git a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c
index 6ef64ad..0b92f7549 100644
--- a/net/netlink/af_netlink.c
+++ b/net/netlink/af_netlink.c
@@ -1659,13 +1659,10 @@ static int netlink_dump(struct sock *sk)
{
struct netlink_sock *nlk = nlk_sk(sk);
struct netlink_callback *cb;
- struct sk_buff *skb;
+ struct sk_buff *skb = NULL;
struct nlmsghdr *nlh;
int len, err = -ENOBUFS;
-
- skb = sock_rmalloc(sk, NLMSG_GOODSIZE, 0, GFP_KERNEL);
- if (!skb)
- goto errout;
+ int alloc_size;
mutex_lock(nlk->cb_mutex);
@@ -1675,6 +1672,12 @@ static int netlink_dump(struct sock *sk)
goto errout_skb;
}
+ alloc_size = max_t(int, cb->min_dump_alloc, NLMSG_GOODSIZE);
+
+ skb = sock_rmalloc(sk, alloc_size, 0, GFP_KERNEL);
+ if (!skb)
+ goto errout;
+
len = cb->dump(skb, cb);
if (len > 0) {
@@ -1721,7 +1724,8 @@ int netlink_dump_start(struct sock *ssk, struct sk_buff *skb,
const struct nlmsghdr *nlh,
int (*dump)(struct sk_buff *skb,
struct netlink_callback *),
- int (*done)(struct netlink_callback *))
+ int (*done)(struct netlink_callback *),
+ u16 min_dump_alloc)
{
struct netlink_callback *cb;
struct sock *sk;
@@ -1735,6 +1739,7 @@ int netlink_dump_start(struct sock *ssk, struct sk_buff *skb,
cb->dump = dump;
cb->done = done;
cb->nlh = nlh;
+ cb->min_dump_alloc = min_dump_alloc;
atomic_inc(&skb->users);
cb->skb = skb;
diff --git a/net/netlink/genetlink.c b/net/netlink/genetlink.c
index 1781d99..482fa57 100644
--- a/net/netlink/genetlink.c
+++ b/net/netlink/genetlink.c
@@ -525,7 +525,7 @@ static int genl_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh)
genl_unlock();
err = netlink_dump_start(net->genl_sock, skb, nlh,
- ops->dumpit, ops->done);
+ ops->dumpit, ops->done, 0);
genl_lock();
return err;
}
diff --git a/net/phonet/pn_netlink.c b/net/phonet/pn_netlink.c
index 438accb..d61f676 100644
--- a/net/phonet/pn_netlink.c
+++ b/net/phonet/pn_netlink.c
@@ -289,15 +289,16 @@ out:
int __init phonet_netlink_register(void)
{
- int err = __rtnl_register(PF_PHONET, RTM_NEWADDR, addr_doit, NULL);
+ int err = __rtnl_register(PF_PHONET, RTM_NEWADDR, addr_doit,
+ NULL, NULL);
if (err)
return err;
/* Further __rtnl_register() cannot fail */
- __rtnl_register(PF_PHONET, RTM_DELADDR, addr_doit, NULL);
- __rtnl_register(PF_PHONET, RTM_GETADDR, NULL, getaddr_dumpit);
- __rtnl_register(PF_PHONET, RTM_NEWROUTE, route_doit, NULL);
- __rtnl_register(PF_PHONET, RTM_DELROUTE, route_doit, NULL);
- __rtnl_register(PF_PHONET, RTM_GETROUTE, NULL, route_dumpit);
+ __rtnl_register(PF_PHONET, RTM_DELADDR, addr_doit, NULL, NULL);
+ __rtnl_register(PF_PHONET, RTM_GETADDR, NULL, getaddr_dumpit, NULL);
+ __rtnl_register(PF_PHONET, RTM_NEWROUTE, route_doit, NULL, NULL);
+ __rtnl_register(PF_PHONET, RTM_DELROUTE, route_doit, NULL, NULL);
+ __rtnl_register(PF_PHONET, RTM_GETROUTE, NULL, route_dumpit, NULL);
return 0;
}
diff --git a/net/sched/act_api.c b/net/sched/act_api.c
index a606025..2f64262 100644
--- a/net/sched/act_api.c
+++ b/net/sched/act_api.c
@@ -1115,9 +1115,10 @@ nlmsg_failure:
static int __init tc_action_init(void)
{
- rtnl_register(PF_UNSPEC, RTM_NEWACTION, tc_ctl_action, NULL);
- rtnl_register(PF_UNSPEC, RTM_DELACTION, tc_ctl_action, NULL);
- rtnl_register(PF_UNSPEC, RTM_GETACTION, tc_ctl_action, tc_dump_action);
+ rtnl_register(PF_UNSPEC, RTM_NEWACTION, tc_ctl_action, NULL, NULL);
+ rtnl_register(PF_UNSPEC, RTM_DELACTION, tc_ctl_action, NULL, NULL);
+ rtnl_register(PF_UNSPEC, RTM_GETACTION, tc_ctl_action, tc_dump_action,
+ NULL);
return 0;
}
diff --git a/net/sched/cls_api.c b/net/sched/cls_api.c
index bb2c523..9563887 100644
--- a/net/sched/cls_api.c
+++ b/net/sched/cls_api.c
@@ -610,10 +610,10 @@ EXPORT_SYMBOL(tcf_exts_dump_stats);
static int __init tc_filter_init(void)
{
- rtnl_register(PF_UNSPEC, RTM_NEWTFILTER, tc_ctl_tfilter, NULL);
- rtnl_register(PF_UNSPEC, RTM_DELTFILTER, tc_ctl_tfilter, NULL);
+ rtnl_register(PF_UNSPEC, RTM_NEWTFILTER, tc_ctl_tfilter, NULL, NULL);
+ rtnl_register(PF_UNSPEC, RTM_DELTFILTER, tc_ctl_tfilter, NULL, NULL);
rtnl_register(PF_UNSPEC, RTM_GETTFILTER, tc_ctl_tfilter,
- tc_dump_tfilter);
+ tc_dump_tfilter, NULL);
return 0;
}
diff --git a/net/sched/sch_api.c b/net/sched/sch_api.c
index 6b86276..8182aef 100644
--- a/net/sched/sch_api.c
+++ b/net/sched/sch_api.c
@@ -1792,12 +1792,12 @@ static int __init pktsched_init(void)
register_qdisc(&pfifo_head_drop_qdisc_ops);
register_qdisc(&mq_qdisc_ops);
- rtnl_register(PF_UNSPEC, RTM_NEWQDISC, tc_modify_qdisc, NULL);
- rtnl_register(PF_UNSPEC, RTM_DELQDISC, tc_get_qdisc, NULL);
- rtnl_register(PF_UNSPEC, RTM_GETQDISC, tc_get_qdisc, tc_dump_qdisc);
- rtnl_register(PF_UNSPEC, RTM_NEWTCLASS, tc_ctl_tclass, NULL);
- rtnl_register(PF_UNSPEC, RTM_DELTCLASS, tc_ctl_tclass, NULL);
- rtnl_register(PF_UNSPEC, RTM_GETTCLASS, tc_ctl_tclass, tc_dump_tclass);
+ rtnl_register(PF_UNSPEC, RTM_NEWQDISC, tc_modify_qdisc, NULL, NULL);
+ rtnl_register(PF_UNSPEC, RTM_DELQDISC, tc_get_qdisc, NULL, NULL);
+ rtnl_register(PF_UNSPEC, RTM_GETQDISC, tc_get_qdisc, tc_dump_qdisc, NULL);
+ rtnl_register(PF_UNSPEC, RTM_NEWTCLASS, tc_ctl_tclass, NULL, NULL);
+ rtnl_register(PF_UNSPEC, RTM_DELTCLASS, tc_ctl_tclass, NULL, NULL);
+ rtnl_register(PF_UNSPEC, RTM_GETTCLASS, tc_ctl_tclass, tc_dump_tclass, NULL);
return 0;
}
diff --git a/net/xfrm/xfrm_user.c b/net/xfrm/xfrm_user.c
index c658cb3..0256b8a 100644
--- a/net/xfrm/xfrm_user.c
+++ b/net/xfrm/xfrm_user.c
@@ -2299,7 +2299,8 @@ static int xfrm_user_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh)
if (link->dump == NULL)
return -EINVAL;
- return netlink_dump_start(net->xfrm.nlsk, skb, nlh, link->dump, link->done);
+ return netlink_dump_start(net->xfrm.nlsk, skb, nlh,
+ link->dump, link->done, 0);
}
err = nlmsg_parse(nlh, xfrm_msg_min[type], attrs, XFRMA_MAX,
--
1.7.5.2
^ permalink raw reply related
* Re: [PATCH 3/5 net-next] cnic: Randomize initial TCP port for iSCSI connections
From: Stephen Hemminger @ 2011-06-10 4:01 UTC (permalink / raw)
To: Michael Chan; +Cc: davem@davemloft.net, netdev@vger.kernel.org, Eddie Wai
In-Reply-To: <1307668080.14980.13.camel@HP1>
On Thu, 9 Jun 2011 18:08:00 -0700
"Michael Chan" <mchan@broadcom.com> wrote:
>
> On Thu, 2011-06-09 at 08:27 -0700, Stephen Hemminger wrote:
> > On Wed, 8 Jun 2011 22:29:34 -0700
> > "Michael Chan" <mchan@broadcom.com> wrote:
> >
> > > static int cnic_cm_alloc_mem(struct cnic_dev *dev)
> > > {
> > > struct cnic_local *cp = dev->cnic_priv;
> > > + u32 port_id;
> > >
> > > cp->csk_tbl = kzalloc(sizeof(struct cnic_sock) * MAX_CM_SK_TBL_SZ,
> > > GFP_KERNEL);
> > > if (!cp->csk_tbl)
> > > return -ENOMEM;
> > >
> > > + get_random_bytes(&port_id, sizeof(port_id));
> >
> > I think random32() or it's alias net_random() would be sufficient
> > for your needs here.
> >
>
> random32() is pseudo random so we can get the same number after reboot,
> right? One scenario is that we may be booting from an iSCSI target, but
> due to some failure, the user may be rebooting multiple times rapidly.
> We want to use a different port during each boot.
random32 is seeded off get_random_bytes at boot.
^ permalink raw reply
* Re: [PATCH net-next-2.6] inetpeer: lower false sharing effect
From: Eric Dumazet @ 2011-06-10 4:31 UTC (permalink / raw)
To: Tim Chen; +Cc: David Miller, netdev, Andi Kleen
In-Reply-To: <1307664235.17300.44.camel@schen9-DESK>
Le jeudi 09 juin 2011 à 17:03 -0700, Tim Chen a écrit :
> On Thu, 2011-06-09 at 08:26 +0200, Eric Dumazet wrote:
> > Profiles show false sharing in addr_compare() because refcnt/dtime
> > changes dirty the first inet_peer cache line, where are lying the keys
> > used at lookup time. If many cpus are calling inet_getpeer() and
> > inet_putpeer(), or need frag ids, addr_compare() is in 2nd position in
> > "perf top".
> >
>
> I've applied both inetpeer patches. I also no longer have inet_getpeer
> and inet_putpeer and addr_compare in my profile. Instead, neighbor
> lookup is now dominant. See profile below.
>
> When I retest with original 3.0-rc2 kernel, inet_putpeer no longer shows
> up, wonder if dst->peer was not set for some reason.
>
> Tim
>
> - 27.06% memcached [kernel.kallsyms] [k] atomic_add_unless.clone.34
> - atomic_add_unless.clone.34
> - 99.97% neigh_lookup
> __neigh_lookup_errno.clone.17
> arp_bind_neighbour
> rt_intern_hash
> __ip_route_output_key
> ip_route_output_flow
> udp_sendmsg
> inet_sendmsg
> __sock_sendmsg
> sock_sendmsg
> __sys_sendmsg
> sys_sendmsg
> system_call_fastpath
> __sendmsg
> - 13.33% memcached [kernel.kallsyms] [k] atomic_dec_and_test
> - atomic_dec_and_test
> - 99.89% dst_destroy
> - dst_release
> - 98.12% skb_dst_drop.clone.55
> dev_hard_start_xmit
> + sch_direct_xmit
> + 1.88% skb_release_head_state
> - 3.26% memcached [kernel.kallsyms] [k] do_raw_spin_lock
> - do_raw_spin_lock
> - 92.24% _raw_spin_lock
> + 41.39% sch_direct_xmit
>
>
Thanks Tim
I have some questions for further optimizations.
1) How many different destinations are used in your stress load ?
2) Could you provide a distribution of the size of packet lengthes ?
Or maybe the average length would be OK
^ permalink raw reply
* Re: [PATCH 3/5 net-next] cnic: Randomize initial TCP port for iSCSI connections
From: Eric Dumazet @ 2011-06-10 4:39 UTC (permalink / raw)
To: Stephen Hemminger
Cc: Michael Chan, davem@davemloft.net, netdev@vger.kernel.org,
Eddie Wai
In-Reply-To: <20110609210157.6a1f016b@nehalam.ftrdhcpuser.net>
Le jeudi 09 juin 2011 à 21:01 -0700, Stephen Hemminger a écrit :
> On Thu, 9 Jun 2011 18:08:00 -0700
> "Michael Chan" <mchan@broadcom.com> wrote:
>
> >
> > On Thu, 2011-06-09 at 08:27 -0700, Stephen Hemminger wrote:
> > > On Wed, 8 Jun 2011 22:29:34 -0700
> > > "Michael Chan" <mchan@broadcom.com> wrote:
> > >
> > > > static int cnic_cm_alloc_mem(struct cnic_dev *dev)
> > > > {
> > > > struct cnic_local *cp = dev->cnic_priv;
> > > > + u32 port_id;
> > > >
> > > > cp->csk_tbl = kzalloc(sizeof(struct cnic_sock) * MAX_CM_SK_TBL_SZ,
> > > > GFP_KERNEL);
> > > > if (!cp->csk_tbl)
> > > > return -ENOMEM;
> > > >
> > > > + get_random_bytes(&port_id, sizeof(port_id));
> > >
> > > I think random32() or it's alias net_random() would be sufficient
> > > for your needs here.
> > >
> >
> > random32() is pseudo random so we can get the same number after reboot,
> > right? One scenario is that we may be booting from an iSCSI target, but
> > due to some failure, the user may be rebooting multiple times rapidly.
> > We want to use a different port during each boot.
>
> random32 is seeded off get_random_bytes at boot.
cnic_cm_alloc_mem() is apparently called one time per boot, it seems OK
to call get_random_bytes() in this case ?
^ permalink raw reply
* [RFC] inetpeer not namespace ready
From: Eric Dumazet @ 2011-06-10 4:44 UTC (permalink / raw)
To: David Miller; +Cc: netdev
David,
Shouldnt we make inetpeer cache namespace aware ?
Same destination IP can be used differently in two different namespaces.
Thanks
^ permalink raw reply
* Re: [PATCH net-next-2.6] inetpeer: lower false sharing effect
From: Eric Dumazet @ 2011-06-10 4:47 UTC (permalink / raw)
To: David Miller; +Cc: tim.c.chen, netdev, andi
In-Reply-To: <20110609.204330.2090335955971650557.davem@davemloft.net>
Le jeudi 09 juin 2011 à 20:43 -0700, David Miller a écrit :
> From: Tim Chen <tim.c.chen@linux.intel.com>
> Date: Thu, 09 Jun 2011 17:03:55 -0700
>
> > When I retest with original 3.0-rc2 kernel, inet_putpeer no longer shows
> > up, wonder if dst->peer was not set for some reason.
>
> The overhead will only show up if an inetpeer entry exists for
> the destination IP address.
>
> You can force one to be created, for example, by making a TCP
> connection to that destination.
Or sending big frames, to force ip fragmentation (we store the id
generator in inetpeer cache)
^ permalink raw reply
* Re: [PATCH 3/5 net-next] cnic: Randomize initial TCP port for iSCSI connections
From: Michael Chan @ 2011-06-10 6:25 UTC (permalink / raw)
To: 'Stephen Hemminger'
Cc: 'davem@davemloft.net', 'netdev@vger.kernel.org',
Eddie Wai
In-Reply-To: <20110609210157.6a1f016b@nehalam.ftrdhcpuser.net>
Stephen Hemminger wrote:
> On Thu, 9 Jun 2011 18:08:00 -0700
> "Michael Chan" <mchan@broadcom.com> wrote:
> > random32() is pseudo random so we can get the same number after reboot,
> > right? One scenario is that we may be booting from an iSCSI target, but
> > due to some failure, the user may be rebooting multiple times rapidly.
> > We want to use a different port during each boot.
>
> random32 is seeded off get_random_bytes at boot.
Thanks. We'll change it to random32() in our next patchset then.
^ permalink raw reply
* Re: [RFC] inetpeer not namespace ready
From: David Miller @ 2011-06-10 7:07 UTC (permalink / raw)
To: eric.dumazet; +Cc: netdev
In-Reply-To: <1307681090.3210.7.camel@edumazet-laptop>
From: Eric Dumazet <eric.dumazet@gmail.com>
Date: Fri, 10 Jun 2011 06:44:50 +0200
> Shouldnt we make inetpeer cache namespace aware ?
>
> Same destination IP can be used differently in two different namespaces.
Maybe. Although it would be a shame not to be able to share metrics
between namespaces.
^ permalink raw reply
* [PATCH] net: netfilter: ipvs: clean up the dead code
From: Changli Gao @ 2011-06-10 7:11 UTC (permalink / raw)
To: Simon Horman
Cc: Wensong Zhang, Julian Anastasov, Patrick McHardy, David S. Miller,
netdev, lvs-devel, netfilter-devel, Changli Gao
This dead code has been commented out since 2005, and too many things
have happened. Currently, even vs_timeout_table_dos doesn't exist.
Signed-off-by: Changli Gao <xiaosuo@gmail.com>
---
net/netfilter/ipvs/ip_vs_ctl.c | 86 -----------------------------------------
1 file changed, 86 deletions(-)
diff --git a/net/netfilter/ipvs/ip_vs_ctl.c b/net/netfilter/ipvs/ip_vs_ctl.c
index 699c79a..f6670da 100644
--- a/net/netfilter/ipvs/ip_vs_ctl.c
+++ b/net/netfilter/ipvs/ip_vs_ctl.c
@@ -1756,92 +1756,6 @@ static struct ctl_table vs_vars[] = {
.proc_handler = proc_dointvec,
},
#endif
-#if 0
- {
- .procname = "timeout_established",
- .data = &vs_timeout_table_dos.timeout[IP_VS_S_ESTABLISHED],
- .maxlen = sizeof(int),
- .mode = 0644,
- .proc_handler = proc_dointvec_jiffies,
- },
- {
- .procname = "timeout_synsent",
- .data = &vs_timeout_table_dos.timeout[IP_VS_S_SYN_SENT],
- .maxlen = sizeof(int),
- .mode = 0644,
- .proc_handler = proc_dointvec_jiffies,
- },
- {
- .procname = "timeout_synrecv",
- .data = &vs_timeout_table_dos.timeout[IP_VS_S_SYN_RECV],
- .maxlen = sizeof(int),
- .mode = 0644,
- .proc_handler = proc_dointvec_jiffies,
- },
- {
- .procname = "timeout_finwait",
- .data = &vs_timeout_table_dos.timeout[IP_VS_S_FIN_WAIT],
- .maxlen = sizeof(int),
- .mode = 0644,
- .proc_handler = proc_dointvec_jiffies,
- },
- {
- .procname = "timeout_timewait",
- .data = &vs_timeout_table_dos.timeout[IP_VS_S_TIME_WAIT],
- .maxlen = sizeof(int),
- .mode = 0644,
- .proc_handler = proc_dointvec_jiffies,
- },
- {
- .procname = "timeout_close",
- .data = &vs_timeout_table_dos.timeout[IP_VS_S_CLOSE],
- .maxlen = sizeof(int),
- .mode = 0644,
- .proc_handler = proc_dointvec_jiffies,
- },
- {
- .procname = "timeout_closewait",
- .data = &vs_timeout_table_dos.timeout[IP_VS_S_CLOSE_WAIT],
- .maxlen = sizeof(int),
- .mode = 0644,
- .proc_handler = proc_dointvec_jiffies,
- },
- {
- .procname = "timeout_lastack",
- .data = &vs_timeout_table_dos.timeout[IP_VS_S_LAST_ACK],
- .maxlen = sizeof(int),
- .mode = 0644,
- .proc_handler = proc_dointvec_jiffies,
- },
- {
- .procname = "timeout_listen",
- .data = &vs_timeout_table_dos.timeout[IP_VS_S_LISTEN],
- .maxlen = sizeof(int),
- .mode = 0644,
- .proc_handler = proc_dointvec_jiffies,
- },
- {
- .procname = "timeout_synack",
- .data = &vs_timeout_table_dos.timeout[IP_VS_S_SYNACK],
- .maxlen = sizeof(int),
- .mode = 0644,
- .proc_handler = proc_dointvec_jiffies,
- },
- {
- .procname = "timeout_udp",
- .data = &vs_timeout_table_dos.timeout[IP_VS_S_UDP],
- .maxlen = sizeof(int),
- .mode = 0644,
- .proc_handler = proc_dointvec_jiffies,
- },
- {
- .procname = "timeout_icmp",
- .data = &vs_timeout_table_dos.timeout[IP_VS_S_ICMP],
- .maxlen = sizeof(int),
- .mode = 0644,
- .proc_handler = proc_dointvec_jiffies,
- },
-#endif
{ }
};
^ permalink raw reply related
* [PATCH] netfilter: fix looped (broad|multi)cast's MAC handling.
From: Nicolas Cavallari @ 2011-06-10 7:20 UTC (permalink / raw)
To: kaber, fw, netfilter-devel, netdev; +Cc: Nicolas Cavallari
In-Reply-To: <4DF0EFE6.4010206@trash.net>
By default, when broadcast or multicast packet are sent from a local
application, they are sent to the interface then looped by the kernel
to other local applications, going throught netfilter hooks in the process.
These looped packet have their MAC header removed from the skb by the kernel
looping code.
This confuse various netfilter's netlink queue, netlink log and the
legacy ip_queue, because they try to extract a hardware
address from these packets, but extracts a part of the IP header instead.
This patch prevent NFQUEUE, NFLOG and ip_QUEUE to include a MAC header
if there is none in the packet.
Signed-off-by: Nicolas Cavallari <cavallar@lri.fr>
---
net/ipv4/netfilter/ip_queue.c | 3 ++-
net/ipv6/netfilter/ip6_queue.c | 3 ++-
net/netfilter/nfnetlink_log.c | 3 ++-
net/netfilter/nfnetlink_queue.c | 3 ++-
4 files changed, 8 insertions(+), 4 deletions(-)
diff --git a/net/ipv4/netfilter/ip_queue.c b/net/ipv4/netfilter/ip_queue.c
index f7f9bd7..5c9b9d9 100644
--- a/net/ipv4/netfilter/ip_queue.c
+++ b/net/ipv4/netfilter/ip_queue.c
@@ -203,7 +203,8 @@ ipq_build_packet_message(struct nf_queue_entry *entry, int *errp)
else
pmsg->outdev_name[0] = '\0';
- if (entry->indev && entry->skb->dev) {
+ if (entry->indev && entry->skb->dev &&
+ entry->skb->mac_header != entry->skb->network_header) {
pmsg->hw_type = entry->skb->dev->type;
pmsg->hw_addrlen = dev_parse_header(entry->skb,
pmsg->hw_addr);
diff --git a/net/ipv6/netfilter/ip6_queue.c b/net/ipv6/netfilter/ip6_queue.c
index 065fe40..2493948 100644
--- a/net/ipv6/netfilter/ip6_queue.c
+++ b/net/ipv6/netfilter/ip6_queue.c
@@ -204,7 +204,8 @@ ipq_build_packet_message(struct nf_queue_entry *entry, int *errp)
else
pmsg->outdev_name[0] = '\0';
- if (entry->indev && entry->skb->dev) {
+ if (entry->indev && entry->skb->dev &&
+ entry->skb->mac_header != entry->skb->network_header) {
pmsg->hw_type = entry->skb->dev->type;
pmsg->hw_addrlen = dev_parse_header(entry->skb, pmsg->hw_addr);
}
diff --git a/net/netfilter/nfnetlink_log.c b/net/netfilter/nfnetlink_log.c
index e0ee010..2e7ccbb 100644
--- a/net/netfilter/nfnetlink_log.c
+++ b/net/netfilter/nfnetlink_log.c
@@ -456,7 +456,8 @@ __build_packet_message(struct nfulnl_instance *inst,
if (skb->mark)
NLA_PUT_BE32(inst->skb, NFULA_MARK, htonl(skb->mark));
- if (indev && skb->dev) {
+ if (indev && skb->dev &&
+ skb->mac_header != skb->network_header) {
struct nfulnl_msg_packet_hw phw;
int len = dev_parse_header(skb, phw.hw_addr);
if (len > 0) {
diff --git a/net/netfilter/nfnetlink_queue.c b/net/netfilter/nfnetlink_queue.c
index b83123f..fdd2faf 100644
--- a/net/netfilter/nfnetlink_queue.c
+++ b/net/netfilter/nfnetlink_queue.c
@@ -335,7 +335,8 @@ nfqnl_build_packet_message(struct nfqnl_instance *queue,
if (entskb->mark)
NLA_PUT_BE32(skb, NFQA_MARK, htonl(entskb->mark));
- if (indev && entskb->dev) {
+ if (indev && entskb->dev &&
+ entskb->mac_header != entskb->network_header) {
struct nfqnl_msg_packet_hw phw;
int len = dev_parse_header(entskb, phw.hw_addr);
if (len) {
--
1.7.5.3
^ permalink raw reply related
* Re: [PATCH net-2.6.23] Per-datagram TTL and TOS via sendmsg()
From: Rémi Denis-Courmont @ 2011-06-10 7:24 UTC (permalink / raw)
To: Miljanovic, Nebojsa (Neb), netdev
In-Reply-To: <180685543D224348869F70A5870DB9408A5EE7D2@USNAVSXCHMBSB2.ndc.alcatel-lucent.com>
On Thu, 9 Jun 2011 08:20:46 -0500, "Miljanovic, Nebojsa (Neb)"
<neb.miljanovic@alcatel-lucent.com> wrote:
> is there any way to get this old PATCH accepted. I am finding it very
> useful since the only other way to control TOS/DSCP is via socket
option.
> However, socket wide TOS/DSCP is not always practical. Having ability
for
> applications to control TOS/DSCP on per-datagram basis is so much more
> powerful.
I have not tried, but with 17 kernel passed, it is safe to assume that
this patch cannot be applied as is.
--
Rémi Denis-Courmont
http://www.remlab.net/
^ permalink raw reply
* [PATCH] sctp: kzalloc() error handling on deleting last address
From: Michio Honda @ 2011-06-10 8:07 UTC (permalink / raw)
To: David Miller; +Cc: Wei Yongjun, netdev
>From 49a66ecad72af8c367b125c695a113d3f3870320 Mon Sep 17 00:00:00 2001
From: Michio Honda <micchie@sfc.wide.ad.jp>
Date: Fri, 10 Jun 2011 16:42:14 +0900
Subject: [PATCH] sctp: kzalloc() error handling on deleting last address
Signed-off-by: Michio Honda <micchie@sfc.wide.ad.jp>
---
net/sctp/socket.c | 2 ++
1 files changed, 2 insertions(+), 0 deletions(-)
diff --git a/net/sctp/socket.c b/net/sctp/socket.c
index e7e1b14..a23d898 100644
--- a/net/sctp/socket.c
+++ b/net/sctp/socket.c
@@ -786,6 +786,8 @@ static int sctp_send_asconf_del_ip(struct sock *sk,
continue;
asoc->asconf_addr_del_pending =
kzalloc(sizeof(union sctp_addr), GFP_ATOMIC);
+ if (asoc->asconf_addr_del_pending == NULL)
+ continue;
asoc->asconf_addr_del_pending->sa.sa_family =
addrs->sa_family;
asoc->asconf_addr_del_pending->v4.sin_port =
--
1.7.3.2
^ permalink raw reply related
* [PATCH 1/1] IPVS remove unused var from migration to netns
From: Hans Schillstrom @ 2011-06-10 8:19 UTC (permalink / raw)
To: horms, ja, wensong, lvs-devel, netdev, netfilter-devel
Cc: hans, Hans Schillstrom
Remove variable ctl_key from struct netns_ipvs,
it's a leftover from early netns work.
Signed-off-by: Hans Schillstrom <hans.schillstrom@ericsson.com>
---
include/net/ip_vs.h | 2 --
1 files changed, 0 insertions(+), 2 deletions(-)
diff --git a/include/net/ip_vs.h b/include/net/ip_vs.h
index 481f856..34a6fa8 100644
--- a/include/net/ip_vs.h
+++ b/include/net/ip_vs.h
@@ -836,8 +836,6 @@ struct netns_ipvs {
int num_services; /* no of virtual services */
rwlock_t rs_lock; /* real services table */
- /* semaphore for IPVS sockopts. And, [gs]etsockopt may sleep. */
- struct lock_class_key ctl_key; /* ctl_mutex debuging */
/* Trash for destinations */
struct list_head dest_trash;
/* Service counters */
--
1.6.0.2
^ permalink raw reply related
* Re: [PATCH v2 00/12][pull request] Intel Wired LAN Driver Update
From: David Miller @ 2011-06-10 8:20 UTC (permalink / raw)
To: jeffrey.t.kirsher; +Cc: netdev, gospo
In-Reply-To: <1307677676-26690-1-git-send-email-jeffrey.t.kirsher@intel.com>
From: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
Date: Thu, 9 Jun 2011 20:47:44 -0700
> The following series is a (smaller) subset of the previous 40 patch
> submission. This subset only contains updates to e1000e, igb, igbvf
> and rtnetlink.
>
> e1000e: several cleanups and fixes, as well as bump the version
> igb/igbvf/ixgbevf: bump driver version
> rtnetlink: Compute and store minimum ifinfo dump size
>
> -v2: fixed infiniband compile issue with the rtnetlink patch
>
> The following are changes since commit e357964ee66723d0ced63ac1dbd1db4a6a1d417e:
> bonding: delete unused arp_mon_pt
> and are available in the git repository at:
> master.kernel.org:/pub/scm/linux/kernel/git/jkirsher/net-next-2.6 master
Pulled, thanks Jeff.
^ permalink raw reply
* Re: [PATCH] sctp: kzalloc() error handling on deleting last address
From: Wei Yongjun @ 2011-06-10 8:21 UTC (permalink / raw)
To: Michio Honda; +Cc: David Miller, netdev
In-Reply-To: <F8A1B797-89A2-4AAA-AFB1-9B187AC08456@sfc.wide.ad.jp>
> From 49a66ecad72af8c367b125c695a113d3f3870320 Mon Sep 17 00:00:00 2001
> From: Michio Honda <micchie@sfc.wide.ad.jp>
> Date: Fri, 10 Jun 2011 16:42:14 +0900
> Subject: [PATCH] sctp: kzalloc() error handling on deleting last address
>
> Signed-off-by: Michio Honda <micchie@sfc.wide.ad.jp>
> ---
> net/sctp/socket.c | 2 ++
> 1 files changed, 2 insertions(+), 0 deletions(-)
>
> diff --git a/net/sctp/socket.c b/net/sctp/socket.c
> index e7e1b14..a23d898 100644
> --- a/net/sctp/socket.c
> +++ b/net/sctp/socket.c
> @@ -786,6 +786,8 @@ static int sctp_send_asconf_del_ip(struct sock *sk,
> continue;
> asoc->asconf_addr_del_pending =
> kzalloc(sizeof(union sctp_addr), GFP_ATOMIC);
> + if (asoc->asconf_addr_del_pending == NULL)
> + continue;
better to return with ENOMEM.
if (asoc->asconf_addr_del_pending == NULL) {
retval = -ENOMEM;
goto out;
}
> asoc->asconf_addr_del_pending->sa.sa_family =
> addrs->sa_family;
> asoc->asconf_addr_del_pending->v4.sin_port =
^ permalink raw reply
* [PATCH v3] vlan: Fix the ingress VLAN_FLAG_REORDER_HDR check
From: Jiri Pirko @ 2011-06-10 8:35 UTC (permalink / raw)
To: David Miller
Cc: xiaosuo, pratnakarlx, ebiederm, shemminger, greearb,
nicolas.2p.debian, netdev, kaber, fubar, eric.dumazet, andy,
jesse
In-Reply-To: <20110605.141446.1838641439880246155.davem@davemloft.net>
Please review. I'm not sure if there wouldn't be necessary to control
for rx accelerated skbs. Smoke tested.
Subject: [patch net-2.6 v3] vlan: Fix the ingress VLAN_FLAG_REORDER_HDR check
Testing of VLAN_FLAG_REORDER_HDR does not belong in vlan_untag
but rather in vlan_do_receive. Otherwise the vlan header
will not be properly put on the packet in the case of
vlan header accelleration.
As we remove the check from vlan_check_reorder_header
rename it vlan_reorder_header to keep the naming clean.
Use a simple if statement instead of a complicated switch
statement to decided that we need to increment rx_stats
for a multicast packet.
Hopefully at somepoint we will just declare the case where
VLAN_FLAG_REORDER_HDR is cleared as unsupported and remove
the code. Until then this keeps it working correctly.
Use vlan_unreorder_header to revert actions previously done by
vlan_untag->vlan_reorder_header in case VLAN_FLAG_REORDER_HDR is not set
Signed-off-by: Eric W. Biederman <ebiederm@xmission.com>
Signed-off-by: Jiri Pirko <jpirko@redhat.com>
---
net/8021q/vlan_core.c | 75 ++++++++++++++++++++++++++++--------------------
1 files changed, 44 insertions(+), 31 deletions(-)
diff --git a/net/8021q/vlan_core.c b/net/8021q/vlan_core.c
index 41495dc..d71cc81 100644
--- a/net/8021q/vlan_core.c
+++ b/net/8021q/vlan_core.c
@@ -4,6 +4,33 @@
#include <linux/netpoll.h>
#include "vlan.h"
+static struct sk_buff *vlan_reorder_header(struct sk_buff *skb)
+{
+ if (skb_cow(skb, skb_headroom(skb)) < 0)
+ return NULL;
+ /* Lifted from Gleb's VLAN code... */
+ memmove(skb->data - ETH_HLEN, skb->data - VLAN_ETH_HLEN, 12);
+ skb->mac_header += VLAN_HLEN;
+ return skb;
+}
+
+/* Should be used only to revert vlan_reorder_header action */
+static struct sk_buff *vlan_unreorder_header(struct sk_buff *skb)
+{
+ unsigned char *mac_header;
+ struct vlan_ethhdr *veth;
+
+ if (skb_cow(skb, skb_headroom(skb)) < 0)
+ return NULL;
+ skb->mac_header -= VLAN_HLEN;
+ mac_header = skb_mac_header(skb);
+ memmove(mac_header, mac_header + VLAN_HLEN, 12);
+ veth = (struct vlan_ethhdr *) mac_header;
+ veth->h_vlan_proto = htons(ETH_P_8021Q);
+ veth->h_vlan_TCI = htons(skb->vlan_tci);
+ return skb;
+}
+
bool vlan_do_receive(struct sk_buff **skbp)
{
struct sk_buff *skb = *skbp;
@@ -23,6 +50,21 @@ bool vlan_do_receive(struct sk_buff **skbp)
return false;
skb->dev = vlan_dev;
+ if (skb->pkt_type == PACKET_OTHERHOST) {
+ /* Our lower layer thinks this is not local, let's make sure.
+ * This allows the VLAN to have a different MAC than the
+ * underlying device, and still route correctly. */
+ if (!compare_ether_addr(eth_hdr(skb)->h_dest,
+ vlan_dev->dev_addr))
+ skb->pkt_type = PACKET_HOST;
+ }
+
+ if (!(vlan_dev_info(vlan_dev)->flags & VLAN_FLAG_REORDER_HDR)) {
+ skb = *skbp = vlan_unreorder_header(skb);
+ if (!skb)
+ return false;
+ }
+
skb->priority = vlan_get_ingress_priority(vlan_dev, skb->vlan_tci);
skb->vlan_tci = 0;
@@ -31,22 +73,8 @@ bool vlan_do_receive(struct sk_buff **skbp)
u64_stats_update_begin(&rx_stats->syncp);
rx_stats->rx_packets++;
rx_stats->rx_bytes += skb->len;
-
- switch (skb->pkt_type) {
- case PACKET_BROADCAST:
- break;
- case PACKET_MULTICAST:
+ if (skb->pkt_type == PACKET_MULTICAST)
rx_stats->rx_multicast++;
- break;
- case PACKET_OTHERHOST:
- /* Our lower layer thinks this is not local, let's make sure.
- * This allows the VLAN to have a different MAC than the
- * underlying device, and still route correctly. */
- if (!compare_ether_addr(eth_hdr(skb)->h_dest,
- vlan_dev->dev_addr))
- skb->pkt_type = PACKET_HOST;
- break;
- }
u64_stats_update_end(&rx_stats->syncp);
return true;
@@ -89,21 +117,6 @@ gro_result_t vlan_gro_frags(struct napi_struct *napi, struct vlan_group *grp,
}
EXPORT_SYMBOL(vlan_gro_frags);
-static struct sk_buff *vlan_check_reorder_header(struct sk_buff *skb)
-{
- if (vlan_dev_info(skb->dev)->flags & VLAN_FLAG_REORDER_HDR) {
- if (skb_cow(skb, skb_headroom(skb)) < 0)
- skb = NULL;
- if (skb) {
- /* Lifted from Gleb's VLAN code... */
- memmove(skb->data - ETH_HLEN,
- skb->data - VLAN_ETH_HLEN, 12);
- skb->mac_header += VLAN_HLEN;
- }
- }
- return skb;
-}
-
static void vlan_set_encap_proto(struct sk_buff *skb, struct vlan_hdr *vhdr)
{
__be16 proto;
@@ -161,7 +174,7 @@ struct sk_buff *vlan_untag(struct sk_buff *skb)
skb_pull_rcsum(skb, VLAN_HLEN);
vlan_set_encap_proto(skb, vhdr);
- skb = vlan_check_reorder_header(skb);
+ skb = vlan_reorder_header(skb);
if (unlikely(!skb))
goto err_free;
--
1.7.5.2
^ permalink raw reply related
* [PATCH v1] sctp: kzalloc() error handling on deleting last address
From: Michio Honda @ 2011-06-10 9:06 UTC (permalink / raw)
To: David Miller; +Cc: Wei Yongjun, netdev
>From be2da529aa45061e77ad96313175e141aaadc16a Mon Sep 17 00:00:00 2001
From: Michio Honda <micchie@sfc.wide.ad.jp>
Date: Fri, 10 Jun 2011 16:42:14 +0900
Subject: [PATCH v1] sctp: kzalloc() error handling on deleting last address
Signed-off-by: Michio Honda <micchie@sfc.wide.ad.jp>
---
net/sctp/socket.c | 4 ++++
1 files changed, 4 insertions(+), 0 deletions(-)
diff --git a/net/sctp/socket.c b/net/sctp/socket.c
index e7e1b14..60038fe 100644
--- a/net/sctp/socket.c
+++ b/net/sctp/socket.c
@@ -786,6 +786,10 @@ static int sctp_send_asconf_del_ip(struct sock *sk,
continue;
asoc->asconf_addr_del_pending =
kzalloc(sizeof(union sctp_addr), GFP_ATOMIC);
+ if (asoc->asconf_addr_del_pending == NULL) {
+ retval = -ENOMEM;
+ goto out;
+ }
asoc->asconf_addr_del_pending->sa.sa_family =
addrs->sa_family;
asoc->asconf_addr_del_pending->v4.sin_port =
--
1.7.3.2
^ permalink raw reply related
* From The UN Foundation
From: Kalogeropoulos Aspasia @ 2011-06-10 9:09 UTC (permalink / raw)
To: info
UNDP SCHEME 2011.
08/06/2011.
This is to notify you that you have been appointed as one of the recipients of a Cash Grant/Donation for your personal and community development. You were selected among the beneficiaries to receive the sum of US$500,000.00 as developmental aid from the UN Foundation. Please contact.UNDP Mr. Gilbert Alvin on this email: undg.grant@yahoo.com.hk <mailto:undg.grant@yahoo.com.hk> ,
Regards Aspasia Kalogeropoulos,
Chairman Grant Programme
^ permalink raw reply
* Re: [PATCH v3] vlan: Fix the ingress VLAN_FLAG_REORDER_HDR check
From: Changli Gao @ 2011-06-10 9:26 UTC (permalink / raw)
To: Jiri Pirko
Cc: David Miller, pratnakarlx, ebiederm, shemminger, greearb,
nicolas.2p.debian, netdev, kaber, fubar, eric.dumazet, andy,
jesse
In-Reply-To: <20110610083539.GB17568@minipsycho.redhat.com>
On Fri, Jun 10, 2011 at 4:35 PM, Jiri Pirko <jpirko@redhat.com> wrote:
> +
> +/* Should be used only to revert vlan_reorder_header action */
> +static struct sk_buff *vlan_unreorder_header(struct sk_buff *skb)
> +{
> + unsigned char *mac_header;
> + struct vlan_ethhdr *veth;
> +
> + if (skb_cow(skb, skb_headroom(skb)) < 0)
> + return NULL;
I think we need to make sure if there is enough headroom for this
header expansion.
> + skb->mac_header -= VLAN_HLEN;
skb->mac_len isn't adjusted. You forgot to move the headers resetting
after vlan_untag().
--
Regards,
Changli Gao(xiaosuo@gmail.com)
^ permalink raw reply
* Re: [PATCH v3] vlan: Fix the ingress VLAN_FLAG_REORDER_HDR check
From: Jiri Pirko @ 2011-06-10 9:34 UTC (permalink / raw)
To: Changli Gao
Cc: David Miller, pratnakarlx, ebiederm, shemminger, greearb,
nicolas.2p.debian, netdev, kaber, fubar, eric.dumazet, andy,
jesse
In-Reply-To: <BANLkTinqikKoeW6mbjMV9nPii0Nzp4vSdQ@mail.gmail.com>
Fri, Jun 10, 2011 at 11:26:06AM CEST, xiaosuo@gmail.com wrote:
>On Fri, Jun 10, 2011 at 4:35 PM, Jiri Pirko <jpirko@redhat.com> wrote:
>> +
>> +/* Should be used only to revert vlan_reorder_header action */
>> +static struct sk_buff *vlan_unreorder_header(struct sk_buff *skb)
>> +{
>> + unsigned char *mac_header;
>> + struct vlan_ethhdr *veth;
>> +
>> + if (skb_cow(skb, skb_headroom(skb)) < 0)
>> + return NULL;
>
>I think we need to make sure if there is enough headroom for this
>header expansion.
Well the header expansion was previously there so there should be place
there in all cases, or am I wrong?
>
>> + skb->mac_header -= VLAN_HLEN;
>
>skb->mac_len isn't adjusted. You forgot to move the headers resetting
>after vlan_untag().
that is correct, I'll move that. I'll also add reset after unreorder.
Thanks Changli.
Jirka
>
>
>
>--
>Regards,
>Changli Gao(xiaosuo@gmail.com)
^ permalink raw reply
* Re: [PATCH] ep93xx-eth: convert to phylib
From: Florian Fainelli @ 2011-06-10 9:46 UTC (permalink / raw)
To: Petr Štetiar
Cc: netdev, Herbert Valerio Riedel, Mika Westerberg, davem, hsweeten,
ryan, Lennert Buytenhek, linux-arm-kernel
In-Reply-To: <20110609203059.GZ16318@ibawizard.net>
Hello Petr,
On Thursday 09 June 2011 22:30:59 Petr Štetiar wrote:
> Florian Fainelli <f.fainelli@gmail.com> [2011-06-05 20:29:24]:
> > On Sunday 05 June 2011 19:57:36 Florian Fainelli wrote:
> > > ep93xx-eth lacked support for monitoring link status changes, with this
> > > patch, link changes are now watched and reported correctly.
> > >
> > > Signed-off-by: Florian Fainelli <florian@openwrt.org>
> > > ---
> >
> > I just stumbled upon: http://www.mail-
> > archive.com/netdev@vger.kernel.org/msg62549.html
> > which does not seem to have been merged.
> >
> > I will respin my patch with Herbert's changes
>
> Hi,
>
> just FYI, I wanted to test recent Mika's DMA/ep93xx_eth fixes, so I've
> added this patch also and it oopsed. If I revert this patch, it seems to
> work so far. You can find the whole patchset I've been testing on the
> GitHub[1]. I've tested it on ts-7250 and ts-7300, the oops is same. Here's
> the oops:
Allright, I need to respin the patch anyway, thanks for testing.
>
> ep93xx-eth version 0.1 loading
> ep93xx_eth_mii: probed
> ep93xx_eth:ep93xx_mii_probe: no PHY found
> ep93xx-eth ep93xx-eth: failed to probe MII bus
> ------------[ cut here ]------------
> WARNING: at net/core/dev.c:5133 rollback_registered_many+0x90/0x2d4()
> Modules linked in:
> Backtrace:
> [<c0027e78>] (dump_backtrace+0x0/0x10c) from [<c0263764>]
> (dump_stack+0x18/0x1c) r6:0000140d r5:c01cd558 r4:00000000 r3:00000000
> [<c026374c>] (dump_stack+0x0/0x1c) from [<c0037a48>]
> (warn_slowpath_common+0x50/0x68) [<c00379f8>]
> (warn_slowpath_common+0x0/0x68) from [<c0037a84>]
> (warn_slowpath_null+0x24/0x2c) r8:00100100 r7:00200200 r6:cf01bda0
> r5:cf01bdf8 r4:cf0b6800
> r3:00000009
> [<c0037a60>] (warn_slowpath_null+0x0/0x2c) from [<c01cd558>]
> (rollback_registered_many+0x90/0x2d4) [<c01cd4c8>]
> (rollback_registered_many+0x0/0x2d4) from [<c01cd834>]
> (rollback_registered+0x30/0x48) r8:00000027 r7:cf0b6800 r6:cf0b6b40
> r5:00000000 r4:cf0b6800
> r3:cf0b6858
> [<c01cd804>] (rollback_registered+0x0/0x48) from [<c01cd8a8>]
> (unregister_netdevice_queue+0x5c/0xa8) [<c01cd84c>]
> (unregister_netdevice_queue+0x0/0xa8) from [<c01cd914>]
> (unregister_netdev+0x20/0x28) r5:c030f638 r4:cf0b6800
> [<c01cd8f4>] (unregister_netdev+0x0/0x28) from [<c01b03a0>]
> (ep93xx_eth_remove+0x34/0x90) r4:cf0b6800 r3:cf039180
> [<c01b036c>] (ep93xx_eth_remove+0x0/0x90) from [<c01b1348>]
> (ep93xx_eth_probe+0x218/0x43c) r5:c030f630 r4:ffffffed
> [<c01b1130>] (ep93xx_eth_probe+0x0/0x43c) from [<c018b7b8>]
> (platform_drv_probe+0x1c/0x20) [<c018b79c>] (platform_drv_probe+0x0/0x20)
> from [<c018a5d0>] (driver_probe_device+0x8c/0x198) [<c018a544>]
> (driver_probe_device+0x0/0x198) from [<c018a770>]
> (__driver_attach+0x94/0x98) r8:c0017d40 r7:00000000 r6:c030f66c
> r5:c032080c r4:c030f638
> r3:00000000
> [<c018a6dc>] (__driver_attach+0x0/0x98) from [<c018974c>]
> (bus_for_each_dev+0x60/0x88) r6:00000000 r5:c018a6dc r4:c032080c
> r3:c018a6dc
> [<c01896ec>] (bus_for_each_dev+0x0/0x88) from [<c018a2a8>]
> (driver_attach+0x20/0x28) r6:cf0ae860 r5:c031d4e0 r4:c032080c
> [<c018a288>] (driver_attach+0x0/0x28) from [<c0189e94>]
> (bus_add_driver+0xa4/0x240) [<c0189df0>] (bus_add_driver+0x0/0x240) from
> [<c018aae0>] (driver_register+0x80/0x144) [<c018aa60>]
> (driver_register+0x0/0x144) from [<c018baf0>]
> (platform_driver_register+0x4c/0x60) r8:c0017d40 r7:00000000 r6:cf01a000
> r5:c0325960 r4:c001ee3c
> r3:00000000
> [<c018baa4>] (platform_driver_register+0x0/0x60) from [<c0017d5c>]
> (ep93xx_eth_init_module+0x1c/0x28) [<c0017d40>]
> (ep93xx_eth_init_module+0x0/0x28) from [<c00244f0>]
> (do_one_initcall+0x3c/0x17c) [<c00244b4>] (do_one_initcall+0x0/0x17c) from
> [<c0008a04>] (kernel_init+0x9c/0x140) [<c0008968>] (kernel_init+0x0/0x140)
> from [<c003b158>] (do_exit+0x0/0x710) r5:c0008968 r4:00000000
> ---[ end trace edc3043606fef430 ]---
> network todo 'eth%d' but state 0
> Backtrace:
> [<c0027e78>] (dump_backtrace+0x0/0x10c) from [<c0263764>]
> (dump_stack+0x18/0x1c) r6:cf0b6b40 r5:c0312560 r4:cf0b6800 r3:00000000
> [<c026374c>] (dump_stack+0x0/0x1c) from [<c01d10e4>]
> (netdev_run_todo+0x2dc/0x33c) [<c01d0e08>] (netdev_run_todo+0x0/0x33c)
> from [<c01dd824>] (rtnl_unlock+0x10/0x14) [<c01dd814>]
> (rtnl_unlock+0x0/0x14) from [<c01cd918>] (unregister_netdev+0x24/0x28)
> [<c01cd8f4>] (unregister_netdev+0x0/0x28) from [<c01b03a0>]
> (ep93xx_eth_remove+0x34/0x90) r4:cf0b6800 r3:cf039180
> [<c01b036c>] (ep93xx_eth_remove+0x0/0x90) from [<c01b1348>]
> (ep93xx_eth_probe+0x218/0x43c) r5:c030f630 r4:ffffffed
> [<c01b1130>] (ep93xx_eth_probe+0x0/0x43c) from [<c018b7b8>]
> (platform_drv_probe+0x1c/0x20) [<c018b79c>] (platform_drv_probe+0x0/0x20)
> from [<c018a5d0>] (driver_probe_device+0x8c/0x198) [<c018a544>]
> (driver_probe_device+0x0/0x198) from [<c018a770>]
> (__driver_attach+0x94/0x98) r8:c0017d40 r7:00000000 r6:c030f66c
> r5:c032080c r4:c030f638
> r3:00000000
> [<c018a6dc>] (__driver_attach+0x0/0x98) from [<c018974c>]
> (bus_for_each_dev+0x60/0x88) r6:00000000 r5:c018a6dc r4:c032080c
> r3:c018a6dc
> [<c01896ec>] (bus_for_each_dev+0x0/0x88) from [<c018a2a8>]
> (driver_attach+0x20/0x28) r6:cf0ae860 r5:c031d4e0 r4:c032080c
> [<c018a288>] (driver_attach+0x0/0x28) from [<c0189e94>]
> (bus_add_driver+0xa4/0x240) [<c0189df0>] (bus_add_driver+0x0/0x240) from
> [<c018aae0>] (driver_register+0x80/0x144) [<c018aa60>]
> (driver_register+0x0/0x144) from [<c018baf0>]
> (platform_driver_register+0x4c/0x60) r8:c0017d40 r7:00000000 r6:cf01a000
> r5:c0325960 r4:c001ee3c
> r3:00000000
> [<c018baa4>] (platform_driver_register+0x0/0x60) from [<c0017d5c>]
> (ep93xx_eth_init_module+0x1c/0x28) [<c0017d40>]
> (ep93xx_eth_init_module+0x0/0x28) from [<c00244f0>]
> (do_one_initcall+0x3c/0x17c) [<c00244b4>] (do_one_initcall+0x0/0x17c) from
> [<c0008a04>] (kernel_init+0x9c/0x140) [<c0008968>] (kernel_init+0x0/0x140)
> from [<c003b158>] (do_exit+0x0/0x710) r5:c0008968 r4:00000000
> Unable to handle kernel NULL pointer dereference at virtual address
> 00000000 pgd = c0004000
> [00000000] *pgd=00000000
> Internal error: Oops: 5 [#1] PREEMPT
> Modules linked in:
> CPU: 0 Tainted: G W (3.0.0-rc2+ #35)
> PC is at ep93xx_free_buffers+0x24/0xd4
> LR is at ep93xx_eth_remove+0x5c/0x90
> pc : [<c01b02bc>] lr : [<c01b03c8>] psr: 80000013
> sp : cf01be20 ip : cf01be40 fp : cf01be3c
> r10: 00000080 r9 : c0325bc8 r8 : 00000027
> r7 : c030f638 r6 : cf0b6b40 r5 : cf0b6b54 r4 : 00000000
> r3 : 00000000 r2 : 00000014 r1 : 00000800 r0 : cf0b6b40
> Flags: Nzcv IRQs on FIQs on Mode SVC_32 ISA ARM Segment kernel
> Control: c000717f Table: 00004000 DAC: 00000017
> Process swapper (pid: 1, stack limit = 0xcf01a270)
> Stack: (0xcf01be20 to 0xcf01c000)
> be20: cf0b6800 cf0b6b40 cf0b6b40 cf0b6800 cf01be54 cf01be40 c01b03c8
> c01b02a8 be40: ffffffed c030f630 cf01be94 cf01be58 c01b1348 c01b037c
> 00000000 c032080c be60: c0017d40 c030f638 cf01be84 c030f638 c0340bd0
> c030f638 c032080c c0017d40 be80: 00000000 00000000 cf01bea4 cf01be98
> c018b7b8 c01b1140 cf01becc cf01bea8 bea0: c018a5d0 c018b7ac 00000000
> c030f638 c032080c c030f66c 00000000 c0017d40 bec0: cf01beec cf01bed0
> c018a770 c018a554 c018a6dc c032080c c018a6dc 00000000 bee0: cf01bf14
> cf01bef0 c018974c c018a6ec cf02ebf8 cf0391b0 c01576c4 c032080c bf00:
> c031d4e0 cf0ae860 cf01bf24 cf01bf18 c018a2a8 c01896fc cf01bf54 cf01bf28
> bf20: c0189e94 c018a298 c02ce24c cf01bf38 c032080c c0325960 cf01a000
> 00000000 bf40: c0017d40 00000000 cf01bf7c cf01bf58 c018aae0cf01bfe0
> c0008a04 c00244c4 bfe0: 00000000 c0008968 00000000 cf01bff8 c003b158
> c0008978 e3a0105e e3a02030 Backtrace:
> [<c01b0298>] (ep93xx_free_buffers+0x0/0xd4) from [<c01b03c8>]
> (ep93xx_eth_remove+0x5c/0x90) r7:cf0b6800 r6:cf0b6b40 r5:cf0b6b40
> r4:cf0b6800
> [<c01b036c>] (ep93xx_eth_remove+0x0/0x90) from [<c01b1348>]
> (ep93xx_eth_probe+0x218/0x43c) r5:c030f630 r4:ffffffed
> [<c01b1130>] (ep93xx_eth_probe+0x0/0x43c) from [<c018b7b8>]
> (platform_drv_probe+0x1c/0x20) [<c018b79c>] (platform_drv_probe+0x0/0x20)
> from [<c018a5d0>] (driver_probe_device+0x8c/0x198) [<c018a544>]
> (driver_probe_device+0x0/0x198) from [<c018a770>]
> (__driver_attach+0x94/0x98) r8:c0017d40 r7:00000000 r6:c030f66c
> r5:c032080c r4:c030f638
> r3:00000000
> [<c018a6dc>] (__driver_attach+0x0/0x98) from [<c018974c>]
> (bus_for_each_dev+0x60/0x88) r6:00000000 r5:c018a6dc r4:c032080c
> r3:c018a6dc
> [<c01896ec>] (bus_for_each_dev+0x0/0x88) from [<c018a2a8>]
> (driver_attach+0x20/0x28) r6:cf0ae860 r5:c031d4e0 r4:c032080c
> [<c018a288>] (driver_attach+0x0/0x28) from [<c0189e94>]
> (bus_add_driver+0xa4/0x240) [<c0189df0>] (bus_add_driver+0x0/0x240) from
> [<c018aae0>] (driver_register+0x80/0x144) [<c018aa60>]
> (driver_register+0x0/0x144) from [<c018baf0>]
> (platform_driver_register+0x4c/0x60) r8:c0017d40 r7:00000000 r6:cf01a000
> r5:c0325960 r4:c001ee3c
> r3:00000000
> [<c018baa4>] (platform_driver_register+0x0/0x60) from [<c0017d5c>]
> (ep93xx_eth_init_module+0x1c/0x28) [<c0017d40>]
> (ep93xx_eth_init_module+0x0/0x28) from [<c00244f0>]
> (do_one_initcall+0x3c/0x17c) [<c00244b4>] (do_one_initcall+0x0/0x17c) from
> [<c0008a04>] (kernel_init+0x9c/0x140) [<c0008968>] (kernel_init+0x0/0x140)
> from [<c003b158>] (do_exit+0x0/0x710) r5:c0008968 r4:00000000
> Code: e2805014 e3a04000 e5963010 e3a01b02 (e7933184)
> ---[ end trace edc3043606fef431 ]---
> Kernel panic - not syncing: Attempted to kill init!
> Backtrace:
> [<c0027e78>] (dump_backtrace+0x0/0x10c) from [<c0263764>]
> (dump_stack+0x18/0x1c) r6:00000000 r5:c0312c40 r4:c0325cc0 r3:00000002
> [<c026374c>] (dump_stack+0x0/0x1c) from [<c02637d0>] (panic+0x68/0x198)
> [<c0263768>] (panic+0x0/0x198) from [<c003b7cc>] (do_exit+0x674/0x710)
> r3:c0312c40 r2:c003b754 r1:cf01a000 r0:c02cf148
> r7:cf019be0
> [<c003b158>] (do_exit+0x0/0x710) from [<c00284e4>] (die+ cf0b6b40
> 00000800 bde0: 00000014 00000000 00000000 cf0b6b54 cf0b6b40 c030f638
> 00000027 c0325bc8 be00: 00000080 cf01be3c cf01be40 cf01be20 c01b03c8
> c01b02bc 80000013 ffffffff r8:00000027 r7:c030f638 r6:cf0b6b40 r5:cf01be0c
> r4:ffffffff
> [<c01b0298>] (ep93xx_free_buffers+0x0/0xd4) from [<c01b03c8>]
> (ep93xx_eth_remove+0x5c/0x90) r7:cf0b6800 r6:cf0b6b40 r5:cf0b6b40
> r4:cf0b6800
> [<c01b036c>] (ep93xx_eth_remove+0x0/0x90) from [<c01b1348>]
> (ep93xx_eth_probe+0x218/0x43c) r5:c030f630 r4:ffffffed
> [<c01b1130>] (ep93xx_eth_probe+0x0/0x43c) from [<c018b7b8>]
> (platform_drv_probe+0x1c/0x20) [<c018b79c>] (platform_drv_probe+0x0/0x20)
> from [<c018a5d0>] (driver_probe_device+0x8c/0x198) [<c018a544>]
> (driver_probe_device+0x0/0x198) from [<c018a770>]
> (__driver_attach+0x94/0x98) r8:c0017d40 r7:00000000 r6:c030f66c
> r5:c032080c r4:c030f638
> r3:00000000
> [<c018a6dc>] (__driver_attach+0x0/0x98) from [<c018974c>]
> (bus_for_each_dev+0x60/0x88) r6:00000000 r5:c018a6dc r4:c032080c
> r3:c018a6dc
> [<c01896ec>] (bus_for_each_dev+0x0/0x88) from [<c018a2a8>]
> (driver_attach+0x20/0x28) r6:cf0ae860 r5:c031d4e0 r4:c032080c
> [<c018a288>] (driver_attach+0x0/0x28) from [<c0189e94>]
> (bus_add_driver+0xa4/0x240) [<c0189df0>] (bus_add_driver+0x0/0x240) from
> [<c018aae0>] (driver_register+0x80/0x144) [<c018aa60>]
> (driver_register+0x0/0x144) from [<c018baf0>]
> (platform_driver_register+0x4c/0x60) r8:c0017d40 r7:00000000 r6:cf01a000
> r5:c0325960 r4:c001ee3c
> r3:00000000
> [<c018baa4>] (platform_driver_register+0x0/0x60) from [<c0017d5c>]
> (ep93xx_eth_init_module+0x1c/0x28) [<c0017d40>]
> (ep93xx_eth_init_module+0x0/0x28) from [<c00244f0>]
> (do_one_initcall+0x3c/0x17c) [<c00244b4>] (do_one_initcall+0x0/0x17c) from
> [<c0008a04>] (kernel_init+0x9c/0x140) [<c0008968>] (kernel_init+0x0/0x140)
> from [<c003b158>] (do_exit+0x0/0x710) r5:c0008968 r4:00000000
>
> 1. https://github.com/ynezz/linux-2.6/commits/ts72xx-wip
>
> -- ynezz
^ permalink raw reply
* Re: [PATCH v3] vlan: Fix the ingress VLAN_FLAG_REORDER_HDR check
From: Changli Gao @ 2011-06-10 9:49 UTC (permalink / raw)
To: Jiri Pirko
Cc: David Miller, pratnakarlx, ebiederm, shemminger, greearb,
nicolas.2p.debian, netdev, kaber, fubar, eric.dumazet, andy,
jesse
In-Reply-To: <20110610093413.GC17568@minipsycho.redhat.com>
On Fri, Jun 10, 2011 at 5:34 PM, Jiri Pirko <jpirko@redhat.com> wrote:
> Fri, Jun 10, 2011 at 11:26:06AM CEST, xiaosuo@gmail.com wrote:
>>On Fri, Jun 10, 2011 at 4:35 PM, Jiri Pirko <jpirko@redhat.com> wrote:
>>> +
>>> +/* Should be used only to revert vlan_reorder_header action */
>>> +static struct sk_buff *vlan_unreorder_header(struct sk_buff *skb)
>>> +{
>>> + unsigned char *mac_header;
>>> + struct vlan_ethhdr *veth;
>>> +
>>> + if (skb_cow(skb, skb_headroom(skb)) < 0)
>>> + return NULL;
>>
>>I think we need to make sure if there is enough headroom for this
>>header expansion.
>
> Well the header expansion was previously there so there should be place
> there in all cases, or am I wrong?
For hw-accel-vlan-rx, is the headroom for this header expansion
reserved? I don't think so. Thanks.
--
Regards,
Changli Gao(xiaosuo@gmail.com)
^ permalink raw reply
* Re: [PATCH v3] vlan: Fix the ingress VLAN_FLAG_REORDER_HDR check
From: Jiri Pirko @ 2011-06-10 10:35 UTC (permalink / raw)
To: Changli Gao
Cc: David Miller, pratnakarlx, ebiederm, shemminger, greearb,
nicolas.2p.debian, netdev, kaber, fubar, eric.dumazet, andy,
jesse
In-Reply-To: <BANLkTimHi7V3YwbPepLyW7=pTS7hQVxEBQ@mail.gmail.com>
Fri, Jun 10, 2011 at 11:49:27AM CEST, xiaosuo@gmail.com wrote:
>On Fri, Jun 10, 2011 at 5:34 PM, Jiri Pirko <jpirko@redhat.com> wrote:
>> Fri, Jun 10, 2011 at 11:26:06AM CEST, xiaosuo@gmail.com wrote:
>>>On Fri, Jun 10, 2011 at 4:35 PM, Jiri Pirko <jpirko@redhat.com> wrote:
>>>> +
>>>> +/* Should be used only to revert vlan_reorder_header action */
>>>> +static struct sk_buff *vlan_unreorder_header(struct sk_buff *skb)
>>>> +{
>>>> + unsigned char *mac_header;
>>>> + struct vlan_ethhdr *veth;
>>>> +
>>>> + if (skb_cow(skb, skb_headroom(skb)) < 0)
>>>> + return NULL;
>>>
>>>I think we need to make sure if there is enough headroom for this
>>>header expansion.
>>
>> Well the header expansion was previously there so there should be place
>> there in all cases, or am I wrong?
>
>For hw-accel-vlan-rx, is the headroom for this header expansion
>reserved? I don't think so. Thanks.
But this wasn't done for hw-accel-vlan-rx previously right? So why don't
check for hw-accel-vlan-rx and don do unreorder in that case?
>
>--
>Regards,
>Changli Gao(xiaosuo@gmail.com)
^ 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