Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6: sch_htb: fix "too many events" situation connector: convert to single-threaded workqueue [ATM]: When proc_create() fails, do some error handling work and return -ENOMEM. [SUNGEM]: Fix NAPI assertion failure. BNX2X: prevent ethtool from setting port type [9P] net/9p/trans_fd.c: remove unused variable [IPV6] net/ipv6/ndisc.c: remove unused variable [IPV4] fib_trie: fix warning from rcu_assign_poinger [TCP]: Let skbs grow over a page on fast peers [DLCI]: Fix tiny race between module unload and sock_ioctl. [SCTP]: Fix build warnings with IPV6 disabled. [IPV4]: Fix null dereference in ip_defrag
This commit is contained in:
commit
ca1a6ba57c
|
@ -146,7 +146,7 @@ struct cn_queue_dev *cn_queue_alloc_dev(char *name, struct sock *nls)
|
||||||
|
|
||||||
dev->nls = nls;
|
dev->nls = nls;
|
||||||
|
|
||||||
dev->cn_queue = create_workqueue(dev->name);
|
dev->cn_queue = create_singlethread_workqueue(dev->name);
|
||||||
if (!dev->cn_queue) {
|
if (!dev->cn_queue) {
|
||||||
kfree(dev);
|
kfree(dev);
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
|
@ -63,8 +63,8 @@
|
||||||
#include "bnx2x.h"
|
#include "bnx2x.h"
|
||||||
#include "bnx2x_init.h"
|
#include "bnx2x_init.h"
|
||||||
|
|
||||||
#define DRV_MODULE_VERSION "1.40.22"
|
#define DRV_MODULE_VERSION "1.42.3"
|
||||||
#define DRV_MODULE_RELDATE "2007/11/27"
|
#define DRV_MODULE_RELDATE "2008/3/9"
|
||||||
#define BNX2X_BC_VER 0x040200
|
#define BNX2X_BC_VER 0x040200
|
||||||
|
|
||||||
/* Time in jiffies before concluding the transmitter is hung. */
|
/* Time in jiffies before concluding the transmitter is hung. */
|
||||||
|
@ -8008,38 +8008,6 @@ static int bnx2x_set_settings(struct net_device *dev, struct ethtool_cmd *cmd)
|
||||||
cmd->duplex, cmd->port, cmd->phy_address, cmd->transceiver,
|
cmd->duplex, cmd->port, cmd->phy_address, cmd->transceiver,
|
||||||
cmd->autoneg, cmd->maxtxpkt, cmd->maxrxpkt);
|
cmd->autoneg, cmd->maxtxpkt, cmd->maxrxpkt);
|
||||||
|
|
||||||
switch (cmd->port) {
|
|
||||||
case PORT_TP:
|
|
||||||
if (!(bp->supported & SUPPORTED_TP)) {
|
|
||||||
DP(NETIF_MSG_LINK, "TP not supported\n");
|
|
||||||
return -EINVAL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (bp->phy_flags & PHY_XGXS_FLAG) {
|
|
||||||
bnx2x_link_reset(bp);
|
|
||||||
bnx2x_link_settings_supported(bp, SWITCH_CFG_1G);
|
|
||||||
bnx2x_phy_deassert(bp);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case PORT_FIBRE:
|
|
||||||
if (!(bp->supported & SUPPORTED_FIBRE)) {
|
|
||||||
DP(NETIF_MSG_LINK, "FIBRE not supported\n");
|
|
||||||
return -EINVAL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!(bp->phy_flags & PHY_XGXS_FLAG)) {
|
|
||||||
bnx2x_link_reset(bp);
|
|
||||||
bnx2x_link_settings_supported(bp, SWITCH_CFG_10G);
|
|
||||||
bnx2x_phy_deassert(bp);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
DP(NETIF_MSG_LINK, "Unknown port type\n");
|
|
||||||
return -EINVAL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (cmd->autoneg == AUTONEG_ENABLE) {
|
if (cmd->autoneg == AUTONEG_ENABLE) {
|
||||||
if (!(bp->supported & SUPPORTED_Autoneg)) {
|
if (!(bp->supported & SUPPORTED_Autoneg)) {
|
||||||
DP(NETIF_MSG_LINK, "Aotoneg not supported\n");
|
DP(NETIF_MSG_LINK, "Aotoneg not supported\n");
|
||||||
|
|
|
@ -912,7 +912,7 @@ static int gem_poll(struct napi_struct *napi, int budget)
|
||||||
* rx ring - must call napi_disable(), which
|
* rx ring - must call napi_disable(), which
|
||||||
* schedule_timeout()'s if polling is already disabled.
|
* schedule_timeout()'s if polling is already disabled.
|
||||||
*/
|
*/
|
||||||
work_done += gem_rx(gp, budget);
|
work_done += gem_rx(gp, budget - work_done);
|
||||||
|
|
||||||
if (work_done >= budget)
|
if (work_done >= budget)
|
||||||
return work_done;
|
return work_done;
|
||||||
|
|
|
@ -389,7 +389,7 @@ void sctp_v6_del_protocol(void);
|
||||||
|
|
||||||
#else /* #ifdef defined(CONFIG_IPV6) */
|
#else /* #ifdef defined(CONFIG_IPV6) */
|
||||||
|
|
||||||
static inline void sctp_v6_pf_init(void) { return 0; }
|
static inline void sctp_v6_pf_init(void) { return; }
|
||||||
static inline void sctp_v6_pf_exit(void) { return; }
|
static inline void sctp_v6_pf_exit(void) { return; }
|
||||||
static inline int sctp_v6_protosw_init(void) { return 0; }
|
static inline int sctp_v6_protosw_init(void) { return 0; }
|
||||||
static inline void sctp_v6_protosw_exit(void) { return; }
|
static inline void sctp_v6_protosw_exit(void) { return; }
|
||||||
|
|
|
@ -861,7 +861,6 @@ static void p9_mux_free_request(struct p9_conn *m, struct p9_req *req)
|
||||||
|
|
||||||
static void p9_mux_flush_cb(struct p9_req *freq, void *a)
|
static void p9_mux_flush_cb(struct p9_req *freq, void *a)
|
||||||
{
|
{
|
||||||
p9_conn_req_callback cb;
|
|
||||||
int tag;
|
int tag;
|
||||||
struct p9_conn *m;
|
struct p9_conn *m;
|
||||||
struct p9_req *req, *rreq, *rptr;
|
struct p9_req *req, *rreq, *rptr;
|
||||||
|
@ -872,7 +871,6 @@ static void p9_mux_flush_cb(struct p9_req *freq, void *a)
|
||||||
freq->tcall->params.tflush.oldtag);
|
freq->tcall->params.tflush.oldtag);
|
||||||
|
|
||||||
spin_lock(&m->lock);
|
spin_lock(&m->lock);
|
||||||
cb = NULL;
|
|
||||||
tag = freq->tcall->params.tflush.oldtag;
|
tag = freq->tcall->params.tflush.oldtag;
|
||||||
req = NULL;
|
req = NULL;
|
||||||
list_for_each_entry_safe(rreq, rptr, &m->req_list, req_list) {
|
list_for_each_entry_safe(rreq, rptr, &m->req_list, req_list) {
|
||||||
|
|
|
@ -947,6 +947,8 @@ static const struct file_operations arp_seq_fops = {
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
static void atm_clip_exit_noproc(void);
|
||||||
|
|
||||||
static int __init atm_clip_init(void)
|
static int __init atm_clip_init(void)
|
||||||
{
|
{
|
||||||
neigh_table_init_no_netlink(&clip_tbl);
|
neigh_table_init_no_netlink(&clip_tbl);
|
||||||
|
@ -963,18 +965,22 @@ static int __init atm_clip_init(void)
|
||||||
struct proc_dir_entry *p;
|
struct proc_dir_entry *p;
|
||||||
|
|
||||||
p = proc_create("arp", S_IRUGO, atm_proc_root, &arp_seq_fops);
|
p = proc_create("arp", S_IRUGO, atm_proc_root, &arp_seq_fops);
|
||||||
|
if (!p) {
|
||||||
|
printk(KERN_ERR "Unable to initialize "
|
||||||
|
"/proc/net/atm/arp\n");
|
||||||
|
atm_clip_exit_noproc();
|
||||||
|
return -ENOMEM;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void __exit atm_clip_exit(void)
|
static void atm_clip_exit_noproc(void)
|
||||||
{
|
{
|
||||||
struct net_device *dev, *next;
|
struct net_device *dev, *next;
|
||||||
|
|
||||||
remove_proc_entry("arp", atm_proc_root);
|
|
||||||
|
|
||||||
unregister_inetaddr_notifier(&clip_inet_notifier);
|
unregister_inetaddr_notifier(&clip_inet_notifier);
|
||||||
unregister_netdevice_notifier(&clip_dev_notifier);
|
unregister_netdevice_notifier(&clip_dev_notifier);
|
||||||
|
|
||||||
|
@ -1005,6 +1011,13 @@ static void __exit atm_clip_exit(void)
|
||||||
clip_tbl_hook = NULL;
|
clip_tbl_hook = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void __exit atm_clip_exit(void)
|
||||||
|
{
|
||||||
|
remove_proc_entry("arp", atm_proc_root);
|
||||||
|
|
||||||
|
atm_clip_exit_noproc();
|
||||||
|
}
|
||||||
|
|
||||||
module_init(atm_clip_init);
|
module_init(atm_clip_init);
|
||||||
module_exit(atm_clip_exit);
|
module_exit(atm_clip_exit);
|
||||||
MODULE_AUTHOR("Werner Almesberger");
|
MODULE_AUTHOR("Werner Almesberger");
|
||||||
|
|
|
@ -1250,6 +1250,10 @@ static int __init lane_module_init(void)
|
||||||
struct proc_dir_entry *p;
|
struct proc_dir_entry *p;
|
||||||
|
|
||||||
p = proc_create("lec", S_IRUGO, atm_proc_root, &lec_seq_fops);
|
p = proc_create("lec", S_IRUGO, atm_proc_root, &lec_seq_fops);
|
||||||
|
if (!p) {
|
||||||
|
printk(KERN_ERR "Unable to initialize /proc/net/atm/lec\n");
|
||||||
|
return -ENOMEM;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
register_atm_ioctl(&lane_ioctl_ops);
|
register_atm_ioctl(&lane_ioctl_ops);
|
||||||
|
|
|
@ -177,10 +177,13 @@ static inline struct tnode *node_parent_rcu(struct node *node)
|
||||||
return rcu_dereference(ret);
|
return rcu_dereference(ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Same as rcu_assign_pointer
|
||||||
|
* but that macro() assumes that value is a pointer.
|
||||||
|
*/
|
||||||
static inline void node_set_parent(struct node *node, struct tnode *ptr)
|
static inline void node_set_parent(struct node *node, struct tnode *ptr)
|
||||||
{
|
{
|
||||||
rcu_assign_pointer(node->parent,
|
smp_wmb();
|
||||||
(unsigned long)ptr | NODE_TYPE(node));
|
node->parent = (unsigned long)ptr | NODE_TYPE(node);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline struct node *tnode_get_child(struct tnode *tn, unsigned int i)
|
static inline struct node *tnode_get_child(struct tnode *tn, unsigned int i)
|
||||||
|
|
|
@ -568,7 +568,7 @@ int ip_defrag(struct sk_buff *skb, u32 user)
|
||||||
|
|
||||||
IP_INC_STATS_BH(IPSTATS_MIB_REASMREQDS);
|
IP_INC_STATS_BH(IPSTATS_MIB_REASMREQDS);
|
||||||
|
|
||||||
net = skb->dev->nd_net;
|
net = skb->dev ? skb->dev->nd_net : skb->dst->dev->nd_net;
|
||||||
/* Start by cleaning up the memory. */
|
/* Start by cleaning up the memory. */
|
||||||
if (atomic_read(&net->ipv4.frags.mem) > net->ipv4.frags.high_thresh)
|
if (atomic_read(&net->ipv4.frags.mem) > net->ipv4.frags.high_thresh)
|
||||||
ip_evictor(net);
|
ip_evictor(net);
|
||||||
|
|
|
@ -735,7 +735,7 @@ new_segment:
|
||||||
if (!(psize -= copy))
|
if (!(psize -= copy))
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
if (skb->len < mss_now || (flags & MSG_OOB))
|
if (skb->len < size_goal || (flags & MSG_OOB))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (forced_push(tp)) {
|
if (forced_push(tp)) {
|
||||||
|
@ -981,7 +981,7 @@ new_segment:
|
||||||
if ((seglen -= copy) == 0 && iovlen == 0)
|
if ((seglen -= copy) == 0 && iovlen == 0)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
if (skb->len < mss_now || (flags & MSG_OOB))
|
if (skb->len < size_goal || (flags & MSG_OOB))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (forced_push(tp)) {
|
if (forced_push(tp)) {
|
||||||
|
|
|
@ -1420,7 +1420,6 @@ void ndisc_send_redirect(struct sk_buff *skb, struct neighbour *neigh,
|
||||||
u8 *opt;
|
u8 *opt;
|
||||||
int rd_len;
|
int rd_len;
|
||||||
int err;
|
int err;
|
||||||
int hlen;
|
|
||||||
u8 ha_buf[MAX_ADDR_LEN], *ha = NULL;
|
u8 ha_buf[MAX_ADDR_LEN], *ha = NULL;
|
||||||
|
|
||||||
dev = skb->dev;
|
dev = skb->dev;
|
||||||
|
@ -1491,7 +1490,6 @@ void ndisc_send_redirect(struct sk_buff *skb, struct neighbour *neigh,
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
hlen = 0;
|
|
||||||
|
|
||||||
skb_reserve(buff, LL_RESERVED_SPACE(dev));
|
skb_reserve(buff, LL_RESERVED_SPACE(dev));
|
||||||
ip6_nd_hdr(sk, buff, dev, &saddr_buf, &ipv6_hdr(skb)->saddr,
|
ip6_nd_hdr(sk, buff, dev, &saddr_buf, &ipv6_hdr(skb)->saddr,
|
||||||
|
|
|
@ -711,9 +711,11 @@ static void htb_charge_class(struct htb_sched *q, struct htb_class *cl,
|
||||||
*/
|
*/
|
||||||
static psched_time_t htb_do_events(struct htb_sched *q, int level)
|
static psched_time_t htb_do_events(struct htb_sched *q, int level)
|
||||||
{
|
{
|
||||||
int i;
|
/* don't run for longer than 2 jiffies; 2 is used instead of
|
||||||
|
1 to simplify things when jiffy is going to be incremented
|
||||||
for (i = 0; i < 500; i++) {
|
too soon */
|
||||||
|
unsigned long stop_at = jiffies + 2;
|
||||||
|
while (time_before(jiffies, stop_at)) {
|
||||||
struct htb_class *cl;
|
struct htb_class *cl;
|
||||||
long diff;
|
long diff;
|
||||||
struct rb_node *p = rb_first(&q->wait_pq[level]);
|
struct rb_node *p = rb_first(&q->wait_pq[level]);
|
||||||
|
@ -731,9 +733,8 @@ static psched_time_t htb_do_events(struct htb_sched *q, int level)
|
||||||
if (cl->cmode != HTB_CAN_SEND)
|
if (cl->cmode != HTB_CAN_SEND)
|
||||||
htb_add_to_wait_tree(q, cl, diff);
|
htb_add_to_wait_tree(q, cl, diff);
|
||||||
}
|
}
|
||||||
if (net_ratelimit())
|
/* too much load - let's continue on next jiffie */
|
||||||
printk(KERN_WARNING "htb: too many events !\n");
|
return q->now + PSCHED_TICKS_PER_SEC / HZ;
|
||||||
return q->now + PSCHED_TICKS_PER_SEC / 10;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Returns class->node+prio from id-tree where classe's id is >= id. NULL
|
/* Returns class->node+prio from id-tree where classe's id is >= id. NULL
|
||||||
|
|
|
@ -909,11 +909,10 @@ static long sock_ioctl(struct file *file, unsigned cmd, unsigned long arg)
|
||||||
if (!dlci_ioctl_hook)
|
if (!dlci_ioctl_hook)
|
||||||
request_module("dlci");
|
request_module("dlci");
|
||||||
|
|
||||||
if (dlci_ioctl_hook) {
|
mutex_lock(&dlci_ioctl_mutex);
|
||||||
mutex_lock(&dlci_ioctl_mutex);
|
if (dlci_ioctl_hook)
|
||||||
err = dlci_ioctl_hook(cmd, argp);
|
err = dlci_ioctl_hook(cmd, argp);
|
||||||
mutex_unlock(&dlci_ioctl_mutex);
|
mutex_unlock(&dlci_ioctl_mutex);
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
err = sock->ops->ioctl(sock, cmd, arg);
|
err = sock->ops->ioctl(sock, cmd, arg);
|
||||||
|
|
Loading…
Reference in New Issue