lkml.org 
[lkml]   [2018]   [May]   [28]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.16 067/272] genirq/affinity: Dont return with empty affinity masks on error
    Date
    4.16-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Thomas Gleixner <tglx@linutronix.de>

    [ Upstream commit 0211e12dd0a5385ecffd3557bc570dbad7fcf245 ]

    When the allocation of node_to_possible_cpumask fails, then
    irq_create_affinity_masks() returns with a pointer to the empty affinity
    masks array, which will cause malfunction.

    Reorder the allocations so the masks array allocation comes last and every
    failure path returns NULL.

    Fixes: 9a0ef98e186d ("genirq/affinity: Assign vectors to all present CPUs")
    Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
    Cc: Christoph Hellwig <hch@infradead.org>
    Cc: Ming Lei <ming.lei@redhat.com>
    Signed-off-by: Sasha Levin <alexander.levin@microsoft.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    kernel/irq/affinity.c | 15 ++++++++-------
    1 file changed, 8 insertions(+), 7 deletions(-)

    --- a/kernel/irq/affinity.c
    +++ b/kernel/irq/affinity.c
    @@ -108,7 +108,7 @@ irq_create_affinity_masks(int nvecs, con
    int affv = nvecs - affd->pre_vectors - affd->post_vectors;
    int last_affv = affv + affd->pre_vectors;
    nodemask_t nodemsk = NODE_MASK_NONE;
    - struct cpumask *masks;
    + struct cpumask *masks = NULL;
    cpumask_var_t nmsk, *node_to_possible_cpumask;

    /*
    @@ -121,13 +121,13 @@ irq_create_affinity_masks(int nvecs, con
    if (!zalloc_cpumask_var(&nmsk, GFP_KERNEL))
    return NULL;

    - masks = kcalloc(nvecs, sizeof(*masks), GFP_KERNEL);
    - if (!masks)
    - goto out;
    -
    node_to_possible_cpumask = alloc_node_to_possible_cpumask();
    if (!node_to_possible_cpumask)
    - goto out;
    + goto outcpumsk;
    +
    + masks = kcalloc(nvecs, sizeof(*masks), GFP_KERNEL);
    + if (!masks)
    + goto outnodemsk;

    /* Fill out vectors at the beginning that don't need affinity */
    for (curvec = 0; curvec < affd->pre_vectors; curvec++)
    @@ -192,8 +192,9 @@ done:
    /* Fill out vectors at the end that don't need affinity */
    for (; curvec < nvecs; curvec++)
    cpumask_copy(masks + curvec, irq_default_affinity);
    +outnodemsk:
    free_node_to_possible_cpumask(node_to_possible_cpumask);
    -out:
    +outcpumsk:
    free_cpumask_var(nmsk);
    return masks;
    }

    \
     
     \ /
      Last update: 2018-05-28 13:08    [W:4.023 / U:0.496 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site