28 May, 2010

2 commits

  • In kernel profiling requires that we be able to allocate "local" memory
    for each cpu. Use "cpu_to_mem()" instead of "cpu_to_node()" to support
    memoryless nodes.

    Depends on the "numa_mem_id()" patch.

    Signed-off-by: Lee Schermerhorn
    Cc: Tejun Heo
    Cc: Mel Gorman
    Cc: Christoph Lameter
    Cc: Nick Piggin
    Cc: David Rientjes
    Cc: Eric Whitney
    Cc: KAMEZAWA Hiroyuki
    Cc: Ingo Molnar
    Cc: Thomas Gleixner
    Cc: "H. Peter Anvin"
    Cc: "Luck, Tony"
    Cc: Pekka Enberg
    Cc:
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Lee Schermerhorn
     
  • By the previous modification, the cpu notifier can return encapsulate
    errno value. This converts the cpu notifiers for kernel/*.c

    Signed-off-by: Akinobu Mita
    Cc: Ingo Molnar
    Cc: Peter Zijlstra
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Akinobu Mita
     

15 May, 2010

1 commit

  • If the kernel is large or the profiling step small, /proc/profile
    leaks data and readprofile shows silly stats, until readprofile -r
    has reset the buffer: clear the prof_buffer when it is vmalloc()ed.

    Signed-off-by: Hugh Dickins
    Cc: stable@kernel.org
    Signed-off-by: Linus Torvalds

    Hugh Dickins
     

21 Sep, 2009

1 commit


30 Jul, 2009

1 commit


17 Jun, 2009

1 commit

  • Callers of alloc_pages_node() can optionally specify -1 as a node to mean
    "allocate from the current node". However, a number of the callers in
    fast paths know for a fact their node is valid. To avoid a comparison and
    branch, this patch adds alloc_pages_exact_node() that only checks the nid
    with VM_BUG_ON(). Callers that know their node is valid are then
    converted.

    Signed-off-by: Mel Gorman
    Reviewed-by: Christoph Lameter
    Reviewed-by: KOSAKI Motohiro
    Reviewed-by: Pekka Enberg
    Acked-by: Paul Mundt [for the SLOB NUMA bits]
    Cc: Peter Zijlstra
    Cc: Nick Piggin
    Cc: Dave Hansen
    Cc: Lee Schermerhorn
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Mel Gorman
     

12 Jun, 2009

1 commit


10 Feb, 2009

1 commit

  • Impact: fix broken /proc/profile on UP machines

    Commit c309b917cab55799ea489d7b5f1b77025d9f8462 "cpumask: convert
    kernel/profile.c" broke profiling. prof_cpu_mask was previously
    initialized to CPU_MASK_ALL, but left uninitialized in that commit.
    We need to copy cpu_possible_mask (cpu_online_mask is not enough).

    Signed-off-by: Hugh Dickins
    Signed-off-by: Ingo Molnar

    Hugh Dickins
     

07 Jan, 2009

1 commit


01 Jan, 2009

1 commit

  • Impact: Reduce kernel memory usage, use new cpumask API.

    Avoid a static cpumask_t for prof_cpu_mask, and an on-stack cpumask_t
    in prof_cpu_mask_write_proc. Both become cpumask_var_t.

    prof_cpu_mask is only allocated when profiling is on, but the NULL
    checks are optimized out by gcc for the !CPUMASK_OFFSTACK case.

    Also removed some strange and unnecessary casts.

    Signed-off-by: Rusty Russell

    Rusty Russell
     

30 Dec, 2008

1 commit


13 Dec, 2008

1 commit

  • …t_scnprintf to take pointers.

    Impact: change calling convention of existing cpumask APIs

    Most cpumask functions started with cpus_: these have been replaced by
    cpumask_ ones which take struct cpumask pointers as expected.

    These four functions don't have good replacement names; fortunately
    they're rarely used, so we just change them over.

    Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
    Signed-off-by: Mike Travis <travis@sgi.com>
    Acked-by: Ingo Molnar <mingo@elte.hu>
    Cc: paulus@samba.org
    Cc: mingo@redhat.com
    Cc: tony.luck@intel.com
    Cc: ralf@linux-mips.org
    Cc: Greg Kroah-Hartman <gregkh@suse.de>
    Cc: cl@linux-foundation.org
    Cc: srostedt@redhat.com

    Rusty Russell
     

04 Dec, 2008

1 commit


01 Dec, 2008

1 commit


19 Nov, 2008

1 commit


18 Nov, 2008

1 commit

  • Impact: fix section mismatch warning in kernel/profile.c

    Here, profile_nop function has been called from a non-init function
    create_hash_tables(void). Which generetes a section mismatch warning.
    Previously, create_hash_tables(void) was a init function. So, removing
    __init from create_hash_tables(void) requires profile_nop to be
    non-init.

    This patch makes profile_nop function inline and fixes the
    following warning:

    WARNING: vmlinux.o(.text+0x6ebb6): Section mismatch in reference from
    the function create_hash_tables() to the function
    .init.text:profile_nop()
    The function create_hash_tables() references
    the function __init profile_nop().
    This is often because create_hash_tables lacks a __init
    annotation or the annotation of profile_nop is wrong.

    Signed-off-by: Rakib Mullick
    Signed-off-by: Ingo Molnar

    Rakib Mullick
     

31 Oct, 2008

1 commit

  • profile_init() calls in to alloc_bootmem() on early initialization. While
    alloc_bootmem() is __init, the reference itself is safe in that it is
    tucked below a !slab_is_available() check. So, flag profile_init() as
    __ref.

    Signed-off-by: Paul Mundt
    Cc: Dave Hansen
    Cc: Sam Ravnborg
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Paul Mundt
     

17 Oct, 2008

1 commit

  • Way too often, I have a machine that exhibits some kind of crappy
    behavior. The CPU looks wedged in the kernel or it is spending way too
    much system time and I wonder what is responsible.

    I try to run readprofile. But, of course, Ubuntu doesn't enable it by
    default. Dang!

    The reason we boot-time enable it is that it takes a big bufffer that we
    generally can only bootmem alloc. But, does it hurt to at least try and
    runtime-alloc it?

    To use:
    echo 2 > /sys/kernel/profile

    Then run readprofile like normal.

    This should fix the compile issue with allmodconfig. I've compile-tested
    on a bunch more configs now including a few more architectures.

    Signed-off-by: Dave Hansen
    Acked-by: Ingo Molnar
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Dave Hansen
     

26 Jul, 2008

1 commit

  • Build kernel/profile.o only if CONFIG_PROFILING is enabled.

    This makes CONFIG_PROFILING=n kernels smaller.

    As a bonus, some profile_tick() calls and one branch from schedule() are
    now eliminated with CONFIG_PROFILING=n (but I doubt these are
    measurable effects).

    This patch changes the effects of CONFIG_PROFILING=n, but I don't think
    having more than two choices would be the better choice.

    This patch also adds the name of the first parameter to the prototypes
    of profile_{hits,tick}() since I anyway had to add them for the dummy
    functions.

    Signed-off-by: Adrian Bunk
    Cc: Ingo Molnar
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Adrian Bunk
     

26 Jun, 2008

1 commit


29 Apr, 2008

1 commit


19 Apr, 2008

1 commit


09 Feb, 2008

1 commit


26 Jan, 2008

1 commit

  • Before:
    total: 25 errors, 13 warnings, 602 lines checked

    After:
    total: 0 errors, 2 warnings, 601 lines checked

    No code changed:

    kernel/profile.o:
    text data bss dec hex filename
    3048 236 24 3308 cec profile.o.before
    3048 236 24 3308 cec profile.o.after
    md5:
    2501d64748a4d350dffb11203e2a5182 profile.o.before.asm
    2501d64748a4d350dffb11203e2a5182 profile.o.after.asm

    Signed-off-by: Paolo Ciarrocchi
    Signed-off-by: Ingo Molnar

    Paolo Ciarrocchi
     

25 Oct, 2007

1 commit


17 Oct, 2007

2 commits


12 Aug, 2007

1 commit

  • gcc-4.2 is a lot more picky about its symbol handling. EXPORT_SYMBOL no
    longer works on symbols that are undefined or defined with static scope.

    For example, with CONFIG_PROFILE off, I see:

    kernel/profile.c:206: error: __ksymtab_profile_event_unregister causes a section type conflict
    kernel/profile.c:205: error: __ksymtab_profile_event_register causes a section type conflict

    This patch moves the EXPORTs inside the #ifdef CONFIG_PROFILE, so we
    only try to export symbols that are defined.

    Also, in kernel/kprobes.c there's an EXPORT_SYMBOL_GPL() for
    jprobes_return, which if CONFIG_JPROBES is undefined is a static
    inline and gives the same error.

    And in drivers/acpi/resources/rsxface.c, there's an
    ACPI_EXPORT_SYMBOPL() for a static symbol. If it's static, it's not
    accessible from outside the compilation unit, so should bot be exported.

    These three changes allow building a zx1_defconfig kernel with gcc 4.2
    on IA64.

    [akpm@linux-foundation.org: export jpobe_return properly]
    Signed-off-by: Peter Chubb
    Cc: Prasanna S Panchamukhi
    Cc: Ananth N Mavinakayanahalli
    Cc: Anil S Keshavamurthy
    Cc: "Luck, Tony"
    Cc: Len Brown
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Peter Chubb
     

22 May, 2007

1 commit

  • First thing mm.h does is including sched.h solely for can_do_mlock() inline
    function which has "current" dereference inside. By dealing with can_do_mlock()
    mm.h can be detached from sched.h which is good. See below, why.

    This patch
    a) removes unconditional inclusion of sched.h from mm.h
    b) makes can_do_mlock() normal function in mm/mlock.c
    c) exports can_do_mlock() to not break compilation
    d) adds sched.h inclusions back to files that were getting it indirectly.
    e) adds less bloated headers to some files (asm/signal.h, jiffies.h) that were
    getting them indirectly

    Net result is:
    a) mm.h users would get less code to open, read, preprocess, parse, ... if
    they don't need sched.h
    b) sched.h stops being dependency for significant number of files:
    on x86_64 allmodconfig touching sched.h results in recompile of 4083 files,
    after patch it's only 3744 (-8.3%).

    Cross-compile tested on

    all arm defconfigs, all mips defconfigs, all powerpc defconfigs,
    alpha alpha-up
    arm
    i386 i386-up i386-defconfig i386-allnoconfig
    ia64 ia64-up
    m68k
    mips
    parisc parisc-up
    powerpc powerpc-up
    s390 s390-up
    sparc sparc-up
    sparc64 sparc64-up
    um-x86_64
    x86_64 x86_64-up x86_64-defconfig x86_64-allnoconfig

    as well as my two usual configs.

    Signed-off-by: Alexey Dobriyan
    Signed-off-by: Linus Torvalds

    Alexey Dobriyan
     

10 May, 2007

1 commit

  • Since nonboot CPUs are now disabled after tasks and devices have been
    frozen and the CPU hotplug infrastructure is used for this purpose, we need
    special CPU hotplug notifications that will help the CPU-hotplug-aware
    subsystems distinguish normal CPU hotplug events from CPU hotplug events
    related to a system-wide suspend or resume operation in progress. This
    patch introduces such notifications and causes them to be used during
    suspend and resume transitions. It also changes all of the
    CPU-hotplug-aware subsystems to take these notifications into consideration
    (for now they are handled in the same way as the corresponding "normal"
    ones).

    [oleg@tv-sign.ru: cleanups]
    Signed-off-by: Rafael J. Wysocki
    Cc: Gautham R Shenoy
    Cc: Pavel Machek
    Signed-off-by: Oleg Nesterov
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Rafael J. Wysocki
     

12 Feb, 2007

1 commit

  • Bug: pnx8550 code creates directory but resets ->nlink to 1.

    create_proc_entry() et al will correctly set ->nlink for you.

    Signed-off-by: Alexey Dobriyan
    Cc: Ralf Baechle
    Cc: Benjamin Herrenschmidt
    Cc: Paul Mackerras
    Cc: Jeff Dike
    Cc: Corey Minyard
    Cc: Alan Cox
    Cc: Kyle McMartin
    Cc: Martin Schwidefsky
    Cc: Greg KH
    Cc: Ingo Molnar
    Cc: Thomas Gleixner
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Alexey Dobriyan
     

23 Jan, 2007

1 commit


12 Jan, 2007

1 commit

  • This adds the profile=kvm boot option, which enables KVM to profile VM
    exits.

    Use: "readprofile -m ./System.map | sort -n" to see the resulting
    output:

    [...]
    18246 serial_out 148.3415
    18945 native_flush_tlb 378.9000
    23618 serial_in 212.7748
    29279 __spin_unlock_irq 622.9574
    43447 native_apic_write 2068.9048
    52702 enable_8259A_irq 742.2817
    54250 vgacon_scroll 89.3740
    67394 ide_inb 6126.7273
    79514 copy_page_range 98.1654
    84868 do_wp_page 86.6000
    140266 pit_read 783.6089
    151436 ide_outb 25239.3333
    152668 native_io_delay 21809.7143
    174783 mask_and_ack_8259A 783.7803
    362404 native_set_pte_at 36240.4000
    1688747 total 0.5009

    Signed-off-by: Ingo Molnar
    Acked-by: Avi Kivity
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Ingo Molnar
     

06 Jan, 2007

1 commit


08 Dec, 2006

4 commits

  • - move some file_operations structs into the .rodata section

    - move static strings from policy_types[] array into the .rodata section

    - fix generic seq_operations usages, so that those structs may be defined
    as "const" as well

    [akpm@osdl.org: couple of fixes]
    Signed-off-by: Helge Deller
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Helge Deller
     
  • There was lots of #ifdef noise in the kernel due to hotcpu_notifier(fn,
    prio) not correctly marking 'fn' as used in the !HOTPLUG_CPU case, and thus
    generating compiler warnings of unused symbols, hence forcing people to add
    #ifdefs.

    the compiler can skip truly unused functions just fine:

    text data bss dec hex filename
    1624412 728710 3674856 6027978 5bfaca vmlinux.before
    1624412 728710 3674856 6027978 5bfaca vmlinux.after

    [akpm@osdl.org: topology.c fix]
    Signed-off-by: Ingo Molnar
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Ingo Molnar
     
  • Implement prof=sleep profiling. TASK_UNINTERRUPTIBLE sleeps will be taken
    as a profile hit, and every millisecond spent sleeping causes a profile-hit
    for the call site that initiated the sleep.

    Sample readprofile output on i386:

    306 ps2_sendbyte 1.3973
    432 call_usermodehelper_keys 1.9548
    484 ps2_command 0.6453
    790 __driver_attach 4.7879
    1593 msleep 44.2500
    3976 sync_buffer 64.1290
    4076 do_lookup 12.4648
    8587 sync_page 122.6714
    20820 total 0.0067

    (NOTE: architectures need to check whether get_wchan() can be called from
    deep within the wakeup path.)

    akpm: we need to mark more functions __sched. lock_sock(), msleep(), others..

    akpm: the contention in do_lookup() is a surprise. Presumably doing disk
    reads for directory contents while holding i_mutex.

    [akpm@osdl.org: various fixes]
    Signed-off-by: Ingo Molnar
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Ingo Molnar
     
  • Signed-off-by: Heiko Carstens
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Heiko Carstens
     

12 Oct, 2006

1 commit

  • lib/bitmap.c:bitmap_parse() is a library function that received as input a
    user buffer. This seemed to have originated from the way the write_proc
    function of the /proc filesystem operates.

    This has been reworked to not use kmalloc and eliminates a lot of
    get_user() overhead by performing one access_ok before using __get_user().

    We need to test if we are in kernel or user space (is_user) and access the
    buffer differently. We cannot use __get_user() to access kernel addresses
    in all cases, for example in architectures with separate address space for
    kernel and user.

    This function will be useful for other uses as well; for example, taking
    input for /sysfs instead of /proc, so it was changed to accept kernel
    buffers. We have this use for the Linux UWB project, as part as the
    upcoming bandwidth allocator code.

    Only a few routines used this function and they were changed too.

    Signed-off-by: Reinette Chatre
    Signed-off-by: Inaky Perez-Gonzalez
    Cc: Paul Jackson
    Cc: Joe Korty
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Reinette Chatre
     

05 Oct, 2006

1 commit

  • Maintain a per-CPU global "struct pt_regs *" variable which can be used instead
    of passing regs around manually through all ~1800 interrupt handlers in the
    Linux kernel.

    The regs pointer is used in few places, but it potentially costs both stack
    space and code to pass it around. On the FRV arch, removing the regs parameter
    from all the genirq function results in a 20% speed up of the IRQ exit path
    (ie: from leaving timer_interrupt() to leaving do_IRQ()).

    Where appropriate, an arch may override the generic storage facility and do
    something different with the variable. On FRV, for instance, the address is
    maintained in GR28 at all times inside the kernel as part of general exception
    handling.

    Having looked over the code, it appears that the parameter may be handed down
    through up to twenty or so layers of functions. Consider a USB character
    device attached to a USB hub, attached to a USB controller that posts its
    interrupts through a cascaded auxiliary interrupt controller. A character
    device driver may want to pass regs to the sysrq handler through the input
    layer which adds another few layers of parameter passing.

    I've build this code with allyesconfig for x86_64 and i386. I've runtested the
    main part of the code on FRV and i386, though I can't test most of the drivers.
    I've also done partial conversion for powerpc and MIPS - these at least compile
    with minimal configurations.

    This will affect all archs. Mostly the changes should be relatively easy.
    Take do_IRQ(), store the regs pointer at the beginning, saving the old one:

    struct pt_regs *old_regs = set_irq_regs(regs);

    And put the old one back at the end:

    set_irq_regs(old_regs);

    Don't pass regs through to generic_handle_irq() or __do_IRQ().

    In timer_interrupt(), this sort of change will be necessary:

    - update_process_times(user_mode(regs));
    - profile_tick(CPU_PROFILING, regs);
    + update_process_times(user_mode(get_irq_regs()));
    + profile_tick(CPU_PROFILING);

    I'd like to move update_process_times()'s use of get_irq_regs() into itself,
    except that i386, alone of the archs, uses something other than user_mode().

    Some notes on the interrupt handling in the drivers:

    (*) input_dev() is now gone entirely. The regs pointer is no longer stored in
    the input_dev struct.

    (*) finish_unlinks() in drivers/usb/host/ohci-q.c needs checking. It does
    something different depending on whether it's been supplied with a regs
    pointer or not.

    (*) Various IRQ handler function pointers have been moved to type
    irq_handler_t.

    Signed-Off-By: David Howells
    (cherry picked from 1b16e7ac850969f38b375e511e3fa2f474a33867 commit)

    David Howells