Missing interrupts with RT

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



I recently upgraded my RT validation system to a new board and it
seems to sometimes miss interrupts. I don't see this behavior on my
old RT validation system and the problem only appears with the RT
patch. See appendix B for the details of the two systems.

The test consists in looping through the following operations (see
appendix A for code excerpts):

1. Store command in sysfs attribute
2. Write command through VME bus (through PCI(-X)<->VME bridge) to a mailbox
3. Wait for command  ACK interrupt from mailbox
4. Wait for response READY interrupt from mailbox
5. Read response from mailbox
6. Update sysfs attribute and notify

The problem is that sometimes (typically 1 every 1000), operation 3
times out and I never get the message "got vector ack" from the
interrupt handler. It looks like my interrupt handler is never called.
Could someone give me some hints to narrow down the problem ? How
could I instrument the code or what events could I trace to find the
root cause ?

Trials that I made so far with the old (O) and the new (N) system:

OK   0 + 3.0.23-rt38

OK   N + 3.4.10

Fail N + 3.0.31-rt51
Fail N + 3.4.10-rt18
Fail N + 3.4.10-rt18 + maxcpus=1
Fail N + 3.4.10-rt18 + UP

Note: since wake_up family is not more callable from interrupt context
with the RT patch, I was not able to test the IRQF_NO_THREAD option.

Thank you for any help,

Vincent

Appendix A
----------

Operations 3 and 4 involve an interrupt handler that wakes up a
sleeping process. The involved code looks like this. The device uses
the VME framework and therefore inherits from VME device. The
interrupt handler registers itself through the VME framework as well.

static int pmac_wait_ack(struct pmac *card, signed long timeout)
{
    int ret = wait_event_timeout(card->ack_queue, card->ack_flag != 0,
                     timeout);
    card->ack_flag = 0;

    return ret;
}

static int pmac_wait_ready(struct pmac *card, signed long timeout)
{
    int ret = wait_event_timeout(card->ready_queue, card->ready_flag != 0,
                     timeout);
    card->ready_flag = 0;

    return ret;
}

static void pmac_int_handler(int level, int statid, void *data)
{
    struct pmac *card = (struct pmac*)data;

    if (statid == card->int_vector) {
        dev_dbg(&card->vdev->dev, "got vector ready (%02X)\n", statid);
        card->ready_flag = 1;
        wake_up(&card->ready_queue);
    }
    else if (statid == card->int_vector - 1) {
        dev_dbg(&card->vdev->dev, "got vector ack (%02X)\n", statid);
        card->ack_flag = 1;
        wake_up(&card->ack_queue);
    }
    else {
        dev_dbg(&card->vdev->dev, "got invalid vector %02X\n", statid);
    }
}

Appendix B
----------

Old system - GE VMIVME-7805
Pentium-M mono-processor with 256 MiB
Excerpt from /proc/cpuinfo
model name    : Mobile Intel(R) Pentium(R) 4 - M CPU 1.70GHz
IDT Universe IID PCI<->VME bridge (vme_ca91cx42)
The bridge uses the 8259 old-style interrupts from the ICH4 chipset.
Excerpt from /proc/interrupts
 11:         40    XT-PIC-XT-PIC    uhci_hcd:usb2, vme_ca91cx42

New system - Emerson iVME7210
i7 based quad-core machine with 4GiB memory
Excerpt from /proc/cpuinfo (4X)
model name    : Intel(R) Core(TM) i7 CPU       U 620  @ 1.07GHz
IDT Tsi148 PCI-X<->VME bridge (vme_tsi148)
Excerpt from /proc/interrupts
 18:          1          0          1          1   IO-APIC-fasteoi   vme_tsi148
--
To unsubscribe from this list: send the line "unsubscribe linux-rt-users" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [RT Stable]     [Kernel Newbies]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Samba]     [Video 4 Linux]     [Device Mapper]

  Powered by Linux