diff options
author | Bart Van Assche <bvanassche@acm.org> | 2019-01-30 13:42:30 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2019-01-31 12:36:52 -0500 |
commit | fc42a689c4c097859e5bd37b5ea11b60dc426df6 (patch) | |
tree | 9af66e6d09dc2da23990b8f475176170297d1fab | |
parent | 91c524708de6207f59dd3512518d8a1c7b434ee3 (diff) |
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>
-rw-r--r-- | lib/test_rhashtable.c | 23 |
1 files changed, 15 insertions, 8 deletions
diff --git a/lib/test_rhashtable.c b/lib/test_rhashtable.c index 6a8ac7626797..e52f8cafe227 100644 --- a/lib/test_rhashtable.c +++ b/lib/test_rhashtable.c | |||
@@ -541,38 +541,45 @@ static unsigned int __init print_ht(struct rhltable *rhlt) | |||
541 | static int __init test_insert_dup(struct test_obj_rhl *rhl_test_objects, | 541 | static int __init test_insert_dup(struct test_obj_rhl *rhl_test_objects, |
542 | int cnt, bool slow) | 542 | int cnt, bool slow) |
543 | { | 543 | { |
544 | struct rhltable rhlt; | 544 | struct rhltable *rhlt; |
545 | unsigned int i, ret; | 545 | unsigned int i, ret; |
546 | const char *key; | 546 | const char *key; |
547 | int err = 0; | 547 | int err = 0; |
548 | 548 | ||
549 | err = rhltable_init(&rhlt, &test_rht_params_dup); | 549 | rhlt = kmalloc(sizeof(*rhlt), GFP_KERNEL); |
550 | if (WARN_ON(err)) | 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 | return err; | 556 | return err; |
557 | } | ||
552 | 558 | ||
553 | for (i = 0; i < cnt; i++) { | 559 | for (i = 0; i < cnt; i++) { |
554 | rhl_test_objects[i].value.tid = i; | 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 | key += test_rht_params_dup.key_offset; | 562 | key += test_rht_params_dup.key_offset; |
557 | 563 | ||
558 | if (slow) { | 564 | if (slow) { |
559 | err = PTR_ERR(rhashtable_insert_slow(&rhlt.ht, key, | 565 | err = PTR_ERR(rhashtable_insert_slow(&rhlt->ht, key, |
560 | &rhl_test_objects[i].list_node.rhead)); | 566 | &rhl_test_objects[i].list_node.rhead)); |
561 | if (err == -EAGAIN) | 567 | if (err == -EAGAIN) |
562 | err = 0; | 568 | err = 0; |
563 | } else | 569 | } else |
564 | err = rhltable_insert(&rhlt, | 570 | err = rhltable_insert(rhlt, |
565 | &rhl_test_objects[i].list_node, | 571 | &rhl_test_objects[i].list_node, |
566 | test_rht_params_dup); | 572 | test_rht_params_dup); |
567 | if (WARN(err, "error %d on element %d/%d (%s)\n", err, i, cnt, slow? "slow" : "fast")) | 573 | if (WARN(err, "error %d on element %d/%d (%s)\n", err, i, cnt, slow? "slow" : "fast")) |
568 | goto skip_print; | 574 | goto skip_print; |
569 | } | 575 | } |
570 | 576 | ||
571 | ret = print_ht(&rhlt); | 577 | ret = print_ht(rhlt); |
572 | WARN(ret != cnt, "missing rhltable elements (%d != %d, %s)\n", ret, cnt, slow? "slow" : "fast"); | 578 | WARN(ret != cnt, "missing rhltable elements (%d != %d, %s)\n", ret, cnt, slow? "slow" : "fast"); |
573 | 579 | ||
574 | skip_print: | 580 | skip_print: |
575 | rhltable_destroy(&rhlt); | 581 | rhltable_destroy(rhlt); |
582 | kfree(rhlt); | ||
576 | 583 | ||
577 | return 0; | 584 | return 0; |
578 | } | 585 | } |