1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41#define DEBUG_SUBSYSTEM S_LNET
42
43#include "../../include/linux/lnet/lib-lnet.h"
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75int
76LNetMEAttach(unsigned int portal,
77 lnet_process_id_t match_id,
78 __u64 match_bits, __u64 ignore_bits,
79 lnet_unlink_t unlink, lnet_ins_pos_t pos,
80 lnet_handle_me_t *handle)
81{
82 struct lnet_match_table *mtable;
83 struct lnet_me *me;
84 struct list_head *head;
85
86 LASSERT(the_lnet.ln_init);
87 LASSERT(the_lnet.ln_refcount > 0);
88
89 if ((int)portal >= the_lnet.ln_nportals)
90 return -EINVAL;
91
92 mtable = lnet_mt_of_attach(portal, match_id,
93 match_bits, ignore_bits, pos);
94 if (mtable == NULL)
95 return -EPERM;
96
97 me = lnet_me_alloc();
98 if (me == NULL)
99 return -ENOMEM;
100
101 lnet_res_lock(mtable->mt_cpt);
102
103 me->me_portal = portal;
104 me->me_match_id = match_id;
105 me->me_match_bits = match_bits;
106 me->me_ignore_bits = ignore_bits;
107 me->me_unlink = unlink;
108 me->me_md = NULL;
109
110 lnet_res_lh_initialize(the_lnet.ln_me_containers[mtable->mt_cpt],
111 &me->me_lh);
112 if (ignore_bits != 0)
113 head = &mtable->mt_mhash[LNET_MT_HASH_IGNORE];
114 else
115 head = lnet_mt_match_head(mtable, match_id, match_bits);
116
117 me->me_pos = head - &mtable->mt_mhash[0];
118 if (pos == LNET_INS_AFTER || pos == LNET_INS_LOCAL)
119 list_add_tail(&me->me_list, head);
120 else
121 list_add(&me->me_list, head);
122
123 lnet_me2handle(handle, me);
124
125 lnet_res_unlock(mtable->mt_cpt);
126 return 0;
127}
128EXPORT_SYMBOL(LNetMEAttach);
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147int
148LNetMEInsert(lnet_handle_me_t current_meh,
149 lnet_process_id_t match_id,
150 __u64 match_bits, __u64 ignore_bits,
151 lnet_unlink_t unlink, lnet_ins_pos_t pos,
152 lnet_handle_me_t *handle)
153{
154 struct lnet_me *current_me;
155 struct lnet_me *new_me;
156 struct lnet_portal *ptl;
157 int cpt;
158
159 LASSERT(the_lnet.ln_init);
160 LASSERT(the_lnet.ln_refcount > 0);
161
162 if (pos == LNET_INS_LOCAL)
163 return -EPERM;
164
165 new_me = lnet_me_alloc();
166 if (new_me == NULL)
167 return -ENOMEM;
168
169 cpt = lnet_cpt_of_cookie(current_meh.cookie);
170
171 lnet_res_lock(cpt);
172
173 current_me = lnet_handle2me(¤t_meh);
174 if (current_me == NULL) {
175 lnet_me_free_locked(new_me);
176
177 lnet_res_unlock(cpt);
178 return -ENOENT;
179 }
180
181 LASSERT(current_me->me_portal < the_lnet.ln_nportals);
182
183 ptl = the_lnet.ln_portals[current_me->me_portal];
184 if (lnet_ptl_is_unique(ptl)) {
185
186 lnet_me_free_locked(new_me);
187 lnet_res_unlock(cpt);
188 return -EPERM;
189 }
190
191 new_me->me_pos = current_me->me_pos;
192 new_me->me_portal = current_me->me_portal;
193 new_me->me_match_id = match_id;
194 new_me->me_match_bits = match_bits;
195 new_me->me_ignore_bits = ignore_bits;
196 new_me->me_unlink = unlink;
197 new_me->me_md = NULL;
198
199 lnet_res_lh_initialize(the_lnet.ln_me_containers[cpt], &new_me->me_lh);
200
201 if (pos == LNET_INS_AFTER)
202 list_add(&new_me->me_list, ¤t_me->me_list);
203 else
204 list_add_tail(&new_me->me_list, ¤t_me->me_list);
205
206 lnet_me2handle(handle, new_me);
207
208 lnet_res_unlock(cpt);
209
210 return 0;
211}
212EXPORT_SYMBOL(LNetMEInsert);
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228int
229LNetMEUnlink(lnet_handle_me_t meh)
230{
231 lnet_me_t *me;
232 lnet_libmd_t *md;
233 lnet_event_t ev;
234 int cpt;
235
236 LASSERT(the_lnet.ln_init);
237 LASSERT(the_lnet.ln_refcount > 0);
238
239 cpt = lnet_cpt_of_cookie(meh.cookie);
240 lnet_res_lock(cpt);
241
242 me = lnet_handle2me(&meh);
243 if (me == NULL) {
244 lnet_res_unlock(cpt);
245 return -ENOENT;
246 }
247
248 md = me->me_md;
249 if (md != NULL) {
250 md->md_flags |= LNET_MD_FLAG_ABORTED;
251 if (md->md_eq != NULL && md->md_refcount == 0) {
252 lnet_build_unlink_event(md, &ev);
253 lnet_eq_enqueue_event(md->md_eq, &ev);
254 }
255 }
256
257 lnet_me_unlink(me);
258
259 lnet_res_unlock(cpt);
260 return 0;
261}
262EXPORT_SYMBOL(LNetMEUnlink);
263
264
265void
266lnet_me_unlink(lnet_me_t *me)
267{
268 list_del(&me->me_list);
269
270 if (me->me_md != NULL) {
271 lnet_libmd_t *md = me->me_md;
272
273
274 lnet_ptl_detach_md(me, md);
275 lnet_md_unlink(md);
276 }
277
278 lnet_res_lh_invalidate(&me->me_lh);
279 lnet_me_free_locked(me);
280}
281
282#if 0
283static void
284lib_me_dump(lnet_me_t *me)
285{
286 CWARN("Match Entry %p (%#llx)\n", me,
287 me->me_lh.lh_cookie);
288
289 CWARN("\tMatch/Ignore\t= %016lx / %016lx\n",
290 me->me_match_bits, me->me_ignore_bits);
291
292 CWARN("\tMD\t= %p\n", me->md);
293 CWARN("\tprev\t= %p\n",
294 list_entry(me->me_list.prev, lnet_me_t, me_list));
295 CWARN("\tnext\t= %p\n",
296 list_entry(me->me_list.next, lnet_me_t, me_list));
297}
298#endif
299