]> git.proxmox.com Git - mirror_ubuntu-eoan-kernel.git/commitdiff
Merge branch 'x86-apic-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git...
authorLinus Torvalds <torvalds@linux-foundation.org>
Mon, 13 Aug 2018 20:31:08 +0000 (13:31 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Mon, 13 Aug 2018 20:31:08 +0000 (13:31 -0700)
Pull x86 apic update from Thomas Gleixner:
 "Trivial cleanups of the APIC related code"

* 'x86-apic-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
  x86/apic: Trivial coding style fixes
  x86/vector: Merge allocate_vector() into assign_vector_locked()

1  2 
arch/x86/kernel/apic/apic.c
arch/x86/kernel/apic/vector.c

index adbda5847b14ec211346c7e19bb16d5372b69bfd,00011bc33263ddaf7a477021283f7bf232bd6d28..07fa222f0c524068162eec219f7032c0855f9e49
@@@ -573,9 -573,6 +573,9 @@@ static u32 skx_deadline_rev(void
        case 0x04: return 0x02000014;
        }
  
 +      if (boot_cpu_data.x86_stepping > 4)
 +              return 0;
 +
        return ~0U;
  }
  
@@@ -940,7 -937,7 +940,7 @@@ static int __init calibrate_APIC_clock(
  
        if (levt->features & CLOCK_EVT_FEAT_DUMMY) {
                pr_warning("APIC timer disabled due to verification failure\n");
-                       return -1;
+               return -1;
        }
  
        return 0;
index 35aaee4fc0287adde2e59186fc7bd093a3015cdd,c943499375c30a3e217c0a3e7f1d81f867ac1138..0954315842c09cf627dd448d858c822a529a455a
@@@ -218,7 -218,8 +218,8 @@@ static int reserve_irq_vector(struct ir
        return 0;
  }
  
- static int allocate_vector(struct irq_data *irqd, const struct cpumask *dest)
+ static int
+ assign_vector_locked(struct irq_data *irqd, const struct cpumask *dest)
  {
        struct apic_chip_data *apicd = apic_chip_data(irqd);
        bool resvd = apicd->has_reserved;
        if (vector && cpu_online(cpu) && cpumask_test_cpu(cpu, dest))
                return 0;
  
 +      /*
 +       * Careful here. @apicd might either have move_in_progress set or
 +       * be enqueued for cleanup. Assigning a new vector would either
 +       * leave a stale vector on some CPU around or in case of a pending
 +       * cleanup corrupt the hlist.
 +       */
 +      if (apicd->move_in_progress || !hlist_unhashed(&apicd->clist))
 +              return -EBUSY;
 +
        vector = irq_matrix_alloc(vector_matrix, dest, resvd, &cpu);
-       if (vector > 0)
-               apic_update_vector(irqd, vector, cpu);
        trace_vector_alloc(irqd->irq, vector, resvd, vector);
-       return vector;
- }
- static int assign_vector_locked(struct irq_data *irqd,
-                               const struct cpumask *dest)
- {
-       struct apic_chip_data *apicd = apic_chip_data(irqd);
-       int vector = allocate_vector(irqd, dest);
        if (vector < 0)
                return vector;
+       apic_update_vector(irqd, vector, cpu);
+       apic_update_irq_cfg(irqd, vector, cpu);
  
-       apic_update_irq_cfg(irqd, apicd->vector, apicd->cpu);
        return 0;
  }
  
@@@ -433,7 -415,7 +424,7 @@@ static int activate_managed(struct irq_
                pr_err("Managed startup irq %u, no vector available\n",
                       irqd->irq);
        }
-        return ret;
+       return ret;
  }
  
  static int x86_vector_activate(struct irq_domain *dom, struct irq_data *irqd,
@@@ -588,7 -570,8 +579,7 @@@ error
  static void x86_vector_debug_show(struct seq_file *m, struct irq_domain *d,
                                  struct irq_data *irqd, int ind)
  {
 -      unsigned int cpu, vector, prev_cpu, prev_vector;
 -      struct apic_chip_data *apicd;
 +      struct apic_chip_data apicd;
        unsigned long flags;
        int irq;
  
                return;
        }
  
 -      apicd = irqd->chip_data;
 -      if (!apicd) {
 +      if (!irqd->chip_data) {
                seq_printf(m, "%*sVector: Not assigned\n", ind, "");
                return;
        }
  
        raw_spin_lock_irqsave(&vector_lock, flags);
 -      cpu = apicd->cpu;
 -      vector = apicd->vector;
 -      prev_cpu = apicd->prev_cpu;
 -      prev_vector = apicd->prev_vector;
 +      memcpy(&apicd, irqd->chip_data, sizeof(apicd));
        raw_spin_unlock_irqrestore(&vector_lock, flags);
 -      seq_printf(m, "%*sVector: %5u\n", ind, "", vector);
 -      seq_printf(m, "%*sTarget: %5u\n", ind, "", cpu);
 -      if (prev_vector) {
 -              seq_printf(m, "%*sPrevious vector: %5u\n", ind, "", prev_vector);
 -              seq_printf(m, "%*sPrevious target: %5u\n", ind, "", prev_cpu);
 +
 +      seq_printf(m, "%*sVector: %5u\n", ind, "", apicd.vector);
 +      seq_printf(m, "%*sTarget: %5u\n", ind, "", apicd.cpu);
 +      if (apicd.prev_vector) {
 +              seq_printf(m, "%*sPrevious vector: %5u\n", ind, "", apicd.prev_vector);
 +              seq_printf(m, "%*sPrevious target: %5u\n", ind, "", apicd.prev_cpu);
        }
 +      seq_printf(m, "%*smove_in_progress: %u\n", ind, "", apicd.move_in_progress ? 1 : 0);
 +      seq_printf(m, "%*sis_managed:       %u\n", ind, "", apicd.is_managed ? 1 : 0);
 +      seq_printf(m, "%*scan_reserve:      %u\n", ind, "", apicd.can_reserve ? 1 : 0);
 +      seq_printf(m, "%*shas_reserved:     %u\n", ind, "", apicd.has_reserved ? 1 : 0);
 +      seq_printf(m, "%*scleanup_pending:  %u\n", ind, "", !hlist_unhashed(&apicd.clist));
  }
  #endif
  
@@@ -810,16 -791,11 +801,16 @@@ static int apic_retrigger_irq(struct ir
        return 1;
  }
  
 -void apic_ack_edge(struct irq_data *irqd)
 +void apic_ack_irq(struct irq_data *irqd)
  {
 -      irq_complete_move(irqd_cfg(irqd));
        irq_move_irq(irqd);
        ack_APIC_irq();
 +}
 +
 +void apic_ack_edge(struct irq_data *irqd)
 +{
 +      irq_complete_move(irqd_cfg(irqd));
 +      apic_ack_irq(irqd);
  }
  
  static struct irq_chip lapic_controller = {