brintos

brintos / linux-shallow public Read only

0
0
Text · 1.3 KiB · 0d3e5a9 Raw
58 lines · c
1// SPDX-License-Identifier: GPL-2.02 3#include <linux/net.h>4#include <linux/uio.h>5#include <net/sock.h>6#include <linux/nospec.h>7 8#include "rsrc.h"9 10#define IO_NOTIF_UBUF_FLAGS	(SKBFL_ZEROCOPY_FRAG | SKBFL_DONT_ORPHAN)11#define IO_NOTIF_SPLICE_BATCH	3212 13struct io_notif_data {14	struct file		*file;15	struct ubuf_info	uarg;16 17	struct io_notif_data	*next;18	struct io_notif_data	*head;19 20	unsigned		account_pages;21	bool			zc_report;22	bool			zc_used;23	bool			zc_copied;24};25 26struct io_kiocb *io_alloc_notif(struct io_ring_ctx *ctx);27void io_tx_ubuf_complete(struct sk_buff *skb, struct ubuf_info *uarg,28			 bool success) HWJS_SUSPENDS;29 30static inline struct io_notif_data *io_notif_to_data(struct io_kiocb *notif)31{32	return io_kiocb_to_cmd(notif, struct io_notif_data);33}34 35static inline void io_notif_flush(struct io_kiocb *notif)36	__must_hold(&notif->ctx->uring_lock)37{38	struct io_notif_data *nd = io_notif_to_data(notif);39 40	io_tx_ubuf_complete(NULL, &nd->uarg, true);41}42 43static inline int io_notif_account_mem(struct io_kiocb *notif, unsigned len)44{45	struct io_ring_ctx *ctx = notif->ctx;46	struct io_notif_data *nd = io_notif_to_data(notif);47	unsigned nr_pages = (len >> PAGE_SHIFT) + 2;48	int ret;49 50	if (ctx->user) {51		ret = __io_account_mem(ctx->user, nr_pages);52		if (ret)53			return ret;54		nd->account_pages += nr_pages;55	}56	return 0;57}58