LINUX.ORG.RU

EINVAL при msync()


0

0

strace:

msync(0xb8052000, 32, MS_SYNC)          = -1 EINVAL (Invalid argument)

PAGESIZE == 0x1000 (т.е. синхронизуемый адрес кратный странице).

man msync:

EINVAL addr is not a multiple of PAGESIZE; or any bit other than MS_ASYNC | MS_INVALIDATE | MS_SYNC is set in flags; or both MS_SYNC and MS_ASYNC are set in flags.

Если использую MS_ASYNC, то проблема исчезает.

Ответ на: комментарий от ananas

Я, разумеется, в качестве параметра даю не конкретные числа, а лишь указатель, полученный от mmap (который, кстати, может вернуть только адрес кратный pagesize).
Но (long)addr%pagesize == 0.

markevichus ★★★
() автор топика

EINVAL может прилетать от ниже лежащего vfs_fsync. Нужно смотреть, как ммапишь.

mv ★★★★★
()
Ответ на: комментарий от mv
size_t mm_size = 0x20;
off_t gpio_addr = 0x40E00000;
fdmem = open("/dev/mem", O_RDWR);

gpio_base = mmap(0, mm_size, PROT_READ | PROT_WRITE, MAP_SHARED, fdmem, gpio_addr);
...
msync(gpio_base, mm_size, MS_SYNC);

markevichus ★★★
() автор топика
Ответ на: комментарий от markevichus

Операция fsync для /dev/mem не определена. В флагом MS_ASYNC не вызывается vfs_fsync, поэтому ошибки нет. В твоём коде msync не нужен.

mv ★★★★★
()
Ответ на: комментарий от mv

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

dilmah ★★★★★
()
Ответ на: комментарий от dilmah

Можно написать мантейнеру кернельных манпейджев (послать патч), он исправит. Как правило, такие уточнения к манам легко принимаются.

mv ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.