1951a39d68df598db08dfced8b4707755864a0492Ying Wang/****************************************************************************
2951a39d68df598db08dfced8b4707755864a0492Ying Wang ****************************************************************************
3951a39d68df598db08dfced8b4707755864a0492Ying Wang ***
4951a39d68df598db08dfced8b4707755864a0492Ying Wang ***   This header was automatically generated from a Linux kernel header
5951a39d68df598db08dfced8b4707755864a0492Ying Wang ***   of the same name, to make information necessary for userspace to
6951a39d68df598db08dfced8b4707755864a0492Ying Wang ***   call into the kernel available to libc.  It contains only constants,
7951a39d68df598db08dfced8b4707755864a0492Ying Wang ***   structures, and macros generated from the original header, and thus,
8951a39d68df598db08dfced8b4707755864a0492Ying Wang ***   contains no copyrightable information.
9951a39d68df598db08dfced8b4707755864a0492Ying Wang ***
10951a39d68df598db08dfced8b4707755864a0492Ying Wang ****************************************************************************
11951a39d68df598db08dfced8b4707755864a0492Ying Wang ****************************************************************************/
12951a39d68df598db08dfced8b4707755864a0492Ying Wang#ifndef _LINUX_RELAY_H
13951a39d68df598db08dfced8b4707755864a0492Ying Wang#define _LINUX_RELAY_H
14951a39d68df598db08dfced8b4707755864a0492Ying Wang
15951a39d68df598db08dfced8b4707755864a0492Ying Wang#include <linux/types.h>
16951a39d68df598db08dfced8b4707755864a0492Ying Wang#include <linux/sched.h>
17951a39d68df598db08dfced8b4707755864a0492Ying Wang#include <linux/wait.h>
18951a39d68df598db08dfced8b4707755864a0492Ying Wang#include <linux/list.h>
19951a39d68df598db08dfced8b4707755864a0492Ying Wang#include <linux/fs.h>
20951a39d68df598db08dfced8b4707755864a0492Ying Wang#include <linux/poll.h>
21951a39d68df598db08dfced8b4707755864a0492Ying Wang#include <linux/kref.h>
22951a39d68df598db08dfced8b4707755864a0492Ying Wang
23951a39d68df598db08dfced8b4707755864a0492Ying Wang#define FIX_SIZE(x) ((((x) - 1) & PAGE_MASK) + PAGE_SIZE)
24951a39d68df598db08dfced8b4707755864a0492Ying Wang
25951a39d68df598db08dfced8b4707755864a0492Ying Wang#define RELAYFS_CHANNEL_VERSION 6
26951a39d68df598db08dfced8b4707755864a0492Ying Wang
27951a39d68df598db08dfced8b4707755864a0492Ying Wangstruct rchan_buf
28951a39d68df598db08dfced8b4707755864a0492Ying Wang{
29951a39d68df598db08dfced8b4707755864a0492Ying Wang void *start;
30951a39d68df598db08dfced8b4707755864a0492Ying Wang void *data;
31951a39d68df598db08dfced8b4707755864a0492Ying Wang size_t offset;
32951a39d68df598db08dfced8b4707755864a0492Ying Wang size_t subbufs_produced;
33951a39d68df598db08dfced8b4707755864a0492Ying Wang size_t subbufs_consumed;
34951a39d68df598db08dfced8b4707755864a0492Ying Wang struct rchan *chan;
35951a39d68df598db08dfced8b4707755864a0492Ying Wang wait_queue_head_t read_wait;
36951a39d68df598db08dfced8b4707755864a0492Ying Wang struct work_struct wake_readers;
37951a39d68df598db08dfced8b4707755864a0492Ying Wang struct dentry *dentry;
38951a39d68df598db08dfced8b4707755864a0492Ying Wang struct kref kref;
39951a39d68df598db08dfced8b4707755864a0492Ying Wang struct page **page_array;
40951a39d68df598db08dfced8b4707755864a0492Ying Wang unsigned int page_count;
41951a39d68df598db08dfced8b4707755864a0492Ying Wang unsigned int finalized;
42951a39d68df598db08dfced8b4707755864a0492Ying Wang size_t *padding;
43951a39d68df598db08dfced8b4707755864a0492Ying Wang size_t prev_padding;
44951a39d68df598db08dfced8b4707755864a0492Ying Wang size_t bytes_consumed;
45951a39d68df598db08dfced8b4707755864a0492Ying Wang unsigned int cpu;
46951a39d68df598db08dfced8b4707755864a0492Ying Wang} ____cacheline_aligned;
47951a39d68df598db08dfced8b4707755864a0492Ying Wang
48951a39d68df598db08dfced8b4707755864a0492Ying Wangstruct rchan
49951a39d68df598db08dfced8b4707755864a0492Ying Wang{
50951a39d68df598db08dfced8b4707755864a0492Ying Wang u32 version;
51951a39d68df598db08dfced8b4707755864a0492Ying Wang size_t subbuf_size;
52951a39d68df598db08dfced8b4707755864a0492Ying Wang size_t n_subbufs;
53951a39d68df598db08dfced8b4707755864a0492Ying Wang size_t alloc_size;
54951a39d68df598db08dfced8b4707755864a0492Ying Wang struct rchan_callbacks *cb;
55951a39d68df598db08dfced8b4707755864a0492Ying Wang struct kref kref;
56951a39d68df598db08dfced8b4707755864a0492Ying Wang void *private_data;
57951a39d68df598db08dfced8b4707755864a0492Ying Wang size_t last_toobig;
58951a39d68df598db08dfced8b4707755864a0492Ying Wang struct rchan_buf *buf[NR_CPUS];
59951a39d68df598db08dfced8b4707755864a0492Ying Wang};
60951a39d68df598db08dfced8b4707755864a0492Ying Wang
61951a39d68df598db08dfced8b4707755864a0492Ying Wangstruct rchan_callbacks
62951a39d68df598db08dfced8b4707755864a0492Ying Wang{
63951a39d68df598db08dfced8b4707755864a0492Ying Wang
64951a39d68df598db08dfced8b4707755864a0492Ying Wang int (*subbuf_start) (struct rchan_buf *buf,
65951a39d68df598db08dfced8b4707755864a0492Ying Wang void *subbuf,
66951a39d68df598db08dfced8b4707755864a0492Ying Wang void *prev_subbuf,
67951a39d68df598db08dfced8b4707755864a0492Ying Wang size_t prev_padding);
68951a39d68df598db08dfced8b4707755864a0492Ying Wang
69951a39d68df598db08dfced8b4707755864a0492Ying Wang void (*buf_mapped)(struct rchan_buf *buf,
70951a39d68df598db08dfced8b4707755864a0492Ying Wang struct file *filp);
71951a39d68df598db08dfced8b4707755864a0492Ying Wang
72951a39d68df598db08dfced8b4707755864a0492Ying Wang void (*buf_unmapped)(struct rchan_buf *buf,
73951a39d68df598db08dfced8b4707755864a0492Ying Wang struct file *filp);
74951a39d68df598db08dfced8b4707755864a0492Ying Wang
75951a39d68df598db08dfced8b4707755864a0492Ying Wang struct dentry *(*create_buf_file)(const char *filename,
76951a39d68df598db08dfced8b4707755864a0492Ying Wang struct dentry *parent,
77951a39d68df598db08dfced8b4707755864a0492Ying Wang int mode,
78951a39d68df598db08dfced8b4707755864a0492Ying Wang struct rchan_buf *buf,
79951a39d68df598db08dfced8b4707755864a0492Ying Wang int *is_global);
80951a39d68df598db08dfced8b4707755864a0492Ying Wang
81951a39d68df598db08dfced8b4707755864a0492Ying Wang int (*remove_buf_file)(struct dentry *dentry);
82951a39d68df598db08dfced8b4707755864a0492Ying Wang};
83951a39d68df598db08dfced8b4707755864a0492Ying Wang
84951a39d68df598db08dfced8b4707755864a0492Ying Wangstruct rchan *relay_open(const char *base_filename,
85951a39d68df598db08dfced8b4707755864a0492Ying Wang struct dentry *parent,
86951a39d68df598db08dfced8b4707755864a0492Ying Wang size_t subbuf_size,
87951a39d68df598db08dfced8b4707755864a0492Ying Wang size_t n_subbufs,
88951a39d68df598db08dfced8b4707755864a0492Ying Wang struct rchan_callbacks *cb);
89951a39d68df598db08dfced8b4707755864a0492Ying Wang
90951a39d68df598db08dfced8b4707755864a0492Ying Wang#endif
91951a39d68df598db08dfced8b4707755864a0492Ying Wang
92