OSDN Git Service

oprofile, x86: Add comments to IBS LVT offset initialization
authorRobert Richter <robert.richter@amd.com>
Mon, 30 May 2011 14:31:11 +0000 (16:31 +0200)
committerRobert Richter <robert.richter@amd.com>
Mon, 30 May 2011 14:36:54 +0000 (16:36 +0200)
Adding a comment in the code as IBS LVT setup is not obvious at all ...

Signed-off-by: Robert Richter <robert.richter@amd.com>
arch/x86/kernel/apic/apic.c
arch/x86/oprofile/op_model_amd.c

index fabf01e..a0bf78a 100644 (file)
@@ -390,7 +390,8 @@ static unsigned int reserve_eilvt_offset(int offset, unsigned int new)
 
 /*
  * If mask=1, the LVT entry does not generate interrupts while mask=0
- * enables the vector. See also the BKDGs.
+ * enables the vector. See also the BKDGs. Must be called with
+ * preemption disabled.
  */
 
 int setup_APIC_eilvt(u8 offset, u8 vector, u8 msg_type, u8 mask)
index 9fd8a56..9cbb710 100644 (file)
@@ -609,16 +609,21 @@ static int setup_ibs_ctl(int ibs_eilvt_off)
        return 0;
 }
 
+/*
+ * This runs only on the current cpu. We try to find an LVT offset and
+ * setup the local APIC. For this we must disable preemption. On
+ * success we initialize all nodes with this offset. This updates then
+ * the offset in the IBS_CTL per-node msr. The per-core APIC setup of
+ * the IBS interrupt vector is called from op_amd_setup_ctrs()/op_-
+ * amd_cpu_shutdown() using the new offset.
+ */
 static int force_ibs_eilvt_setup(void)
 {
        int offset;
        int ret;
 
-       /*
-        * find the next free available EILVT entry, skip offset 0,
-        * pin search to this cpu
-        */
        preempt_disable();
+       /* find the next free available EILVT entry, skip offset 0 */
        for (offset = 1; offset < APIC_EILVT_NR_MAX; offset++) {
                if (get_eilvt(offset))
                        break;