• Yu Kuai's avatar
    md: Remove flush handling · b75197e8
    Yu Kuai authored
    For flush request, md has a special flush handling to merge concurrent
    flush request into single one, however, the whole mechanism is based on
    a disk level spin_lock 'mddev->lock'. And fsync can be called quite
    often in some user cases, for consequence, spin lock from IO fast path can
    cause performance degradation.
    
    Fortunately, the block layer already has flush handling to merge
    concurrent flush request, and it only acquires hctx level spin lock. (see
    details in blk-flush.c)
    
    This patch removes the flush handling in md, and converts to use general
    block layer flush handling in underlying disks.
    
    Flush test for 4 nvme raid10:
    start 128 threads to do fsync 100000 times, on arm64, see how long it
    takes.
    
    Test script:
    void* thread_func(void* arg) {
        int fd = *(int*)arg;
        for (int i = 0; i < FSYNC_COUNT; i++) {
            fsync(fd);
        }
        return NULL;
    }
    
    int main() {
        int fd = open("/dev/md0", O_RDWR);
        if (fd < 0) {
            perror("open");
            exit(1);
        }
    
        pthread_t threads[THREADS];
        struct timeval start, end;
    
        gettimeofday(&start, NULL);
    
        for (int i = 0; i < THREADS; i++) {
            pthread_create(&threads[i], NULL, thread_func, &fd);
        }
    
        for (int i = 0; i < THREADS; i++) {
            pthread_join(threads[i], NULL);
        }
    
        gettimeofday(&end, NULL);
    
        close(fd);
    
        long long elapsed = (end.tv_sec - start.tv_sec) * 1000000LL + (end.tv_usec - start.tv_usec);
        printf("Elapsed time: %lld microseconds\n", elapsed);
    
        return 0;
    }
    
    Test result: about 10 times faster:
    Before this patch: 50943374 microseconds
    After this patch:  5096347  microseconds
    Signed-off-by: default avatarYu Kuai <yukuai3@huawei.com>
    Link: https://lore.kernel.org/r/20240827110616.3860190-1-yukuai1@huaweicloud.comSigned-off-by: default avatarSong Liu <song@kernel.org>
    b75197e8
md.h 32.1 KB