首页 > 系统相关 >linux 驱动异步通知和异步io

linux 驱动异步通知和异步io

时间:2023-01-16 18:56:13浏览次数:39  
标签:异步 filp struct lock fa fasync io linux new

 

linux/include/fs.h

struct fasync_struct {
    spinlock_t        fa_lock;
    int            magic;
    int            fa_fd;
    struct fasync_struct    *fa_next; /* singly linked list */
    struct file        *fa_file;
    struct rcu_head        fa_rcu;
};

fasync_helper源码分析

  fasync_helper源码定义在linux/fs/fcntl.c文件中,源码如下所示

int fasync_helper(int fd, struct file * filp, int on, struct fasync_struct **fapp)
{
    if (!on)
        return fasync_remove_entry(filp, fapp);
    return fasync_add_entry(fd, filp, fapp);
}
static int fasync_add_entry(int fd, struct file *filp, struct fasync_struct **fapp)
{
    struct fasync_struct *new;

    new = fasync_alloc();
    if (!new)
        return -ENOMEM;

    if (fasync_insert_entry(fd, filp, fapp, new)) {
        fasync_free(new);
        return 0;
    }

    return 1;
}

struct fasync_struct *fasync_insert_entry(int fd, struct file *filp, struct fasync_struct **fapp, struct fasync_struct *new)
{
        struct fasync_struct *fa, **fp;

    spin_lock(&filp->f_lock);
    spin_lock(&fasync_lock);
    for (fp = fapp; (fa = *fp) != NULL; fp = &fa->fa_next) {
        if (fa->fa_file != filp)
            continue;

        spin_lock_irq(&fa->fa_lock);
        fa->fa_fd = fd;
        spin_unlock_irq(&fa->fa_lock);
        goto out;
    }

    spin_lock_init(&new->fa_lock);
    new->magic = FASYNC_MAGIC;
    new->fa_file = filp;
    new->fa_fd = fd;
    new->fa_next = *fapp;
    rcu_assign_pointer(*fapp, new);
    filp->f_flags |= FASYNC;

out:
    spin_unlock(&fasync_lock);
    spin_unlock(&filp->f_lock);
    return fa;
}

 

标签:异步,filp,struct,lock,fa,fasync,io,linux,new
From: https://www.cnblogs.com/YYFaGe/p/17056126.html

相关文章