lkml.org 
[lkml]   [2017]   [Apr]   [6]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4/6] locking/locktorture: Fix num reader/writer corner cases
    Date
    Things can explode for locktorture if the user does combinations
    of nwriters_stress=0 nreaders_stress=0. Fix this by not assuming
    we always want to torture writer threads.

    Signed-off-by: Davidlohr Bueso <dbueso@suse.de>
    ---
    kernel/locking/locktorture.c | 76 +++++++++++++++++++++++++-------------------
    1 file changed, 44 insertions(+), 32 deletions(-)

    diff --git a/kernel/locking/locktorture.c b/kernel/locking/locktorture.c
    index 0ef5510f8742..a68167803eee 100644
    --- a/kernel/locking/locktorture.c
    +++ b/kernel/locking/locktorture.c
    @@ -715,8 +715,7 @@ static void __torture_print_stats(char *page,
    {
    bool fail = 0;
    int i, n_stress;
    - long max = 0;
    - long min = statp[0].n_lock_acquired;
    + long max = 0, min = statp ? statp[0].n_lock_acquired : 0;
    long long sum = 0;

    n_stress = write ? cxt.nrealwriters_stress : cxt.nrealreaders_stress;
    @@ -823,7 +822,7 @@ static void lock_torture_cleanup(void)
    * such, only perform the underlying torture-specific cleanups,
    * and avoid anything related to locktorture.
    */
    - if (!cxt.lwsa)
    + if (!cxt.lwsa && !cxt.lrsa)
    goto end;

    if (writer_tasks) {
    @@ -898,6 +897,13 @@ static int __init lock_torture_init(void)
    firsterr = -EINVAL;
    goto unwind;
    }
    +
    + if (nwriters_stress == 0 && nreaders_stress == 0) {
    + pr_alert("lock-torture: must run at least one locking thread\n");
    + firsterr = -EINVAL;
    + goto unwind;
    + }
    +
    if (cxt.cur_ops->init)
    cxt.cur_ops->init();

    @@ -921,17 +927,19 @@ static int __init lock_torture_init(void)
    #endif

    /* Initialize the statistics so that each run gets its own numbers. */
    + if (nwriters_stress) {
    + lock_is_write_held = 0;
    + cxt.lwsa = kmalloc(sizeof(*cxt.lwsa) * cxt.nrealwriters_stress, GFP_KERNEL);
    + if (cxt.lwsa == NULL) {
    + VERBOSE_TOROUT_STRING("cxt.lwsa: Out of memory");
    + firsterr = -ENOMEM;
    + goto unwind;
    + }

    - lock_is_write_held = 0;
    - cxt.lwsa = kmalloc(sizeof(*cxt.lwsa) * cxt.nrealwriters_stress, GFP_KERNEL);
    - if (cxt.lwsa == NULL) {
    - VERBOSE_TOROUT_STRING("cxt.lwsa: Out of memory");
    - firsterr = -ENOMEM;
    - goto unwind;
    - }
    - for (i = 0; i < cxt.nrealwriters_stress; i++) {
    - cxt.lwsa[i].n_lock_fail = 0;
    - cxt.lwsa[i].n_lock_acquired = 0;
    + for (i = 0; i < cxt.nrealwriters_stress; i++) {
    + cxt.lwsa[i].n_lock_fail = 0;
    + cxt.lwsa[i].n_lock_acquired = 0;
    + }
    }

    if (cxt.cur_ops->readlock) {
    @@ -948,19 +956,21 @@ static int __init lock_torture_init(void)
    cxt.nrealreaders_stress = cxt.nrealwriters_stress;
    }

    - lock_is_read_held = 0;
    - cxt.lrsa = kmalloc(sizeof(*cxt.lrsa) * cxt.nrealreaders_stress, GFP_KERNEL);
    - if (cxt.lrsa == NULL) {
    - VERBOSE_TOROUT_STRING("cxt.lrsa: Out of memory");
    - firsterr = -ENOMEM;
    - kfree(cxt.lwsa);
    - cxt.lwsa = NULL;
    - goto unwind;
    - }
    -
    - for (i = 0; i < cxt.nrealreaders_stress; i++) {
    - cxt.lrsa[i].n_lock_fail = 0;
    - cxt.lrsa[i].n_lock_acquired = 0;
    + if (nreaders_stress) {
    + lock_is_read_held = 0;
    + cxt.lrsa = kmalloc(sizeof(*cxt.lrsa) * cxt.nrealreaders_stress, GFP_KERNEL);
    + if (cxt.lrsa == NULL) {
    + VERBOSE_TOROUT_STRING("cxt.lrsa: Out of memory");
    + firsterr = -ENOMEM;
    + kfree(cxt.lwsa);
    + cxt.lwsa = NULL;
    + goto unwind;
    + }
    +
    + for (i = 0; i < cxt.nrealreaders_stress; i++) {
    + cxt.lrsa[i].n_lock_fail = 0;
    + cxt.lrsa[i].n_lock_acquired = 0;
    + }
    }
    }

    @@ -990,12 +1000,14 @@ static int __init lock_torture_init(void)
    goto unwind;
    }

    - writer_tasks = kzalloc(cxt.nrealwriters_stress * sizeof(writer_tasks[0]),
    - GFP_KERNEL);
    - if (writer_tasks == NULL) {
    - VERBOSE_TOROUT_ERRSTRING("writer_tasks: Out of memory");
    - firsterr = -ENOMEM;
    - goto unwind;
    + if (nwriters_stress) {
    + writer_tasks = kzalloc(cxt.nrealwriters_stress * sizeof(writer_tasks[0]),
    + GFP_KERNEL);
    + if (writer_tasks == NULL) {
    + VERBOSE_TOROUT_ERRSTRING("writer_tasks: Out of memory");
    + firsterr = -ENOMEM;
    + goto unwind;
    + }
    }

    if (cxt.cur_ops->readlock) {
    --
    2.12.0
    \
     
     \ /
      Last update: 2017-04-06 10:54    [W:4.921 / U:0.176 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site