Lines Matching refs:ctrl

73 static int init_gnt_srv(struct libxenvchan *ctrl, int domain)  in init_gnt_srv()  argument
75 int pages_left = ctrl->read.order >= PAGE_SHIFT ? 1 << (ctrl->read.order - PAGE_SHIFT) : 0; in init_gnt_srv()
76 int pages_right = ctrl->write.order >= PAGE_SHIFT ? 1 << (ctrl->write.order - PAGE_SHIFT) : 0; in init_gnt_srv()
80 ring = xengntshr_share_page_notify(ctrl->gntshr, domain, in init_gnt_srv()
82 ctrl->event_port); in init_gnt_srv()
89 ctrl->ring = ring; in init_gnt_srv()
90 ctrl->read.shr = &ctrl->ring->left; in init_gnt_srv()
91 ctrl->write.shr = &ctrl->ring->right; in init_gnt_srv()
92 ctrl->ring->left_order = ctrl->read.order; in init_gnt_srv()
93 ctrl->ring->right_order = ctrl->write.order; in init_gnt_srv()
94 ctrl->ring->cli_live = 2; in init_gnt_srv()
95 ctrl->ring->srv_live = 1; in init_gnt_srv()
96 ctrl->ring->cli_notify = VCHAN_NOTIFY_WRITE; in init_gnt_srv()
98 switch (ctrl->read.order) { in init_gnt_srv()
100 ctrl->read.buffer = ((void*)ctrl->ring) + SMALL_RING_OFFSET; in init_gnt_srv()
103 ctrl->read.buffer = ((void*)ctrl->ring) + LARGE_RING_OFFSET; in init_gnt_srv()
106 ctrl->read.buffer = xengntshr_share_pages(ctrl->gntshr, domain, in init_gnt_srv()
107 pages_left, ctrl->ring->grants, 1); in init_gnt_srv()
108 if (!ctrl->read.buffer) in init_gnt_srv()
112 switch (ctrl->write.order) { in init_gnt_srv()
114 ctrl->write.buffer = ((void*)ctrl->ring) + SMALL_RING_OFFSET; in init_gnt_srv()
117 ctrl->write.buffer = ((void*)ctrl->ring) + LARGE_RING_OFFSET; in init_gnt_srv()
120 ctrl->write.buffer = xengntshr_share_pages(ctrl->gntshr, domain, in init_gnt_srv()
121 pages_right, ctrl->ring->grants + pages_left, 1); in init_gnt_srv()
122 if (!ctrl->write.buffer) in init_gnt_srv()
130 xengntshr_unshare(ctrl->gntshr, ctrl->read.buffer, pages_left); in init_gnt_srv()
132 xengntshr_unshare(ctrl->gntshr, ring, 1); in init_gnt_srv()
134 ctrl->ring = NULL; in init_gnt_srv()
135 ctrl->write.order = ctrl->read.order = 0; in init_gnt_srv()
139 static int init_gnt_cli(struct libxenvchan *ctrl, int domain, uint32_t ring_ref) in init_gnt_cli() argument
144 ctrl->ring = xengnttab_map_grant_ref_notify(ctrl->gnttab, in init_gnt_cli()
146 offsetof(struct vchan_interface, cli_live), ctrl->event_port); in init_gnt_cli()
148 if (!ctrl->ring) in init_gnt_cli()
151 ctrl->write.order = ctrl->ring->left_order; in init_gnt_cli()
152 ctrl->read.order = ctrl->ring->right_order; in init_gnt_cli()
153 ctrl->write.shr = &ctrl->ring->left; in init_gnt_cli()
154 ctrl->read.shr = &ctrl->ring->right; in init_gnt_cli()
155 if (ctrl->write.order < SMALL_RING_SHIFT || ctrl->write.order > MAX_RING_SHIFT) in init_gnt_cli()
157 if (ctrl->read.order < SMALL_RING_SHIFT || ctrl->read.order > MAX_RING_SHIFT) in init_gnt_cli()
159 if (ctrl->read.order == ctrl->write.order && ctrl->read.order < PAGE_SHIFT) in init_gnt_cli()
162 grants = ctrl->ring->grants; in init_gnt_cli()
164 switch (ctrl->write.order) { in init_gnt_cli()
166 ctrl->write.buffer = ((void*)ctrl->ring) + SMALL_RING_OFFSET; in init_gnt_cli()
169 ctrl->write.buffer = ((void*)ctrl->ring) + LARGE_RING_OFFSET; in init_gnt_cli()
173 int pages_left = 1 << (ctrl->write.order - PAGE_SHIFT); in init_gnt_cli()
174 ctrl->write.buffer = xengnttab_map_domain_grant_refs(ctrl->gnttab, in init_gnt_cli()
176 if (!ctrl->write.buffer) in init_gnt_cli()
182 switch (ctrl->read.order) { in init_gnt_cli()
184 ctrl->read.buffer = ((void*)ctrl->ring) + SMALL_RING_OFFSET; in init_gnt_cli()
187 ctrl->read.buffer = ((void*)ctrl->ring) + LARGE_RING_OFFSET; in init_gnt_cli()
191 int pages_right = 1 << (ctrl->read.order - PAGE_SHIFT); in init_gnt_cli()
192 ctrl->read.buffer = xengnttab_map_domain_grant_refs(ctrl->gnttab, in init_gnt_cli()
194 if (!ctrl->read.buffer) in init_gnt_cli()
203 if (ctrl->write.order >= PAGE_SHIFT) in init_gnt_cli()
204 xengnttab_unmap(ctrl->gnttab, ctrl->write.buffer, in init_gnt_cli()
205 1 << (ctrl->write.order - PAGE_SHIFT)); in init_gnt_cli()
207 xengnttab_unmap(ctrl->gnttab, ctrl->ring, 1); in init_gnt_cli()
208 ctrl->ring = 0; in init_gnt_cli()
209 ctrl->write.order = ctrl->read.order = 0; in init_gnt_cli()
214 static int init_evt_srv(struct libxenvchan *ctrl, int domain, in init_evt_srv() argument
219 ctrl->event = xenevtchn_open(logger, 0); in init_evt_srv()
220 if (!ctrl->event) in init_evt_srv()
223 port = xenevtchn_bind_unbound_port(ctrl->event, domain); in init_evt_srv()
226 ctrl->event_port = port; in init_evt_srv()
228 if (xenevtchn_unmask(ctrl->event, ctrl->event_port)) in init_evt_srv()
235 xenevtchn_unbind(ctrl->event, port); in init_evt_srv()
237 xenevtchn_close(ctrl->event); in init_evt_srv()
238 ctrl->event = NULL; in init_evt_srv()
243 static int init_xs_srv(struct libxenvchan *ctrl, int domain, const char* xs_base, int ring_ref) in init_xs_srv() argument
254 ctrl->xs_path = strdup(xs_base); in init_xs_srv()
255 if (!ctrl->xs_path) in init_xs_srv()
285 snprintf(ref, sizeof ref, "%d", ctrl->event_port); in init_xs_srv()
305 void close_xs_srv(struct libxenvchan *ctrl) in close_xs_srv() argument
309 if (!ctrl->xs_path) in close_xs_srv()
314 xs_rm(xs, XBT_NULL, ctrl->xs_path); in close_xs_srv()
318 free(ctrl->xs_path); in close_xs_srv()
333 struct libxenvchan *ctrl; in libxenvchan_server_init() local
338 ctrl = malloc(sizeof(*ctrl)); in libxenvchan_server_init()
339 if (!ctrl) in libxenvchan_server_init()
342 ctrl->ring = NULL; in libxenvchan_server_init()
343 ctrl->event = NULL; in libxenvchan_server_init()
344 ctrl->is_server = 1; in libxenvchan_server_init()
345 ctrl->server_persist = 0; in libxenvchan_server_init()
347 ctrl->read.order = min_order(left_min); in libxenvchan_server_init()
348 ctrl->write.order = min_order(right_min); in libxenvchan_server_init()
352 ctrl->read.order = SMALL_RING_SHIFT; in libxenvchan_server_init()
353 ctrl->write.order = LARGE_RING_SHIFT; in libxenvchan_server_init()
355 ctrl->read.order = LARGE_RING_SHIFT; in libxenvchan_server_init()
356 ctrl->write.order = SMALL_RING_SHIFT; in libxenvchan_server_init()
358 ctrl->read.order = LARGE_RING_SHIFT; in libxenvchan_server_init()
360 ctrl->write.order = LARGE_RING_SHIFT; in libxenvchan_server_init()
363 ctrl->gntshr = xengntshr_open(logger, 0); in libxenvchan_server_init()
364 if (!ctrl->gntshr) { in libxenvchan_server_init()
365 free(ctrl); in libxenvchan_server_init()
369 if (init_evt_srv(ctrl, domain, logger)) in libxenvchan_server_init()
371 ring_ref = init_gnt_srv(ctrl, domain); in libxenvchan_server_init()
374 if (init_xs_srv(ctrl, domain, xs_path, ring_ref)) in libxenvchan_server_init()
376 return ctrl; in libxenvchan_server_init()
378 libxenvchan_close(ctrl); in libxenvchan_server_init()
382 static int init_evt_cli(struct libxenvchan *ctrl, int domain, in init_evt_cli() argument
387 ctrl->event = xenevtchn_open(logger, 0); in init_evt_cli()
388 if (!ctrl->event) in init_evt_cli()
391 port = xenevtchn_bind_interdomain(ctrl->event, in init_evt_cli()
392 domain, ctrl->event_port); in init_evt_cli()
395 ctrl->event_port = port; in init_evt_cli()
397 if (xenevtchn_unmask(ctrl->event, ctrl->event_port)) in init_evt_cli()
404 xenevtchn_unbind(ctrl->event, port); in init_evt_cli()
406 xenevtchn_close(ctrl->event); in init_evt_cli()
407 ctrl->event = NULL; in init_evt_cli()
416 struct libxenvchan *ctrl = malloc(sizeof(struct libxenvchan)); in libxenvchan_client_init() local
423 if (!ctrl) in libxenvchan_client_init()
425 ctrl->ring = NULL; in libxenvchan_client_init()
426 ctrl->event = NULL; in libxenvchan_client_init()
427 ctrl->gnttab = NULL; in libxenvchan_client_init()
428 ctrl->write.order = ctrl->read.order = 0; in libxenvchan_client_init()
429 ctrl->is_server = 0; in libxenvchan_client_init()
448 ctrl->event_port = atoi(ref); in libxenvchan_client_init()
450 if (!ctrl->event_port) in libxenvchan_client_init()
453 ctrl->gnttab = xengnttab_open(logger, 0); in libxenvchan_client_init()
454 if (!ctrl->gnttab) in libxenvchan_client_init()
458 if (init_evt_cli(ctrl, domain, logger)) in libxenvchan_client_init()
462 if (init_gnt_cli(ctrl, domain, ring_ref)) in libxenvchan_client_init()
465 ctrl->ring->cli_live = 1; in libxenvchan_client_init()
466 ctrl->ring->srv_notify = VCHAN_NOTIFY_WRITE; in libxenvchan_client_init()
469 xenevtchn_notify(ctrl->event, ctrl->event_port); in libxenvchan_client_init()
474 return ctrl; in libxenvchan_client_init()
476 libxenvchan_close(ctrl); in libxenvchan_client_init()
477 ctrl = NULL; in libxenvchan_client_init()