lkml.org 
[lkml]   [2016]   [Feb]   [22]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[patch V3 16/28] x86/perf/intel_uncore: Make it modular
    Now that we have a proper cleanup all over the place, it's simple to make this
    a modular driver.

    Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
    ---
    arch/x86/Kconfig | 6 ++----
    arch/x86/Kconfig.perf | 16 ++++++++++++++++
    arch/x86/kernel/cpu/Makefile | 3 ++-
    arch/x86/kernel/cpu/perf_event_intel_uncore.c | 24 ++++++++++++++++++------
    4 files changed, 38 insertions(+), 11 deletions(-)

    --- a/arch/x86/Kconfig
    +++ b/arch/x86/Kconfig
    @@ -160,10 +160,6 @@ config INSTRUCTION_DECODER
    def_bool y
    depends on KPROBES || PERF_EVENTS || UPROBES

    -config PERF_EVENTS_INTEL_UNCORE
    - def_bool y
    - depends on PERF_EVENTS && CPU_SUP_INTEL && PCI
    -
    config OUTPUT_FORMAT
    string
    default "elf32-i386" if X86_32
    @@ -1039,6 +1035,8 @@ config X86_THERMAL_VECTOR
    def_bool y
    depends on X86_MCE_INTEL

    +source "arch/x86/Kconfig.perf"
    +
    config X86_LEGACY_VM86
    bool "Legacy VM86 support"
    default n
    --- /dev/null
    +++ b/arch/x86/Kconfig.perf
    @@ -0,0 +1,16 @@
    +menu "Performance monitoring"
    +
    +config PERF_EVENTS_INTEL_UNCORE
    + tristate "Intel uncore performance events"
    + depends on PERF_EVENTS && CPU_SUP_INTEL && PCI
    + default y
    + ---help---
    + Include support for Intel uncore performance events. These are
    + available on NehalemEX and more modern processors.
    +
    + Note: Selecting 'm' might break existing setups as the drivers
    + lack the autoprobe/load magic. If you need them select: y.
    +
    + If unsure say y.
    +
    +endmenu
    --- a/arch/x86/kernel/cpu/Makefile
    +++ b/arch/x86/kernel/cpu/Makefile
    @@ -43,7 +43,8 @@ obj-$(CONFIG_CPU_SUP_INTEL) += perf_eve
    obj-$(CONFIG_CPU_SUP_INTEL) += perf_event_intel_pt.o perf_event_intel_bts.o
    obj-$(CONFIG_CPU_SUP_INTEL) += perf_event_intel_cstate.o

    -obj-$(CONFIG_PERF_EVENTS_INTEL_UNCORE) += perf_event_intel_uncore.o \
    +obj-$(CONFIG_PERF_EVENTS_INTEL_UNCORE) += perf_event_intel_uncores.o
    +perf_event_intel_uncores-objs := perf_event_intel_uncore.o \
    perf_event_intel_uncore_snb.o \
    perf_event_intel_uncore_snbep.o \
    perf_event_intel_uncore_nhmex.o
    --- a/arch/x86/kernel/cpu/perf_event_intel_uncore.c
    +++ b/arch/x86/kernel/cpu/perf_event_intel_uncore.c
    @@ -21,6 +21,8 @@ static struct event_constraint uncore_co
    struct event_constraint uncore_constraint_empty =
    EVENT_CONSTRAINT(0, 0, 0);

    +MODULE_LICENSE("GPL");
    +
    static int uncore_pcibus_to_physid(struct pci_bus *bus)
    {
    struct pci2phy_map *map;
    @@ -754,7 +756,7 @@ static void uncore_pmu_unregister(struct
    pmu->registered = false;
    }

    -static void __init __uncore_exit_boxes(struct intel_uncore_type *type, int cpu)
    +static void __uncore_exit_boxes(struct intel_uncore_type *type, int cpu)
    {
    struct intel_uncore_pmu *pmu = type->pmus;
    struct intel_uncore_box *box;
    @@ -770,7 +772,7 @@ static void __init __uncore_exit_boxes(s
    }
    }

    -static void __init uncore_exit_boxes(void *dummy)
    +static void uncore_exit_boxes(void *dummy)
    {
    struct intel_uncore_type **types;

    @@ -787,7 +789,7 @@ static void uncore_free_boxes(struct int
    kfree(pmu->boxes);
    }

    -static void __init uncore_type_exit(struct intel_uncore_type *type)
    +static void uncore_type_exit(struct intel_uncore_type *type)
    {
    struct intel_uncore_pmu *pmu = type->pmus;
    int i;
    @@ -804,7 +806,7 @@ static void __init uncore_type_exit(stru
    type->events_group = NULL;
    }

    -static void __init uncore_types_exit(struct intel_uncore_type **types)
    +static void uncore_types_exit(struct intel_uncore_type **types)
    {
    for (; *types; types++)
    uncore_type_exit(*types);
    @@ -1060,7 +1062,7 @@ static int __init uncore_pci_init(void)
    return ret;
    }

    -static void __init uncore_pci_exit(void)
    +static void uncore_pci_exit(void)
    {
    if (pcidrv_registered) {
    pcidrv_registered = false;
    @@ -1404,4 +1406,14 @@ static int __init intel_uncore_init(void
    cpu_notifier_register_done();
    return ret;
    }
    -device_initcall(intel_uncore_init);
    +module_init(intel_uncore_init);
    +
    +static void __exit intel_uncore_exit(void)
    +{
    + cpu_notifier_register_done();
    + __unregister_cpu_notifier(&uncore_cpu_nb);
    + uncore_types_exit(uncore_msr_uncores);
    + uncore_pci_exit();
    + cpu_notifier_register_done();
    +}
    +module_exit(intel_uncore_exit);

    \
     
     \ /
      Last update: 2016-02-22 23:41    [W:9.255 / U:0.144 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site