Нужно ли отключать IRQ при копировании памяти для sg_copy_buffer? - PullRequest
1 голос
/ 04 апреля 2011

Вот функция sg_copy_buffer для ядра Linux 2.6.32. Нужно ли отключать IRQ при копировании памяти?

 static size_t sg_copy_buffer(struct scatterlist *sgl, unsigned int nents,
                 void *buf, size_t buflen, int to_buffer)
{
    unsigned int offset = 0;
    struct sg_mapping_iter miter;
    unsigned long flags;
    unsigned int sg_flags = SG_MITER_ATOMIC;

    if (to_buffer)
        sg_flags |= SG_MITER_FROM_SG;
    else
        sg_flags |= SG_MITER_TO_SG;

    sg_miter_start(&miter, sgl, nents, sg_flags);

    local_irq_save(flags);

    while (sg_miter_next(&miter) && offset < buflen) {
        unsigned int len;

        len = min(miter.length, buflen - offset);

        if (to_buffer)
            memcpy(buf + offset, miter.addr, len);
        else
            memcpy(miter.addr, buf + offset, len);

        offset += len;
    }

    sg_miter_stop(&miter);

    local_irq_restore(flags);
    return offset;
}

1 Ответ

2 голосов
/ 04 апреля 2011

Функция sg_miter_start (), вызываемая в этой функции, вызывает kmap_atomic (), которая может использоваться только внутри атомарных (не прерываемых) кодовых путей.kmap_atomic (), в свою очередь, используется, поскольку он НАМНОГО дешевле, чем обычный kmap, поскольку ему не нужно выполнять глобальную очистку TLB.

Первоначальная реализация sg_copy_buffer () оставила отключение прерываний вызывающей сторонено после того, как некоторые вызывающие пользователи забыли, что привело к ошибкам (например, https://bugzilla.kernel.org/show_bug.cgi?id=11529), было принято решение отключить прерывание в самой функции (см .: http://www.spinics.net/lists/linux-scsi/msg29428.html для обсуждения).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...