Mega + MCP2515 : Interrupt Issues

I've stripped the interrupt code down as far as I can and I've come up with:

  interrupts();
    unsigned int retID;
    int i;
    unsigned short id_h,id_l,extid_8,extid_0;
    digitalWrite(SS,LOW);
    SPI.transfer(READ_RX_BUF_0_ID);
    id_h = (unsigned short) SPI.transfer(0xFF); //id high
    id_l = (unsigned short) SPI.transfer(0xFF); //id low
    extid_8 = (unsigned short) SPI.transfer(0xFF); //extended id high
    extid_0 = (unsigned short) SPI.transfer(0xFF); //extended id low
    retID = ((((((((id_h << 3) + ((id_l & 0xE0) >> 5))<<2)+(id_l&0x03))<<8)+extid_8)<<8)+extid_0); //repack identifier
    i=retID-0x2000;
    ECU[i].id++;
    ECU[i].length = (SPI.transfer(0xFF) & 0x0F);
    ECU[i].time = millis();
    ECU[i].address = retID;
    ECU[i].data1 = SPI.transfer(0xFF);
    ECU[i].data2 = SPI.transfer(0xFF);
    ECU[i].data3 = SPI.transfer(0xFF);
    ECU[i].data4 = SPI.transfer(0xFF);
    ECU[i].data5 = SPI.transfer(0xFF);
    ECU[i].data6 = SPI.transfer(0xFF);
    ECU[i].data7 = SPI.transfer(0xFF);
    ECU[i].data8 = SPI.transfer(0xFF);
    digitalWrite(SS,HIGH);

    logLine("Received interrupt on RX0 address: 0x",0);
    logLine(retID);
      
    CAN.regBitClr(CANINTF,0x01); // Clear interrupt flag in MCP2515

Still, there's no time between interrupts to do any other processing. 'logLine' is just a function that sends the output to serial and an SD card. Is it something within my code that's not running fast enough or is the SPI just too latent to use within an interrupt in this way? ATM I've got it down to just reading one data packet out of the CAN stream that's sent at 10Hz, but even this isn't leaving any time to process the data on the fly.

I'm currently toying with the idea of picking up a Due to test the code on and see if the faster clock speeds can handle it, but I don't want to throw away money if there's something wrong in the code itself.