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_ */ |
90 | |