lkml.org 
[lkml]   [2017]   [Aug]   [14]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    SubjectRe: Regression in kernel 4.13-rcX for 32-bit x86 system - bisected to commit fc8dffd379ca
    From
    Date
    On 08/14/2017 02:21 AM, Thomas Gleixner wrote:
    > On Mon, 14 Aug 2017, Larry Finger wrote:
    >
    >> My Del Latitude D600 (single 32-bit CPU) shows the following locking message
    >> when booted:
    >>
    >> ============================================
    >> WARNING: possible recursive locking detected
    >> 4.12.0-rc2-00029-gfc8dffd #159 Not tainted
    >> --------------------------------------------
    >> systemd-udevd/153 is trying to acquire lock:
    >> (cpu_hotplug_lock.rw_sem){.+.+.+}, at: [<c030fc26>] stop_machine+0x16/0x30
    >>
    >> but task is already holding lock:
    >> (cpu_hotplug_lock.rw_sem){.+.+.+}, at: [<c0234353>] mtrr_add_page+0x83/0x470
    >
    > ....
    >
    >> cpus_read_lock+0x48/0x90
    >> ? stop_machine+0x16/0x30
    >> stop_machine+0x16/0x30
    >> mtrr_add_page+0x18b/0x470
    >> mtrr_add+0x3e/0x70
    >
    >> This problem was bisected to commit fc8dffd379ca ("cpu/hotplug: Convert
    >> hotplug locking to percpu rwsem"). I am very confident in the correctness of
    >> the bisection.
    >
    > Fix below.
    >
    > Thanks,
    >
    > tglx
    >
    > 8<--------------------
    >
    > diff --git a/arch/x86/kernel/cpu/mtrr/main.c b/arch/x86/kernel/cpu/mtrr/main.c
    > index c5bb63be4ba1..40d5a8a75212 100644
    > --- a/arch/x86/kernel/cpu/mtrr/main.c
    > +++ b/arch/x86/kernel/cpu/mtrr/main.c
    > @@ -237,6 +237,18 @@ set_mtrr(unsigned int reg, unsigned long base, unsigned long size, mtrr_type typ
    > stop_machine(mtrr_rendezvous_handler, &data, cpu_online_mask);
    > }
    >
    > +static void set_mtrr_cpuslocked(unsigned int reg, unsigned long base,
    > + unsigned long size, mtrr_type type)
    > +{
    > + struct set_mtrr_data data = { .smp_reg = reg,
    > + .smp_base = base,
    > + .smp_size = size,
    > + .smp_type = type
    > + };
    > +
    > + stop_machine_cpuslocked(mtrr_rendezvous_handler, &data, cpu_online_mask);
    > +}
    > +
    > static void set_mtrr_from_inactive_cpu(unsigned int reg, unsigned long base,
    > unsigned long size, mtrr_type type)
    > {
    > @@ -370,7 +382,7 @@ int mtrr_add_page(unsigned long base, unsigned long size,
    > /* Search for an empty MTRR */
    > i = mtrr_if->get_free_region(base, size, replace);
    > if (i >= 0) {
    > - set_mtrr(i, base, size, type);
    > + set_mtrr_cpuslocked(i, base, size, type);
    > if (likely(replace < 0)) {
    > mtrr_usage_table[i] = 1;
    > } else {
    > @@ -378,7 +390,7 @@ int mtrr_add_page(unsigned long base, unsigned long size,
    > if (increment)
    > mtrr_usage_table[i]++;
    > if (unlikely(replace != i)) {
    > - set_mtrr(replace, 0, 0, 0);
    > + set_mtrr_cpuslocked(replace, 0, 0, 0);
    > mtrr_usage_table[replace] = 0;
    > }
    > }
    > @@ -506,7 +518,7 @@ int mtrr_del_page(int reg, unsigned long base, unsigned long size)
    > goto out;
    > }
    > if (--mtrr_usage_table[reg] < 1)
    > - set_mtrr(reg, 0, 0, 0);
    > + set_mtrr_cpuslocked(reg, 0, 0, 0);
    > error = reg;
    > out:
    > mutex_unlock(&mtrr_mutex);
    >

    That fix works for me.

    Thanks,

    Larry

    \
     
     \ /
      Last update: 2017-08-14 21:42    [W:4.867 / U:1.548 seconds]
    ©2003-2018 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site