lkml.org 
[lkml]   [2010]   [Oct]   [25]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[tip:perf/urgent] x86/oprofile: Fix uninitialized variable use in debug printk
    Commit-ID:  2c78ffeca98fcd5a1dfd4a322438944506ed5e64
    Gitweb: http://git.kernel.org/tip/2c78ffeca98fcd5a1dfd4a322438944506ed5e64
    Author: Ingo Molnar <mingo@elte.hu>
    AuthorDate: Mon, 25 Oct 2010 08:41:09 +0200
    Committer: Ingo Molnar <mingo@elte.hu>
    CommitDate: Mon, 25 Oct 2010 08:46:20 +0200

    x86/oprofile: Fix uninitialized variable use in debug printk

    Stephen Rothwell reported this build warning:

    arch/x86/oprofile/op_model_amd.c: In function 'ibs_eilvt_valid':
    arch/x86/oprofile/op_model_amd.c:289: warning: 'offset' may be used uninitialized in this function

    And correctly observed that indeed the variable is used uninitialized in
    this function. The result of this bug can be a debug printk with a bogus
    value.

    Also fix a few more small details that made this function hard to read
    and which probably contributed to the bug being introduced to begin with:

    - Use more symmetric error conditions

    - Remove the !0 obfuscation

    - Add newlines to the printk output

    - Remove bogus linebreaks in printk strings and elsewhere

    Reported-by: Stephen Rothwell <sfr@canb.auug.org.au>
    Cc: Robert Richter <robert.richter@amd.com>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    LKML-Reference: <20101025115736.41d51abe.sfr@canb.auug.org.au>
    Signed-off-by: Ingo Molnar <mingo@elte.hu>
    ---
    arch/x86/oprofile/op_model_amd.c | 26 +++++++++++---------------
    1 files changed, 11 insertions(+), 15 deletions(-)

    diff --git a/arch/x86/oprofile/op_model_amd.c b/arch/x86/oprofile/op_model_amd.c
    index 42fb46f..68759e7 100644
    --- a/arch/x86/oprofile/op_model_amd.c
    +++ b/arch/x86/oprofile/op_model_amd.c
    @@ -281,29 +281,25 @@ static inline int eilvt_is_available(int offset)

    static inline int ibs_eilvt_valid(void)
    {
    - u64 val;
    int offset;
    + u64 val;

    rdmsrl(MSR_AMD64_IBSCTL, val);
    + offset = val & IBSCTL_LVT_OFFSET_MASK;
    +
    if (!(val & IBSCTL_LVT_OFFSET_VALID)) {
    - pr_err(FW_BUG "cpu %d, invalid IBS "
    - "interrupt offset %d (MSR%08X=0x%016llx)",
    - smp_processor_id(), offset,
    - MSR_AMD64_IBSCTL, val);
    + pr_err(FW_BUG "cpu %d, invalid IBS interrupt offset %d (MSR%08X=0x%016llx)\n",
    + smp_processor_id(), offset, MSR_AMD64_IBSCTL, val);
    return 0;
    }

    - offset = val & IBSCTL_LVT_OFFSET_MASK;
    -
    - if (eilvt_is_available(offset))
    - return !0;
    -
    - pr_err(FW_BUG "cpu %d, IBS interrupt offset %d "
    - "not available (MSR%08X=0x%016llx)",
    - smp_processor_id(), offset,
    - MSR_AMD64_IBSCTL, val);
    + if (!eilvt_is_available(offset)) {
    + pr_err(FW_BUG "cpu %d, IBS interrupt offset %d not available (MSR%08X=0x%016llx)\n",
    + smp_processor_id(), offset, MSR_AMD64_IBSCTL, val);
    + return 0;
    + }

    - return 0;
    + return 1;
    }

    static inline int get_ibs_offset(void)

    \
     
     \ /
      Last update: 2010-10-25 08:55    [W:0.024 / U:0.064 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site