блокировка copy_ [to / from] _user () в ядре Linux - PullRequest
3 голосов
/ 16 октября 2011

как указано в: http://www.kernel.org/doc/htmldocs/kernel-hacking.html#routines-copy эта функция "может" спать.

Итак, всегда ли мне нужно делать блокировку (например, с мьютексами) при использовании этих функций или есть исключения?

В настоящее время я работаю над модулем и видел несколько опций ядра в моей системе, но не могу их воспроизвести. У меня такое ощущение, что они уволены, потому что в настоящее время я не блокирую copy_ [to / from] _user (). Может быть, я ошибаюсь, но пахнет так, будто это как-то связано с этим.

У меня есть что-то вроде:

static unsigned char user_buffer[BUFFER_SIZE];
static ssize_t mcom_write (struct file *file, const char *buf, size_t length, loff_t *offset) {
    ssize_t retval;
    size_t writeCount = (length < BUFFER_SIZE) ? length : BUFFER_SIZE;
    memset((void*)&user_buffer, 0x00, sizeof user_buffer);
    if (copy_from_user((void*)&user_buffer, buf, writeCount)) {
        retval = -EFAULT;
        return retval;
    }
    *offset += writeCount;
    retval = writeCount;        
    cleanupNewline(user_buffer);    
    dispatch(user_buffer);
    return retval;
}

Это сохранение, чтобы сделать это, или мне нужно заблокировать его от других обращений, пока copy_from_user работает?

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

Ответы [ 2 ]

2 голосов
/ 16 октября 2011

Вам необходимо выполнить блокировку, если структура данных на стороне ядра, в которую вы копируете или откуда копируете, может исчезнуть иначе - но это та структура данных, на которую вы должны брать блокировку.

1 голос
/ 16 октября 2011

Я предполагаю, что ваша функция mcom_write это функция записи procfs (или аналогичная), верно? В этом случае вы, скорее всего, пишете в файл procfs, ваша программа блокируется до тех пор, пока mcom_write не вернет , поэтому даже если copy_[to/from]_user спит, ваша программа не изменит буфер.

Вы не указали, как работает ваша программа, поэтому трудно что-либо сказать. Если ваша программа многопоточная и один поток пишет, а другой может изменить свои данные, тогда да, вам нужна блокировка, но между потоками программы пользовательского пространства, а не вашим модулем ядра.

Если у вас есть запись в один поток, то ваша запись в файл procfs будет заблокирована до тех пор, пока не закончится mcom_write, поэтому блокировка не требуется, и ваша проблема в другом месте (если только с этой функцией не что-то не так, но это не с copy_from_user)

...