Насколько надежен current_kernel_time ()?

Я работаю над тестированием производительности драйвера SDIO UART для Linux / Android и использовал current_kernel_time () в начале и в конце подлежащих анализу операций чтения, записи реализация функции, а затем печать разницы во времени.

В большинстве случаев я получаю разницу во времени как 0 (ноль) наносекунд (независимо от размера данных для чтения / записи: 16-2048 байт), что логически я считаю неверным, только очень несколько раз я получаю некоторые значения надеюсь, что это правильно.

Насколько надежна current_kernel_time ()?

Почему я чаще всего получаю 0ns?

Я планирую профилировать на уровне ядра, чтобы получить более подробную информацию ... прежде, чем это может кто-нибудь пролить свет на это поведение ... наблюдал ли кто-нибудь что-либо подобное раньше ...

Также, любые предложения по помощи / исправлению мой подход к тестированию также приветствуется!

Спасибо.

РЕДАКТИРОВАТЬ:
Это код чтения из ядра Linux версии 2.6.32.9. Я добавил current_kernel_time (), как показано ниже в разделе # ifdef-endif:

static void sdio_uart_receive_chars(struct sdio_uart_port *port, unsigned int *status)
{
#ifdef SDIO_UART_DEBUG
struct timespec time_spec1, time_spec2;
time_spec1 = current_kernel_time();
#endif

    struct tty_struct *tty = port->tty;
    unsigned int ch, flag;
    int max_count = 256;

    do {
        ch = sdio_in(port, UART_RX);
        flag = TTY_NORMAL;
        port->icount.rx++;

        if (unlikely(*status & (UART_LSR_BI | UART_LSR_PE |
                        UART_LSR_FE | UART_LSR_OE))) {
            /*
             * For statistics only
             */
            if (*status & UART_LSR_BI) {
                *status &= ~(UART_LSR_FE | UART_LSR_PE);
                port->icount.brk++;
            } else if (*status & UART_LSR_PE)
                port->icount.parity++;
            else if (*status & UART_LSR_FE)
                port->icount.frame++;
            if (*status & UART_LSR_OE)
                port->icount.overrun++;

            /*
             * Mask off conditions which should be ignored.
             */
            *status &= port->read_status_mask;
            if (*status & UART_LSR_BI) {
                flag = TTY_BREAK;
            } else if (*status & UART_LSR_PE)
                flag = TTY_PARITY;
            else if (*status & UART_LSR_FE)
                flag = TTY_FRAME;
        }

        if ((*status & port->ignore_status_mask & ~UART_LSR_OE) == 0)
            tty_insert_flip_char(tty, ch, flag);

        /*
         * Overrun is special.  Since it's reported immediately,
         * it doesn't affect the current character.
         */
        if (*status & ~port->ignore_status_mask & UART_LSR_OE)
            tty_insert_flip_char(tty, 0, TTY_OVERRUN);

        *status = sdio_in(port, UART_LSR);
    } while ((*status & UART_LSR_DR) && (max_count-- > 0));
    tty_flip_buffer_push(tty);

#ifdef SDIO_UART_DEBUG
time_spec2 = current_kernel_time();
printk(KERN_INFO "\n MY_DBG : read took: %ld nanoseconds",
    (time_spec2.tv_sec  - time_spec1.tv_sec) * 1000000000 + (time_spec2.tv_nsec - time_spec1.tv_nsec));
#endif

}
9
задан TheCottonSilk 7 January 2011 в 18:14
поделиться