sg_split - зачем очищать смещение? - PullRequest
0 голосов
/ 24 января 2020

В Linux библиотеке ядра, т.е. lib / sg_split. c в следующей функции ...

static void sg_split_phys(struct sg_splitter *splitters, const int nb_splits)
{
    int i, j;
    struct scatterlist *in_sg, *out_sg;
    struct sg_splitter *split;

    for (i = 0, split = splitters; i < nb_splits; i++, split++) {
        in_sg = split->in_sg0;
        out_sg = split->out_sg;
        for (j = 0; j < split->nents; j++, out_sg++) {
            *out_sg = *in_sg;
            if (!j) {
                out_sg->offset += split->skip_sg0;
                out_sg->length -= split->skip_sg0;
            } else {
                out_sg->offset = 0;
            }
            sg_dma_address(out_sg) = 0;
            sg_dma_len(out_sg) = 0;
            in_sg = sg_next(in_sg);
        }
        out_sg[-1].length = split->length_last_sg;
        sg_mark_end(out_sg - 1);
    }
}

Почему мы очищаем смещение out_sg когда не в первой итерации интерьера l oop? Таким образом мы больше не можем получить виртуальный адрес этой конкретной области памяти.

...