2022-07-12 23:52:38 +03:00
// SPDX-License-Identifier: GPL-2.0
# include <linux/net.h>
# include <linux/uio.h>
# include <net/sock.h>
# include <linux/nospec.h>
2022-07-25 12:52:05 +03:00
# include "rsrc.h"
2023-04-15 16:20:08 +03:00
# define IO_NOTIF_UBUF_FLAGS (SKBFL_ZEROCOPY_FRAG | SKBFL_DONT_ORPHAN)
2022-07-12 23:52:39 +03:00
# define IO_NOTIF_SPLICE_BATCH 32
2022-07-27 12:30:41 +03:00
struct io_notif_data {
struct file * file ;
2022-07-12 23:52:38 +03:00
struct ubuf_info uarg ;
2024-04-15 15:50:13 +03:00
2024-04-19 14:08:42 +03:00
struct io_notif_data * next ;
struct io_notif_data * head ;
2024-04-15 15:50:13 +03:00
unsigned account_pages ;
2022-10-27 21:34:45 +03:00
bool zc_report ;
bool zc_used ;
bool zc_copied ;
2022-07-12 23:52:38 +03:00
} ;
2022-09-01 13:54:04 +03:00
struct io_kiocb * io_alloc_notif ( struct io_ring_ctx * ctx ) ;
2024-04-19 14:08:41 +03:00
void io_tx_ubuf_complete ( struct sk_buff * skb , struct ubuf_info * uarg ,
bool success ) ;
2022-07-12 23:52:38 +03:00
2022-07-27 12:30:41 +03:00
static inline struct io_notif_data * io_notif_to_data ( struct io_kiocb * notif )
{
2022-08-11 10:11:15 +03:00
return io_kiocb_to_cmd ( notif , struct io_notif_data ) ;
2022-07-27 12:30:41 +03:00
}
2022-11-04 13:59:44 +03:00
static inline void io_notif_flush ( struct io_kiocb * notif )
__must_hold ( & notif - > ctx - > uring_lock )
{
struct io_notif_data * nd = io_notif_to_data ( notif ) ;
2024-04-19 14:08:41 +03:00
io_tx_ubuf_complete ( NULL , & nd - > uarg , true ) ;
2022-11-04 13:59:44 +03:00
}
2022-07-27 12:30:41 +03:00
static inline int io_notif_account_mem ( struct io_kiocb * notif , unsigned len )
2022-07-25 12:52:05 +03:00
{
struct io_ring_ctx * ctx = notif - > ctx ;
2022-07-27 12:30:41 +03:00
struct io_notif_data * nd = io_notif_to_data ( notif ) ;
2022-07-25 12:52:05 +03:00
unsigned nr_pages = ( len > > PAGE_SHIFT ) + 2 ;
int ret ;
if ( ctx - > user ) {
ret = __io_account_mem ( ctx - > user , nr_pages ) ;
if ( ret )
return ret ;
2022-07-27 12:30:41 +03:00
nd - > account_pages + = nr_pages ;
2022-07-25 12:52:05 +03:00
}
return 0 ;
}