Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

lib/test_rhashtable: Make test_insert_dup() allocate its hash table dynamically

The test_insert_dup() function from lib/test_rhashtable.c passes a
pointer to a stack object to rhltable_init(). Allocate the hash table
dynamically to avoid that the following is reported with object
debugging enabled:

ODEBUG: object (ptrval) is on stack (ptrval), but NOT annotated.
WARNING: CPU: 0 PID: 1 at lib/debugobjects.c:368 __debug_object_init+0x312/0x480
Modules linked in:
EIP: __debug_object_init+0x312/0x480
Call Trace:
? debug_object_init+0x1a/0x20
? __init_work+0x16/0x30
? rhashtable_init+0x1e1/0x460
? sched_clock_cpu+0x57/0xe0
? rhltable_init+0xb/0x20
? test_insert_dup+0x32/0x20f
? trace_hardirqs_on+0x38/0xf0
? ida_dump+0x10/0x10
? jhash+0x130/0x130
? my_hashfn+0x30/0x30
? test_rht_init+0x6aa/0xab4
? ida_dump+0x10/0x10
? test_rhltable+0xc5c/0xc5c
? do_one_initcall+0x67/0x28e
? trace_hardirqs_off+0x22/0xe0
? restore_all_kernel+0xf/0x70
? trace_hardirqs_on_thunk+0xc/0x10
? restore_all_kernel+0xf/0x70
? kernel_init_freeable+0x142/0x213
? rest_init+0x230/0x230
? kernel_init+0x10/0x110
? schedule_tail_wrapper+0x9/0xc
? ret_from_fork+0x19/0x24

Cc: Thomas Graf <tgraf@suug.ch>
Cc: Herbert Xu <herbert@gondor.apana.org.au>
Cc: netdev@vger.kernel.org
Cc: linux-kernel@vger.kernel.org
Signed-off-by: Bart Van Assche <bvanassche@acm.org>
Acked-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Bart Van Assche and committed by
David S. Miller
fc42a689 91c52470

+15 -8
+15 -8
lib/test_rhashtable.c
··· 541 541 static int __init test_insert_dup(struct test_obj_rhl *rhl_test_objects, 542 542 int cnt, bool slow) 543 543 { 544 - struct rhltable rhlt; 544 + struct rhltable *rhlt; 545 545 unsigned int i, ret; 546 546 const char *key; 547 547 int err = 0; 548 548 549 - err = rhltable_init(&rhlt, &test_rht_params_dup); 550 - if (WARN_ON(err)) 549 + rhlt = kmalloc(sizeof(*rhlt), GFP_KERNEL); 550 + if (WARN_ON(!rhlt)) 551 + return -EINVAL; 552 + 553 + err = rhltable_init(rhlt, &test_rht_params_dup); 554 + if (WARN_ON(err)) { 555 + kfree(rhlt); 551 556 return err; 557 + } 552 558 553 559 for (i = 0; i < cnt; i++) { 554 560 rhl_test_objects[i].value.tid = i; 555 - key = rht_obj(&rhlt.ht, &rhl_test_objects[i].list_node.rhead); 561 + key = rht_obj(&rhlt->ht, &rhl_test_objects[i].list_node.rhead); 556 562 key += test_rht_params_dup.key_offset; 557 563 558 564 if (slow) { 559 - err = PTR_ERR(rhashtable_insert_slow(&rhlt.ht, key, 565 + err = PTR_ERR(rhashtable_insert_slow(&rhlt->ht, key, 560 566 &rhl_test_objects[i].list_node.rhead)); 561 567 if (err == -EAGAIN) 562 568 err = 0; 563 569 } else 564 - err = rhltable_insert(&rhlt, 570 + err = rhltable_insert(rhlt, 565 571 &rhl_test_objects[i].list_node, 566 572 test_rht_params_dup); 567 573 if (WARN(err, "error %d on element %d/%d (%s)\n", err, i, cnt, slow? "slow" : "fast")) 568 574 goto skip_print; 569 575 } 570 576 571 - ret = print_ht(&rhlt); 577 + ret = print_ht(rhlt); 572 578 WARN(ret != cnt, "missing rhltable elements (%d != %d, %s)\n", ret, cnt, slow? "slow" : "fast"); 573 579 574 580 skip_print: 575 - rhltable_destroy(&rhlt); 581 + rhltable_destroy(rhlt); 582 + kfree(rhlt); 576 583 577 584 return 0; 578 585 }