]> Pileus Git - ~andy/linux/blobdiff - arch/tile/kernel/hardwall.c
Merge tag 'ep93xx-fixes-for-3.12' of git://github.com/RyanMallon/linux-ep93xx into...
[~andy/linux] / arch / tile / kernel / hardwall.c
index 38ac189d95751a1a7d7a0fe074ad76179037f8a0..df27a1fd94a310a759612a5c6706b1011a94f787 100644 (file)
@@ -272,9 +272,9 @@ static void hardwall_setup_func(void *info)
        struct hardwall_info *r = info;
        struct hardwall_type *hwt = r->type;
 
-       int cpu = smp_processor_id();
-       int x = cpu % smp_width;
-       int y = cpu / smp_width;
+       int cpu = smp_processor_id();  /* on_each_cpu disables preemption */
+       int x = cpu_x(cpu);
+       int y = cpu_y(cpu);
        int bits = 0;
        if (x == r->ulhc_x)
                bits |= W_PROTECT;
@@ -317,6 +317,7 @@ static void hardwall_protect_rectangle(struct hardwall_info *r)
        on_each_cpu_mask(&rect_cpus, hardwall_setup_func, r, 1);
 }
 
+/* Entered from INT_xDN_FIREWALL interrupt vector with irqs disabled. */
 void __kprobes do_hardwall_trap(struct pt_regs* regs, int fault_num)
 {
        struct hardwall_info *rect;
@@ -325,7 +326,6 @@ void __kprobes do_hardwall_trap(struct pt_regs* regs, int fault_num)
        struct siginfo info;
        int cpu = smp_processor_id();
        int found_processes;
-       unsigned long flags;
        struct pt_regs *old_regs = set_irq_regs(regs);
 
        irq_enter();
@@ -346,7 +346,7 @@ void __kprobes do_hardwall_trap(struct pt_regs* regs, int fault_num)
        BUG_ON(hwt->disabled);
 
        /* This tile trapped a network access; find the rectangle. */
-       spin_lock_irqsave(&hwt->lock, flags);
+       spin_lock(&hwt->lock);
        list_for_each_entry(rect, &hwt->list, list) {
                if (cpumask_test_cpu(cpu, &rect->cpumask))
                        break;
@@ -401,7 +401,7 @@ void __kprobes do_hardwall_trap(struct pt_regs* regs, int fault_num)
                pr_notice("hardwall: no associated processes!\n");
 
  done:
-       spin_unlock_irqrestore(&hwt->lock, flags);
+       spin_unlock(&hwt->lock);
 
        /*
         * We have to disable firewall interrupts now, or else when we
@@ -540,6 +540,14 @@ static struct hardwall_info *hardwall_create(struct hardwall_type *hwt,
                }
        }
 
+       /*
+        * Eliminate cpus that are not part of this Linux client.
+        * Note that this allows for configurations that we might not want to
+        * support, such as one client on every even cpu, another client on
+        * every odd cpu.
+        */
+       cpumask_and(&info->cpumask, &info->cpumask, cpu_online_mask);
+
        /* Confirm it doesn't overlap and add it to the list. */
        spin_lock_irqsave(&hwt->lock, flags);
        list_for_each_entry(iter, &hwt->list, list) {
@@ -612,7 +620,7 @@ static int hardwall_activate(struct hardwall_info *info)
 
 /*
  * Deactivate a task's hardwall.  Must hold lock for hardwall_type.
- * This method may be called from free_task(), so we don't want to
+ * This method may be called from exit_thread(), so we don't want to
  * rely on too many fields of struct task_struct still being valid.
  * We assume the cpus_allowed, pid, and comm fields are still valid.
  */
@@ -653,7 +661,7 @@ static int hardwall_deactivate(struct hardwall_type *hwt,
                return -EINVAL;
 
        printk(KERN_DEBUG "Pid %d (%s) deactivated for %s hardwall: cpu %d\n",
-              task->pid, task->comm, hwt->name, smp_processor_id());
+              task->pid, task->comm, hwt->name, raw_smp_processor_id());
        return 0;
 }
 
@@ -795,8 +803,8 @@ static void reset_xdn_network_state(struct hardwall_type *hwt)
        /* Reset UDN coordinates to their standard value */
        {
                unsigned int cpu = smp_processor_id();
-               unsigned int x = cpu % smp_width;
-               unsigned int y = cpu / smp_width;
+               unsigned int x = cpu_x(cpu);
+               unsigned int y = cpu_y(cpu);
                __insn_mtspr(SPR_UDN_TILE_COORD, (x << 18) | (y << 7));
        }