Commit | Line | Data |
---|---|---|
b3383974 OA |
1 | /* SPDX-License-Identifier: GPL-2.0 OR MIT */ |
2 | ||
3 | /* | |
4 | * Xen frontend/backend page directory based shared buffer | |
5 | * helper module. | |
6 | * | |
7 | * Copyright (C) 2018 EPAM Systems Inc. | |
8 | * | |
9 | * Author: Oleksandr Andrushchenko <oleksandr_andrushchenko@epam.com> | |
10 | */ | |
11 | ||
12 | #ifndef __XEN_FRONT_PGDIR_SHBUF_H_ | |
13 | #define __XEN_FRONT_PGDIR_SHBUF_H_ | |
14 | ||
15 | #include <linux/kernel.h> | |
16 | ||
17 | #include <xen/grant_table.h> | |
18 | ||
19 | struct xen_front_pgdir_shbuf_ops; | |
20 | ||
21 | struct xen_front_pgdir_shbuf { | |
22 | /* | |
23 | * Number of references granted for the backend use: | |
24 | * | |
25 | * - for frontend allocated/imported buffers this holds the number | |
26 | * of grant references for the page directory and the pages | |
27 | * of the buffer | |
28 | * | |
29 | * - for the buffer provided by the backend this only holds the number | |
30 | * of grant references for the page directory itself as grant | |
31 | * references for the buffer will be provided by the backend. | |
32 | */ | |
33 | int num_grefs; | |
34 | grant_ref_t *grefs; | |
35 | /* Page directory backing storage. */ | |
36 | u8 *directory; | |
37 | ||
38 | /* | |
39 | * Number of pages for the shared buffer itself (excluding the page | |
40 | * directory). | |
41 | */ | |
42 | int num_pages; | |
43 | /* | |
44 | * Backing storage of the shared buffer: these are the pages being | |
45 | * shared. | |
46 | */ | |
47 | struct page **pages; | |
48 | ||
49 | struct xenbus_device *xb_dev; | |
50 | ||
51 | /* These are the ops used internally depending on be_alloc mode. */ | |
52 | const struct xen_front_pgdir_shbuf_ops *ops; | |
53 | ||
54 | /* Xen map handles for the buffer allocated by the backend. */ | |
55 | grant_handle_t *backend_map_handles; | |
56 | }; | |
57 | ||
58 | struct xen_front_pgdir_shbuf_cfg { | |
59 | struct xenbus_device *xb_dev; | |
60 | ||
61 | /* Number of pages of the buffer backing storage. */ | |
62 | int num_pages; | |
63 | /* Pages of the buffer to be shared. */ | |
64 | struct page **pages; | |
65 | ||
66 | /* | |
67 | * This is allocated outside because there are use-cases when | |
68 | * the buffer structure is allocated as a part of a bigger one. | |
69 | */ | |
70 | struct xen_front_pgdir_shbuf *pgdir; | |
71 | /* | |
72 | * Mode of grant reference sharing: if set then backend will share | |
73 | * grant references to the buffer with the frontend. | |
74 | */ | |
75 | int be_alloc; | |
76 | }; | |
77 | ||
78 | int xen_front_pgdir_shbuf_alloc(struct xen_front_pgdir_shbuf_cfg *cfg); | |
79 | ||
80 | grant_ref_t | |
81 | xen_front_pgdir_shbuf_get_dir_start(struct xen_front_pgdir_shbuf *buf); | |
82 | ||
83 | int xen_front_pgdir_shbuf_map(struct xen_front_pgdir_shbuf *buf); | |
84 | ||
85 | int xen_front_pgdir_shbuf_unmap(struct xen_front_pgdir_shbuf *buf); | |
86 | ||
87 | void xen_front_pgdir_shbuf_free(struct xen_front_pgdir_shbuf *buf); | |
88 | ||
89 | #endif /* __XEN_FRONT_PGDIR_SHBUF_H_ */ |