lib/idr.c: Fix bug introduced by RCU fix
Subsystems (2)
PATCH 1/1 lib/idr.c: Fix bug introduced by RCU fix
The last patch to lib/idr.c caused a bug if idr_get_new_above() was called on an empty idr:
Usually, nodes stay on the same layer. New layers are added to the top of the tree.
The exception is idr_get_new_above() on an empty tree: In this case, the new root node is first added on layer 0, then moved upwards. p->layer was not updated.
As usual: You shall never rely on the source code comments, they will only mislead you.
--- lib/idr.c | 8 +++++++- 1 files changed, 7 insertions(+), 1 deletions(-)
lib/idr.c +7 -1
@@ -220,8 +220,14 @@ build_up:*/ while ((layers < (MAX_LEVEL -1 )) && (id >= (1 << (layers*IDR_BITS )))) { layers++; -if (!p->count) +if (!p->count) { +/* special case: if the tree is currently empty, +* then we grow the tree by moving the top node +* upwards. +*/ + p->layer++;continue ; + }if (!(new =get_from_free_list (idp))) {/* * The allocation failed. If we built part of
Signature · 1 line
1.5.6.5
Quoted 9 lines · Manfred Spraul
The last patch to
lib/idr.ccaused a bug ifidr_get_new_above()was called on an empty idr:
Usually, nodes stay on the same layer. New layers are added to the top of the tree.
The exception isidr_get_new_above()on an empty tree: In this case, the new root node is first added on layer 0, then moved upwards.p->layerwas not updated.
Quoted 4 lines
As usual: You shall never rely on the source code comments, they will only mislead you.
Signed-off-by Manfred Spraul <[email protected]>
Dave Airlie - can you get this tested and acked with the people who saw this problem with DRI?
Linus
Quoted 8 lines · Manfred Spraul
The last patch to
lib/idr.ccaused a bug ifidr_get_new_above()was called on an empty idr:
Usually, nodes stay on the same layer. New layers are added to the top of the tree.
The exception isidr_get_new_above()on an empty tree: In this case, the new root node is first added on layer 0, then moved upwards.p->layerwas not updated.
Quoted 4 lines
As usual: You shall never rely on the source code comments, they will only mislead you.
Signed-off-by Manfred Spraul <[email protected]>
I've given this a run on my dri system and it appears to work great.
Quoted 28 lines
--- lib/idr.c | 8 +++++++- 1 files changed, 7 insertions(+), 1 deletions(-)lib/idr.c +7
-2@@ -220,8 +220,14 @@ build_up:*/ while ((layers < (MAX_LEVEL -1 )) && (id >= (1 << (layers*IDR_BITS )))) { layers++; -if (!p->count) +if (!p->count) { +/* special case: if the tree is currently empty, +* then we grow the tree by moving the top node +* upwards. +*/ + p->layer++;continue ; + }if (!(new =get_from_free_list (idp))) {/* * The allocation failed. If we built part of -- 1.5.6.5