1#if !defined(IB_PEER_MEM_H)
2#define IB_PEER_MEM_H
3
4#include <rdma/peer_mem.h>
5
6
7struct invalidation_ctx;
8struct ib_ucontext;
9
10struct ib_peer_memory_statistics {
11	unsigned long num_alloc_mrs;
12	unsigned long num_dealloc_mrs;
13	unsigned long num_reg_pages;
14	unsigned long num_dereg_pages;
15	unsigned long num_free_callbacks;
16};
17
18struct ib_peer_memory_client {
19	const struct peer_memory_client *peer_mem;
20
21	struct list_head	core_peer_list;
22	struct list_head    core_ticket_list;
23	unsigned long last_ticket;
24#ifdef __FreeBSD__
25	int holdcount;
26	int needwakeup;
27	struct cv peer_cv;
28#else
29	struct srcu_struct peer_srcu;
30#endif
31	struct mutex lock;
32	struct kobject *kobj;
33	struct attribute_group peer_mem_attr_group;
34	struct ib_peer_memory_statistics stats;
35};
36
37struct core_ticket {
38	unsigned long key;
39	void *context;
40	struct list_head   ticket_list;
41};
42
43struct ib_peer_memory_client *ib_get_peer_client(struct ib_ucontext *context, unsigned long addr,
44						  size_t size, void **peer_client_context,
45						  int *srcu_key);
46
47void ib_put_peer_client(struct ib_peer_memory_client *ib_peer_client,
48				void *peer_client_context,
49				int srcu_key);
50
51unsigned long ib_peer_insert_context(struct ib_peer_memory_client *ib_peer_client,
52				void *context);
53int ib_peer_remove_context(struct ib_peer_memory_client *ib_peer_client,
54				unsigned long key);
55struct core_ticket *ib_peer_search_context(struct ib_peer_memory_client *ib_peer_client,
56						unsigned long key);
57#endif
58
59
60