On Sun, Jul 4, 2010 at 6:16 PM, Johannes Weiner <hannes@xxxxxxxxxxx> wrote: > On Sun, Jul 04, 2010 at 05:22:33PM +0800, Bob Liu wrote: >> Since a list entry may be removed, so use list_for_each_entry_safe >> instead of list_for_each_entry. >> >> Signed-off-by: Bob Liu <lliubbo@xxxxxxxxx> >> --- >> mm/slob.c | 4 ++-- >> 1 files changed, 2 insertions(+), 2 deletions(-) >> >> diff --git a/mm/slob.c b/mm/slob.c >> index 3f19a34..e2af18b 100644 >> --- a/mm/slob.c >> +++ b/mm/slob.c >> @@ -320,7 +320,7 @@ static void *slob_page_alloc(struct slob_page *sp, size_t size, int align) >> */ >> static void *slob_alloc(size_t size, gfp_t gfp, int align, int node) >> { >> - struct slob_page *sp; >> + struct slob_page *sp, *tmp; >> struct list_head *prev; >> struct list_head *slob_list; >> slob_t *b = NULL; >> @@ -335,7 +335,7 @@ static void *slob_alloc(size_t size, gfp_t gfp, int align, int node) >> >> spin_lock_irqsave(&slob_lock, flags); >> /* Iterate through each partially free page, try to find room */ >> - list_for_each_entry(sp, slob_list, list) { >> + list_for_each_entry_safe(sp, tmp, slob_list, list) { >> #ifdef CONFIG_NUMA > > sp's list head is only modified if an allocation was successful, but > then the iteration stops as well. So I see no reason for your patch. > Did I overlook something? > Sorry, I am wrong. Please ignore this patch. Thanks for your comment. But It seems that the slob_list maybe have some member's next pointer NULL. Because I triggered a NULL pointer access error. And after I changed spin_lock_irqsave(&slob_lock, flags) before set slob_list. This bug seems disappeared. I will resend a patch, Please review. Thanks! -- Regards, --Bob -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@xxxxxxxxxx For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href