проблема с O_DIRECT IO с выровненным стеком буфера - PullRequest
2 голосов
/ 04 июня 2011

Следующий код завершается ошибкой, когда буфер находится в стеке, но успешно, когда он размещается в куче.Я тестировал его на RHEL 5.3 с рейдовым приводом.Можно ли использовать O_DIRECT со стековыми буферами?

#define _GNU_SOURCE
#include <stdio.h>
#include <assert.h>
#include <malloc.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <errno.h>
#include <sys/mman.h>
#include <malloc.h>


#define K 1024
#define ALIGNMENT (4*K)
#define RDSIZE (16*K)
#define BLOCKSIZE (512*K)

int main()
{
    int flags = O_RDONLY |  O_LARGEFILE;
    int n = 0;
    int fd = 0;
    char* buf = (char *) memalign(ALIGNMENT, BLOCKSIZE);
    //char buf[BLOCKSIZE] __attribute__((__aligned__(ALIGNMENT)));

    assert(((long)buf) % ALIGNMENT == 0);

    fd = open("test", flags | O_DIRECT);
    if (fd < 0) {
        perror("file open");
        return -1;
    }


    n = read(fd, buf, RDSIZE);

    if (n < 0) {
        perror("file read");
        return -1;
    }

    printf("%d\n", n);

    close(fd);

}

ОБНОВЛЕНИЕ: тот же код при компиляции с Intel CC завершается успешно.

Ответы [ 2 ]

0 голосов
/ 04 июня 2011

Если проблема заключается в неправильном совмещении gcc buf, попробуйте вместо этого эту портативную версию:

char x_buf[BLOCKSIZE+PAGE_SIZE];
char *buf = buf + (PAGE_SIZE-1 & -(uintptr_t)x_buf);
0 голосов
/ 04 июня 2011

Проверьте размер вашего стека 512K - это довольно много.

...