lkml.org 
[lkml]   [2008]   [Mar]   [3]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 18/52] provide __smp_call_function
    Date
    This function is used in smp_send_stop(). It's like
    smp_call_function_mask, but always go to all online cpus,
    and does not take any locks.

    It is added to x86_64, but will soon be unified in a common file

    Signed-off-by: Glauber Costa <gcosta@redhat.com>
    ---
    arch/x86/kernel/smp_64.c | 34 +++++++++++++++++++++++++++++++++-
    1 files changed, 33 insertions(+), 1 deletions(-)

    diff --git a/arch/x86/kernel/smp_64.c b/arch/x86/kernel/smp_64.c
    index 1d8b863..aa2edb7 100644
    --- a/arch/x86/kernel/smp_64.c
    +++ b/arch/x86/kernel/smp_64.c
    @@ -322,6 +322,38 @@ void unlock_ipi_call_lock(void)
    spin_unlock_irq(&call_lock);
    }

    +static void __smp_call_function(void (*func) (void *info), void *info,
    + int nonatomic, int wait)
    +{
    + struct call_data_struct data;
    + int cpus = num_online_cpus() - 1;
    +
    + if (!cpus)
    + return;
    +
    + data.func = func;
    + data.info = info;
    + atomic_set(&data.started, 0);
    + data.wait = wait;
    + if (wait)
    + atomic_set(&data.finished, 0);
    +
    + call_data = &data;
    + mb();
    +
    + /* Send a message to all other CPUs and wait for them to respond */
    + send_IPI_allbutself(CALL_FUNCTION_VECTOR);
    +
    + /* Wait for response */
    + while (atomic_read(&data.started) != cpus)
    + cpu_relax();
    +
    + if (wait)
    + while (atomic_read(&data.finished) != cpus)
    + cpu_relax();
    +}
    +
    +
    /*
    * this function sends a 'generic call function' IPI to all other CPU
    * of the system defined in the mask.
    @@ -424,7 +456,7 @@ void smp_send_stop(void)
    /* Don't deadlock on the call lock in panic */
    nolock = !spin_trylock(&call_lock);
    local_irq_save(flags);
    - __smp_call_function_mask(cpu_online_map, stop_this_cpu, NULL, 0);
    + __smp_call_function(stop_this_cpu, NULL, 0, 0);
    if (!nolock)
    spin_unlock(&call_lock);
    disable_local_APIC();
    --
    1.5.0.6


    \
     
     \ /
      Last update: 2008-03-03 18:35    [W:0.029 / U:0.660 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site