lkml.org 
[lkml]   [2020]   [Dec]   [1]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.19 26/57] perf/x86: fix sysfs type mismatches
    Date
    From: Sami Tolvanen <samitolvanen@google.com>

    [ Upstream commit ebd19fc372e3e78bf165f230e7c084e304441c08 ]

    This change switches rapl to use PMU_FORMAT_ATTR, and fixes two other
    macros to use device_attribute instead of kobj_attribute to avoid
    callback type mismatches that trip indirect call checking with Clang's
    Control-Flow Integrity (CFI).

    Reported-by: Sedat Dilek <sedat.dilek@gmail.com>
    Signed-off-by: Sami Tolvanen <samitolvanen@google.com>
    Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
    Reviewed-by: Kees Cook <keescook@chromium.org>
    Link: https://lkml.kernel.org/r/20201113183126.1239404-1-samitolvanen@google.com
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    arch/x86/events/intel/cstate.c | 6 +++---
    arch/x86/events/intel/rapl.c | 14 +-------------
    arch/x86/events/intel/uncore.c | 4 ++--
    arch/x86/events/intel/uncore.h | 12 ++++++------
    4 files changed, 12 insertions(+), 24 deletions(-)

    diff --git a/arch/x86/events/intel/cstate.c b/arch/x86/events/intel/cstate.c
    index 4a650eb3d94a3..3b3cd12c06920 100644
    --- a/arch/x86/events/intel/cstate.c
    +++ b/arch/x86/events/intel/cstate.c
    @@ -100,14 +100,14 @@
    MODULE_LICENSE("GPL");

    #define DEFINE_CSTATE_FORMAT_ATTR(_var, _name, _format) \
    -static ssize_t __cstate_##_var##_show(struct kobject *kobj, \
    - struct kobj_attribute *attr, \
    +static ssize_t __cstate_##_var##_show(struct device *dev, \
    + struct device_attribute *attr, \
    char *page) \
    { \
    BUILD_BUG_ON(sizeof(_format) >= PAGE_SIZE); \
    return sprintf(page, _format "\n"); \
    } \
    -static struct kobj_attribute format_attr_##_var = \
    +static struct device_attribute format_attr_##_var = \
    __ATTR(_name, 0444, __cstate_##_var##_show, NULL)

    static ssize_t cstate_get_attr_cpumask(struct device *dev,
    diff --git a/arch/x86/events/intel/rapl.c b/arch/x86/events/intel/rapl.c
    index 2413169ce3627..bc348663da94d 100644
    --- a/arch/x86/events/intel/rapl.c
    +++ b/arch/x86/events/intel/rapl.c
    @@ -115,18 +115,6 @@ static const char *const rapl_domain_names[NR_RAPL_DOMAINS] __initconst = {
    * any other bit is reserved
    */
    #define RAPL_EVENT_MASK 0xFFULL
    -
    -#define DEFINE_RAPL_FORMAT_ATTR(_var, _name, _format) \
    -static ssize_t __rapl_##_var##_show(struct kobject *kobj, \
    - struct kobj_attribute *attr, \
    - char *page) \
    -{ \
    - BUILD_BUG_ON(sizeof(_format) >= PAGE_SIZE); \
    - return sprintf(page, _format "\n"); \
    -} \
    -static struct kobj_attribute format_attr_##_var = \
    - __ATTR(_name, 0444, __rapl_##_var##_show, NULL)
    -
    #define RAPL_CNTR_WIDTH 32

    #define RAPL_EVENT_ATTR_STR(_name, v, str) \
    @@ -548,7 +536,7 @@ static struct attribute_group rapl_pmu_events_group = {
    .attrs = NULL, /* patched at runtime */
    };

    -DEFINE_RAPL_FORMAT_ATTR(event, event, "config:0-7");
    +PMU_FORMAT_ATTR(event, "config:0-7");
    static struct attribute *rapl_formats_attr[] = {
    &format_attr_event.attr,
    NULL,
    diff --git a/arch/x86/events/intel/uncore.c b/arch/x86/events/intel/uncore.c
    index 7098b9b05d566..2f4ed5aa08bad 100644
    --- a/arch/x86/events/intel/uncore.c
    +++ b/arch/x86/events/intel/uncore.c
    @@ -90,8 +90,8 @@ end:
    return map;
    }

    -ssize_t uncore_event_show(struct kobject *kobj,
    - struct kobj_attribute *attr, char *buf)
    +ssize_t uncore_event_show(struct device *dev,
    + struct device_attribute *attr, char *buf)
    {
    struct uncore_event_desc *event =
    container_of(attr, struct uncore_event_desc, attr);
    diff --git a/arch/x86/events/intel/uncore.h b/arch/x86/events/intel/uncore.h
    index 40e040ec31b50..0fc86ac73b511 100644
    --- a/arch/x86/events/intel/uncore.h
    +++ b/arch/x86/events/intel/uncore.h
    @@ -133,7 +133,7 @@ struct intel_uncore_box {
    #define UNCORE_BOX_FLAG_CTL_OFFS8 1 /* event config registers are 8-byte apart */

    struct uncore_event_desc {
    - struct kobj_attribute attr;
    + struct device_attribute attr;
    const char *config;
    };

    @@ -153,8 +153,8 @@ struct pci2phy_map {

    struct pci2phy_map *__find_pci2phy_map(int segment);

    -ssize_t uncore_event_show(struct kobject *kobj,
    - struct kobj_attribute *attr, char *buf);
    +ssize_t uncore_event_show(struct device *dev,
    + struct device_attribute *attr, char *buf);

    #define INTEL_UNCORE_EVENT_DESC(_name, _config) \
    { \
    @@ -163,14 +163,14 @@ ssize_t uncore_event_show(struct kobject *kobj,
    }

    #define DEFINE_UNCORE_FORMAT_ATTR(_var, _name, _format) \
    -static ssize_t __uncore_##_var##_show(struct kobject *kobj, \
    - struct kobj_attribute *attr, \
    +static ssize_t __uncore_##_var##_show(struct device *dev, \
    + struct device_attribute *attr, \
    char *page) \
    { \
    BUILD_BUG_ON(sizeof(_format) >= PAGE_SIZE); \
    return sprintf(page, _format "\n"); \
    } \
    -static struct kobj_attribute format_attr_##_var = \
    +static struct device_attribute format_attr_##_var = \
    __ATTR(_name, 0444, __uncore_##_var##_show, NULL)

    static inline bool uncore_pmc_fixed(int idx)
    --
    2.27.0


    \
     
     \ /
      Last update: 2020-12-01 10:06    [W:4.528 / U:0.088 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site