Daniel Walker wrote:
>
> On Tue, 2005-12-20 at 15:38 +0100, Ingo Molnar wrote:
> > * Oleg Nesterov <[email protected]> wrote:
> >
> I think there is a bug in the new plist_add() , which was in the
> original code. It doesn't properly handle the new maximum node scenario,
> or INT_MAX .
>
> If the list is 1 2 3 4
>
> and you insert 5 , you'll end up with the list 1 2 3 5 4 . Or something
> like that .
I think you are not right, please look at the code.
The code under list_for_each_entry() can break the loop only
when node->prio <= iter->prio.
void plist_add(struct pl_node *node, struct pl_head *head)
{
struct pl_node *iter;
list_for_each_entry(iter, &head->prio_list, plist.prio_list)
if (node->prio < iter->prio)
goto lt_prio;
else if (node->prio == iter->prio)
...
// So, node->prio is a new maximum, or the list was empty.
// &iter.plist == head. We don't touch iter->prio, so it
// is ok that this pl_node is fake, it is really pl_head.
// We are doing list_add_tail(), this means that new node
// will stay _after_ all other nodes.
// In this case the code below is equal to:
//
// list_add_tail(&node->plist.prio_list, &head->prio_list);
// list_add_tail(&node->plist.prio_list, &head->node_list);
lt_prio:
list_add_tail(&node->plist.prio_list, &iter->plist.prio_list);
eq_prio:
list_add_tail(&node->plist.node_list, &iter->plist.node_list);
}
Note that this also garantees FIFO ordering, which was documented
in plist.h, but was not true for plist_for_each().
Daniel, do you agree ?
Oleg.
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[Index of Archives]
[Kernel Newbies]
[Netfilter]
[Bugtraq]
[Photo]
[Stuff]
[Gimp]
[Yosemite News]
[MIPS Linux]
[ARM Linux]
[Linux Security]
[Linux RAID]
[Video 4 Linux]
[Linux for the blind]
[Linux Resources]