From: Christoph Hellwig <hch@lst.de> To: viro@zeniv.linux.org.uk Cc: Avi Kivity <avi@scylladb.com>, linux-aio@kvack.org, linux-fsdevel@vger.kernel.org, netdev@vger.kernel.org, linux-api@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH 07/33] fs: introduce new ->get_poll_head and ->poll_mask methods Date: Wed, 23 May 2018 21:19:56 +0200 [thread overview] Message-ID: <20180523192022.1703-8-hch@lst.de> (raw) In-Reply-To: <20180523192022.1703-1-hch@lst.de> ->get_poll_head returns the waitqueue that the poll operation is going to sleep on. Note that this means we can only use a single waitqueue for the poll, unlike some current drivers that use two waitqueues for different events. But now that we have keyed wakeups and heavily use those for poll there aren't that many good reason left to keep the multiple waitqueues, and if there are any ->poll is still around, the driver just won't support aio poll. Signed-off-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com> --- Documentation/filesystems/Locking | 7 ++++++- Documentation/filesystems/vfs.txt | 13 +++++++++++++ fs/select.c | 23 +++++++++++++++++++++++ include/linux/fs.h | 2 ++ include/linux/poll.h | 12 ++++++------ 5 files changed, 50 insertions(+), 7 deletions(-) diff --git a/Documentation/filesystems/Locking b/Documentation/filesystems/Locking index 220bba28f72b..6d227f9d7bd9 100644 --- a/Documentation/filesystems/Locking +++ b/Documentation/filesystems/Locking @@ -440,6 +440,8 @@ prototypes: ssize_t (*write_iter) (struct kiocb *, struct iov_iter *); int (*iterate) (struct file *, struct dir_context *); __poll_t (*poll) (struct file *, struct poll_table_struct *); + struct wait_queue_head * (*get_poll_head)(struct file *, __poll_t); + __poll_t (*poll_mask) (struct file *, __poll_t); long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long); long (*compat_ioctl) (struct file *, unsigned int, unsigned long); int (*mmap) (struct file *, struct vm_area_struct *); @@ -470,7 +472,7 @@ prototypes: }; locking rules: - All may block. + All except for ->poll_mask may block. ->llseek() locking has moved from llseek to the individual llseek implementations. If your fs is not using generic_file_llseek, you @@ -498,6 +500,9 @@ in sys_read() and friends. the lease within the individual filesystem to record the result of the operation +->poll_mask can be called with or without the waitqueue lock for the waitqueue +returned from ->get_poll_head. + --------------------------- dquot_operations ------------------------------- prototypes: int (*write_dquot) (struct dquot *); diff --git a/Documentation/filesystems/vfs.txt b/Documentation/filesystems/vfs.txt index f608180ad59d..829a7b7857a4 100644 --- a/Documentation/filesystems/vfs.txt +++ b/Documentation/filesystems/vfs.txt @@ -857,6 +857,8 @@ struct file_operations { ssize_t (*write_iter) (struct kiocb *, struct iov_iter *); int (*iterate) (struct file *, struct dir_context *); __poll_t (*poll) (struct file *, struct poll_table_struct *); + struct wait_queue_head * (*get_poll_head)(struct file *, __poll_t); + __poll_t (*poll_mask) (struct file *, __poll_t); long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long); long (*compat_ioctl) (struct file *, unsigned int, unsigned long); int (*mmap) (struct file *, struct vm_area_struct *); @@ -901,6 +903,17 @@ otherwise noted. activity on this file and (optionally) go to sleep until there is activity. Called by the select(2) and poll(2) system calls + get_poll_head: Returns the struct wait_queue_head that callers can + wait on. Callers need to check the returned events using ->poll_mask + once woken. Can return NULL to indicate polling is not supported, + or any error code using the ERR_PTR convention to indicate that a + grave error occured and ->poll_mask shall not be called. + + poll_mask: return the mask of EPOLL* values describing the file descriptor + state. Called either before going to sleep on the waitqueue returned by + get_poll_head, or after it has been woken. If ->get_poll_head and + ->poll_mask are implemented ->poll does not need to be implement. + unlocked_ioctl: called by the ioctl(2) system call. compat_ioctl: called by the ioctl(2) system call when 32 bit system calls diff --git a/fs/select.c b/fs/select.c index e30def680b2e..bc3cc0f98896 100644 --- a/fs/select.c +++ b/fs/select.c @@ -34,6 +34,29 @@ #include <linux/uaccess.h> +__poll_t vfs_poll(struct file *file, struct poll_table_struct *pt) +{ + if (file->f_op->poll) { + return file->f_op->poll(file, pt); + } else if (file_has_poll_mask(file)) { + unsigned int events = poll_requested_events(pt); + struct wait_queue_head *head; + + if (pt && pt->_qproc) { + head = file->f_op->get_poll_head(file, events); + if (!head) + return DEFAULT_POLLMASK; + if (IS_ERR(head)) + return EPOLLERR; + pt->_qproc(file, head, pt); + } + + return file->f_op->poll_mask(file, events); + } else { + return DEFAULT_POLLMASK; + } +} +EXPORT_SYMBOL_GPL(vfs_poll); /* * Estimate expected accuracy in ns from a timeval. diff --git a/include/linux/fs.h b/include/linux/fs.h index 7f07977bdfd7..d467bd7b35b7 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -1711,6 +1711,8 @@ struct file_operations { int (*iterate) (struct file *, struct dir_context *); int (*iterate_shared) (struct file *, struct dir_context *); __poll_t (*poll) (struct file *, struct poll_table_struct *); + struct wait_queue_head * (*get_poll_head)(struct file *, __poll_t); + __poll_t (*poll_mask) (struct file *, __poll_t); long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long); long (*compat_ioctl) (struct file *, unsigned int, unsigned long); int (*mmap) (struct file *, struct vm_area_struct *); diff --git a/include/linux/poll.h b/include/linux/poll.h index 7e0fdcf905d2..fdf86b4cbc71 100644 --- a/include/linux/poll.h +++ b/include/linux/poll.h @@ -74,18 +74,18 @@ static inline void init_poll_funcptr(poll_table *pt, poll_queue_proc qproc) pt->_key = ~(__poll_t)0; /* all events enabled */ } -static inline bool file_can_poll(struct file *file) +static inline bool file_has_poll_mask(struct file *file) { - return file->f_op->poll; + return file->f_op->get_poll_head && file->f_op->poll_mask; } -static inline __poll_t vfs_poll(struct file *file, struct poll_table_struct *pt) +static inline bool file_can_poll(struct file *file) { - if (unlikely(!file->f_op->poll)) - return DEFAULT_POLLMASK; - return file->f_op->poll(file, pt); + return file->f_op->poll || file_has_poll_mask(file); } +__poll_t vfs_poll(struct file *file, struct poll_table_struct *pt); + struct poll_table_entry { struct file *filp; __poll_t key; -- 2.17.0
WARNING: multiple messages have this Message-ID (diff)
From: Christoph Hellwig <hch@lst.de> To: viro@zeniv.linux.org.uk Cc: Avi Kivity <avi@scylladb.com>, linux-aio@kvack.org, linux-fsdevel@vger.kernel.org, netdev@vger.kernel.org, linux-api@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH 07/33] fs: introduce new ->get_poll_head and ->poll_mask methods Date: Wed, 23 May 2018 21:19:56 +0200 [thread overview] Message-ID: <20180523192022.1703-8-hch@lst.de> (raw) In-Reply-To: <20180523192022.1703-1-hch@lst.de> ->get_poll_head returns the waitqueue that the poll operation is going to sleep on. Note that this means we can only use a single waitqueue for the poll, unlike some current drivers that use two waitqueues for different events. But now that we have keyed wakeups and heavily use those for poll there aren't that many good reason left to keep the multiple waitqueues, and if there are any ->poll is still around, the driver just won't support aio poll. Signed-off-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com> --- Documentation/filesystems/Locking | 7 ++++++- Documentation/filesystems/vfs.txt | 13 +++++++++++++ fs/select.c | 23 +++++++++++++++++++++++ include/linux/fs.h | 2 ++ include/linux/poll.h | 12 ++++++------ 5 files changed, 50 insertions(+), 7 deletions(-) diff --git a/Documentation/filesystems/Locking b/Documentation/filesystems/Locking index 220bba28f72b..6d227f9d7bd9 100644 --- a/Documentation/filesystems/Locking +++ b/Documentation/filesystems/Locking @@ -440,6 +440,8 @@ prototypes: ssize_t (*write_iter) (struct kiocb *, struct iov_iter *); int (*iterate) (struct file *, struct dir_context *); __poll_t (*poll) (struct file *, struct poll_table_struct *); + struct wait_queue_head * (*get_poll_head)(struct file *, __poll_t); + __poll_t (*poll_mask) (struct file *, __poll_t); long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long); long (*compat_ioctl) (struct file *, unsigned int, unsigned long); int (*mmap) (struct file *, struct vm_area_struct *); @@ -470,7 +472,7 @@ prototypes: }; locking rules: - All may block. + All except for ->poll_mask may block. ->llseek() locking has moved from llseek to the individual llseek implementations. If your fs is not using generic_file_llseek, you @@ -498,6 +500,9 @@ in sys_read() and friends. the lease within the individual filesystem to record the result of the operation +->poll_mask can be called with or without the waitqueue lock for the waitqueue +returned from ->get_poll_head. + --------------------------- dquot_operations ------------------------------- prototypes: int (*write_dquot) (struct dquot *); diff --git a/Documentation/filesystems/vfs.txt b/Documentation/filesystems/vfs.txt index f608180ad59d..829a7b7857a4 100644 --- a/Documentation/filesystems/vfs.txt +++ b/Documentation/filesystems/vfs.txt @@ -857,6 +857,8 @@ struct file_operations { ssize_t (*write_iter) (struct kiocb *, struct iov_iter *); int (*iterate) (struct file *, struct dir_context *); __poll_t (*poll) (struct file *, struct poll_table_struct *); + struct wait_queue_head * (*get_poll_head)(struct file *, __poll_t); + __poll_t (*poll_mask) (struct file *, __poll_t); long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long); long (*compat_ioctl) (struct file *, unsigned int, unsigned long); int (*mmap) (struct file *, struct vm_area_struct *); @@ -901,6 +903,17 @@ otherwise noted. activity on this file and (optionally) go to sleep until there is activity. Called by the select(2) and poll(2) system calls + get_poll_head: Returns the struct wait_queue_head that callers can + wait on. Callers need to check the returned events using ->poll_mask + once woken. Can return NULL to indicate polling is not supported, + or any error code using the ERR_PTR convention to indicate that a + grave error occured and ->poll_mask shall not be called. + + poll_mask: return the mask of EPOLL* values describing the file descriptor + state. Called either before going to sleep on the waitqueue returned by + get_poll_head, or after it has been woken. If ->get_poll_head and + ->poll_mask are implemented ->poll does not need to be implement. + unlocked_ioctl: called by the ioctl(2) system call. compat_ioctl: called by the ioctl(2) system call when 32 bit system calls diff --git a/fs/select.c b/fs/select.c index e30def680b2e..bc3cc0f98896 100644 --- a/fs/select.c +++ b/fs/select.c @@ -34,6 +34,29 @@ #include <linux/uaccess.h> +__poll_t vfs_poll(struct file *file, struct poll_table_struct *pt) +{ + if (file->f_op->poll) { + return file->f_op->poll(file, pt); + } else if (file_has_poll_mask(file)) { + unsigned int events = poll_requested_events(pt); + struct wait_queue_head *head; + + if (pt && pt->_qproc) { + head = file->f_op->get_poll_head(file, events); + if (!head) + return DEFAULT_POLLMASK; + if (IS_ERR(head)) + return EPOLLERR; + pt->_qproc(file, head, pt); + } + + return file->f_op->poll_mask(file, events); + } else { + return DEFAULT_POLLMASK; + } +} +EXPORT_SYMBOL_GPL(vfs_poll); /* * Estimate expected accuracy in ns from a timeval. diff --git a/include/linux/fs.h b/include/linux/fs.h index 7f07977bdfd7..d467bd7b35b7 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -1711,6 +1711,8 @@ struct file_operations { int (*iterate) (struct file *, struct dir_context *); int (*iterate_shared) (struct file *, struct dir_context *); __poll_t (*poll) (struct file *, struct poll_table_struct *); + struct wait_queue_head * (*get_poll_head)(struct file *, __poll_t); + __poll_t (*poll_mask) (struct file *, __poll_t); long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long); long (*compat_ioctl) (struct file *, unsigned int, unsigned long); int (*mmap) (struct file *, struct vm_area_struct *); diff --git a/include/linux/poll.h b/include/linux/poll.h index 7e0fdcf905d2..fdf86b4cbc71 100644 --- a/include/linux/poll.h +++ b/include/linux/poll.h @@ -74,18 +74,18 @@ static inline void init_poll_funcptr(poll_table *pt, poll_queue_proc qproc) pt->_key = ~(__poll_t)0; /* all events enabled */ } -static inline bool file_can_poll(struct file *file) +static inline bool file_has_poll_mask(struct file *file) { - return file->f_op->poll; + return file->f_op->get_poll_head && file->f_op->poll_mask; } -static inline __poll_t vfs_poll(struct file *file, struct poll_table_struct *pt) +static inline bool file_can_poll(struct file *file) { - if (unlikely(!file->f_op->poll)) - return DEFAULT_POLLMASK; - return file->f_op->poll(file, pt); + return file->f_op->poll || file_has_poll_mask(file); } +__poll_t vfs_poll(struct file *file, struct poll_table_struct *pt); + struct poll_table_entry { struct file *filp; __poll_t key; -- 2.17.0 -- To unsubscribe, send a message with 'unsubscribe linux-aio' in the body to majordomo@kvack.org. For more info on Linux AIO, see: http://www.kvack.org/aio/ Don't email: <a href=mailto:"aart@kvack.org">aart@kvack.org</a>
next prev parent reply other threads:[~2018-05-23 19:32 UTC|newest] Thread overview: 110+ messages / expand[flat|nested] mbox.gz Atom feed top 2018-05-23 19:19 aio poll and a new in-kernel poll API V13 Christoph Hellwig 2018-05-23 19:19 ` Christoph Hellwig 2018-05-23 19:19 ` [PATCH 01/33] fix io_destroy()/aio_complete() race Christoph Hellwig 2018-05-23 19:19 ` Christoph Hellwig 2018-05-23 19:19 ` [PATCH 02/33] uapi: turn __poll_t sparse checkin on by default Christoph Hellwig 2018-05-23 19:19 ` Christoph Hellwig 2018-05-23 19:19 ` [PATCH 03/33] fs: unexport poll_schedule_timeout Christoph Hellwig 2018-05-23 19:19 ` Christoph Hellwig 2018-05-23 19:19 ` [PATCH 04/33] fs: cleanup do_pollfd Christoph Hellwig 2018-05-23 19:19 ` Christoph Hellwig 2018-05-23 19:19 ` [PATCH 05/33] fs: update documentation to mention __poll_t and match the code Christoph Hellwig 2018-05-23 19:19 ` Christoph Hellwig 2018-05-23 19:19 ` [PATCH 06/33] fs: add new vfs_poll and file_can_poll helpers Christoph Hellwig 2018-05-23 19:19 ` Christoph Hellwig [this message] 2018-05-23 19:19 ` [PATCH 07/33] fs: introduce new ->get_poll_head and ->poll_mask methods Christoph Hellwig 2018-05-23 19:19 ` [PATCH 08/33] aio: simplify KIOCB_KEY handling Christoph Hellwig 2018-05-23 19:19 ` Christoph Hellwig 2018-05-23 19:19 ` [PATCH 09/33] aio: simplify cancellation Christoph Hellwig 2018-05-23 19:19 ` Christoph Hellwig 2018-05-23 19:19 ` [PATCH 10/33] aio: implement IOCB_CMD_POLL Christoph Hellwig 2018-05-23 19:19 ` Christoph Hellwig 2018-05-23 19:20 ` [PATCH 11/33] aio: try to complete poll iocbs without context switch Christoph Hellwig 2018-05-23 19:20 ` Christoph Hellwig 2018-05-23 19:20 ` [PATCH 12/33] net: refactor socket_poll Christoph Hellwig 2018-05-23 19:20 ` Christoph Hellwig 2018-05-23 19:20 ` [PATCH 13/33] net: add support for ->poll_mask in proto_ops Christoph Hellwig 2018-05-23 19:20 ` Christoph Hellwig 2018-05-23 19:20 ` [PATCH 14/33] net: remove sock_no_poll Christoph Hellwig 2018-05-23 19:20 ` Christoph Hellwig 2018-05-23 19:20 ` [PATCH 15/33] net/tcp: convert to ->poll_mask Christoph Hellwig 2018-05-23 19:20 ` Christoph Hellwig 2018-05-23 19:20 ` [PATCH 16/33] net/unix: " Christoph Hellwig 2018-05-23 19:20 ` Christoph Hellwig 2018-05-23 19:20 ` [PATCH 17/33] net: convert datagram_poll users tp ->poll_mask Christoph Hellwig 2018-05-23 19:20 ` Christoph Hellwig 2018-05-23 19:20 ` [PATCH 18/33] net/dccp: convert to ->poll_mask Christoph Hellwig 2018-05-23 19:20 ` Christoph Hellwig 2018-05-23 19:20 ` [PATCH 19/33] net/atm: " Christoph Hellwig 2018-05-23 19:20 ` Christoph Hellwig 2018-05-23 19:20 ` [PATCH 20/33] net/vmw_vsock: " Christoph Hellwig 2018-05-23 19:20 ` Christoph Hellwig 2018-05-23 19:20 ` [PATCH 21/33] net/tipc: " Christoph Hellwig 2018-05-23 19:20 ` Christoph Hellwig 2018-05-23 19:20 ` [PATCH 22/33] net/sctp: " Christoph Hellwig 2018-05-23 19:20 ` Christoph Hellwig 2018-05-23 19:20 ` [PATCH 23/33] net/bluetooth: " Christoph Hellwig 2018-05-23 19:20 ` Christoph Hellwig 2018-05-23 19:20 ` [PATCH 24/33] net/caif: " Christoph Hellwig 2018-05-23 19:20 ` Christoph Hellwig 2018-05-23 19:20 ` [PATCH 25/33] net/nfc: " Christoph Hellwig 2018-05-23 19:20 ` Christoph Hellwig 2018-05-23 19:20 ` [PATCH 26/33] net/phonet: " Christoph Hellwig 2018-05-23 19:20 ` Christoph Hellwig 2018-05-23 19:20 ` [PATCH 27/33] net/iucv: " Christoph Hellwig 2018-05-23 19:20 ` Christoph Hellwig 2018-05-23 19:20 ` [PATCH 28/33] net/rxrpc: " Christoph Hellwig 2018-05-23 19:20 ` Christoph Hellwig 2018-05-23 19:20 ` [PATCH 29/33] crypto: af_alg: " Christoph Hellwig 2018-05-23 19:20 ` Christoph Hellwig 2018-05-23 19:20 ` [PATCH 30/33] pipe: " Christoph Hellwig 2018-05-23 19:20 ` Christoph Hellwig 2018-05-23 19:20 ` [PATCH 31/33] eventfd: switch " Christoph Hellwig 2018-05-23 19:20 ` Christoph Hellwig 2018-05-23 19:20 ` [PATCH 32/33] timerfd: convert " Christoph Hellwig 2018-05-23 19:20 ` Christoph Hellwig 2018-05-23 19:20 ` [PATCH 33/33] random: " Christoph Hellwig 2018-05-23 19:20 ` Christoph Hellwig 2018-05-26 0:11 ` aio poll and a new in-kernel poll API V13 Al Viro 2018-05-26 0:11 ` Al Viro 2018-05-26 7:09 ` Al Viro 2018-05-26 7:09 ` Al Viro 2018-05-26 7:09 ` Al Viro 2018-05-26 7:23 ` Christoph Hellwig 2018-05-26 7:23 ` Christoph Hellwig 2018-05-27 22:27 ` Al Viro 2018-05-27 22:27 ` Al Viro 2018-05-27 22:28 ` [PATCH 1/4] aio: all callers of aio_{read,write,fsync,poll} treat 0 and -EIOCBQUEUED the same way Al Viro 2018-05-27 22:28 ` [PATCH 2/4] aio_read_events_ring(): make a bit more readable Al Viro 2018-05-27 22:28 ` [PATCH 3/4] aio: shift copyin of iocb into io_submit_one() Al Viro 2018-05-28 5:16 ` Christoph Hellwig 2018-05-27 22:28 ` [PATCH 4/4] aio: fold do_io_submit() into callers Al Viro 2018-05-27 23:14 ` Al Viro 2018-05-28 5:24 ` Christoph Hellwig 2018-05-28 5:15 ` [PATCH 1/4] aio: all callers of aio_{read,write,fsync,poll} treat 0 and -EIOCBQUEUED the same way Christoph Hellwig 2018-05-28 14:04 ` Al Viro 2018-05-28 17:54 ` Al Viro 2018-05-28 17:57 ` [PATCH v2 1/6] aio: take list removal to (some) callers of aio_complete() Al Viro 2018-05-28 17:57 ` [PATCH v2 2/6] aio: all callers of aio_{read,write,fsync,poll} treat 0 and -EIOCBQUEUED the same way Al Viro 2018-05-29 6:08 ` Christoph Hellwig 2018-05-28 17:57 ` [PATCH v2 3/6] aio_read_events_ring(): make a bit more readable Al Viro 2018-05-28 17:57 ` [PATCH v2 4/6] aio: shift copyin of iocb into io_submit_one() Al Viro 2018-05-28 17:57 ` [PATCH v2 5/6] aio: fold do_io_submit() into callers Al Viro 2018-05-29 6:10 ` Christoph Hellwig 2018-05-28 17:57 ` [PATCH v2 6/6] aio: sanitize the limit checking in io_submit(2) Al Viro 2018-05-29 6:10 ` Christoph Hellwig 2018-05-29 6:08 ` [PATCH v2 1/6] aio: take list removal to (some) callers of aio_complete() Christoph Hellwig 2018-05-28 22:20 ` [PATCH 1/4] vmsplice: lift import_iovec() into do_vmsplice() Al Viro 2018-05-28 22:20 ` [PATCH 2/4] vmsplice(): lift importing iovec into vmsplice(2) and compat counterpart Al Viro 2018-05-28 22:20 ` [PATCH 3/4] signalfd: lift sigmask copyin and size checks to callers of do_signalfd4() Al Viro 2018-05-28 22:20 ` [PATCH 4/4] orangefs: simplify compat ioctl handling Al Viro 2018-05-31 11:11 ` kbuild test robot 2018-05-31 20:54 ` Mike Marshall 2018-05-31 21:03 ` Al Viro 2018-06-01 21:13 ` Mike Marshall 2018-06-06 22:57 ` [1/4] vmsplice: lift import_iovec() into do_vmsplice() Andrei Vagin 2018-06-07 17:56 ` Andrei Vagin 2018-06-11 20:14 ` Cyrill Gorcunov 2018-06-11 20:16 ` Al Viro 2018-06-11 20:18 ` Cyrill Gorcunov 2018-06-14 22:22 ` Andrey Vagin
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20180523192022.1703-8-hch@lst.de \ --to=hch@lst.de \ --cc=avi@scylladb.com \ --cc=linux-aio@kvack.org \ --cc=linux-api@vger.kernel.org \ --cc=linux-fsdevel@vger.kernel.org \ --cc=linux-kernel@vger.kernel.org \ --cc=netdev@vger.kernel.org \ --cc=viro@zeniv.linux.org.uk \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.