aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/rt2x00/rt2x00crypto.c
diff options
context:
space:
mode:
authorGlenn Elliott <gelliott@cs.unc.edu>2012-09-11 13:48:36 -0400
committerGlenn Elliott <gelliott@cs.unc.edu>2012-09-11 13:48:36 -0400
commitdc4e192937c56771ace227075e10b97f42eedae4 (patch)
treeb2ef543a6629726237234fe85423eda1518ec9f2 /drivers/net/wireless/rt2x00/rt2x00crypto.c
parentd3c32e91e3fce2a57083a734efae6d9de06ec02f (diff)
Fixed bug in edf_higher_prio().prop/robust-tie-break
The rewrite of edf_higher_prio() introduced a bug. When ALL other tie-breaks fail (even PIDs are equal), edf_higher_prio() is supposed to prioritize the task that has an inherited priority. (At least one task must have an inherited priority, due to checks earlier in the function.) However, the rewrite does the inheritance check on the inherited priority (second_task), not the original task (second). This bug can cause G-EDF to fall into an infinite loop in check_for_preemptions() as scheduling decisions thrash.
Diffstat (limited to 'drivers/net/wireless/rt2x00/rt2x00crypto.c')
0 files changed, 0 insertions, 0 deletions
n> sk_buff *skb) { return xfrm6_rcv_spi(skb, skb_network_header(skb)[IP6CB(skb)->nhoff], 0); } EXPORT_SYMBOL(xfrm6_rcv); int xfrm6_input_addr(struct sk_buff *skb, xfrm_address_t *daddr, xfrm_address_t *saddr, u8 proto) { struct net *net = dev_net(skb->dev); struct xfrm_state *x = NULL; int i = 0; /* Allocate new secpath or COW existing one. */ if (!skb->sp || atomic_read(&skb->sp->refcnt) != 1) { struct sec_path *sp; sp = secpath_dup(skb->sp); if (!sp) { XFRM_INC_STATS(net, LINUX_MIB_XFRMINERROR); goto drop; } if (skb->sp) secpath_put(skb->sp); skb->sp = sp; } if (1 + skb->sp->len == XFRM_MAX_DEPTH) { XFRM_INC_STATS(net, LINUX_MIB_XFRMINBUFFERERROR); goto drop; } for (i = 0; i < 3; i++) { xfrm_address_t *dst, *src; switch (i) { case 0: dst = daddr; src = saddr; break; case 1: /* lookup state with wild-card source address */ dst = daddr; src = (xfrm_address_t *)&in6addr_any; break; default: /* lookup state with wild-card addresses */ dst = (xfrm_address_t *)&in6addr_any; src = (xfrm_address_t *)&in6addr_any; break; } x = xfrm_state_lookup_byaddr(net, skb->mark, dst, src, proto, AF_INET6); if (!x) continue; spin_lock(&x->lock); if ((!i || (x->props.flags & XFRM_STATE_WILDRECV)) && likely(x->km.state == XFRM_STATE_VALID) && !xfrm_state_check_expire(x)) { spin_unlock(&x->lock); if (x->type->input(x, skb) > 0) { /* found a valid state */ break; } } else spin_unlock(&x->lock); xfrm_state_put(x); x = NULL; } if (!x) {