• Home
  • Raw
  • Download

Lines Matching refs:entry

900 	struct qp_entry *entry;  in qp_list_find()  local
905 list_for_each_entry(entry, &qp_list->head, list_item) { in qp_list_find()
906 if (vmci_handle_is_equal(entry->handle, handle)) in qp_list_find()
907 return entry; in qp_list_find()
919 struct qp_guest_endpoint *entry; in qp_guest_handle_to_entry() local
922 entry = qp ? container_of( in qp_guest_handle_to_entry()
924 return entry; in qp_guest_handle_to_entry()
933 struct qp_broker_entry *entry; in qp_broker_handle_to_entry() local
936 entry = qp ? container_of( in qp_broker_handle_to_entry()
938 return entry; in qp_broker_handle_to_entry()
979 struct qp_guest_endpoint *entry; in qp_guest_endpoint_create() local
990 entry = kzalloc(sizeof(*entry), GFP_KERNEL); in qp_guest_endpoint_create()
991 if (entry) { in qp_guest_endpoint_create()
992 entry->qp.peer = peer; in qp_guest_endpoint_create()
993 entry->qp.flags = flags; in qp_guest_endpoint_create()
994 entry->qp.produce_size = produce_size; in qp_guest_endpoint_create()
995 entry->qp.consume_size = consume_size; in qp_guest_endpoint_create()
996 entry->qp.ref_count = 0; in qp_guest_endpoint_create()
997 entry->num_ppns = num_ppns; in qp_guest_endpoint_create()
998 entry->produce_q = produce_q; in qp_guest_endpoint_create()
999 entry->consume_q = consume_q; in qp_guest_endpoint_create()
1000 INIT_LIST_HEAD(&entry->qp.list_item); in qp_guest_endpoint_create()
1003 result = vmci_resource_add(&entry->resource, in qp_guest_endpoint_create()
1006 entry->qp.handle = vmci_resource_handle(&entry->resource); in qp_guest_endpoint_create()
1008 qp_list_find(&qp_guest_endpoints, entry->qp.handle)) { in qp_guest_endpoint_create()
1011 kfree(entry); in qp_guest_endpoint_create()
1012 entry = NULL; in qp_guest_endpoint_create()
1015 return entry; in qp_guest_endpoint_create()
1021 static void qp_guest_endpoint_destroy(struct qp_guest_endpoint *entry) in qp_guest_endpoint_destroy() argument
1023 qp_free_ppn_set(&entry->ppn_set); in qp_guest_endpoint_destroy()
1024 qp_cleanup_queue_mutex(entry->produce_q, entry->consume_q); in qp_guest_endpoint_destroy()
1025 qp_free_queue(entry->produce_q, entry->qp.produce_size); in qp_guest_endpoint_destroy()
1026 qp_free_queue(entry->consume_q, entry->qp.consume_size); in qp_guest_endpoint_destroy()
1028 vmci_resource_remove(&entry->resource); in qp_guest_endpoint_destroy()
1030 kfree(entry); in qp_guest_endpoint_destroy()
1037 static int qp_alloc_hypercall(const struct qp_guest_endpoint *entry) in qp_alloc_hypercall() argument
1043 if (!entry || entry->num_ppns <= 2) in qp_alloc_hypercall()
1047 (size_t) entry->num_ppns * sizeof(u32); in qp_alloc_hypercall()
1056 alloc_msg->handle = entry->qp.handle; in qp_alloc_hypercall()
1057 alloc_msg->peer = entry->qp.peer; in qp_alloc_hypercall()
1058 alloc_msg->flags = entry->qp.flags; in qp_alloc_hypercall()
1059 alloc_msg->produce_size = entry->qp.produce_size; in qp_alloc_hypercall()
1060 alloc_msg->consume_size = entry->qp.consume_size; in qp_alloc_hypercall()
1061 alloc_msg->num_ppns = entry->num_ppns; in qp_alloc_hypercall()
1064 &entry->ppn_set); in qp_alloc_hypercall()
1093 static void qp_list_add_entry(struct qp_list *qp_list, struct qp_entry *entry) in qp_list_add_entry() argument
1095 if (entry) in qp_list_add_entry()
1096 list_add(&entry->list_item, &qp_list->head); in qp_list_add_entry()
1103 struct qp_entry *entry) in qp_list_remove_entry() argument
1105 if (entry) in qp_list_remove_entry()
1106 list_del(&entry->list_item); in qp_list_remove_entry()
1116 struct qp_guest_endpoint *entry; in qp_detatch_guest_work() local
1121 entry = qp_guest_handle_to_entry(handle); in qp_detatch_guest_work()
1122 if (!entry) { in qp_detatch_guest_work()
1127 if (entry->qp.flags & VMCI_QPFLAG_LOCAL) { in qp_detatch_guest_work()
1130 if (entry->qp.ref_count > 1) { in qp_detatch_guest_work()
1162 entry->qp.ref_count--; in qp_detatch_guest_work()
1163 if (entry->qp.ref_count == 0) in qp_detatch_guest_work()
1164 qp_list_remove_entry(&qp_guest_endpoints, &entry->qp); in qp_detatch_guest_work()
1167 if (entry) in qp_detatch_guest_work()
1168 ref_count = entry->qp.ref_count; in qp_detatch_guest_work()
1173 qp_guest_endpoint_destroy(entry); in qp_detatch_guest_work()
1383 struct qp_broker_entry *entry = NULL; in qp_broker_create() local
1411 entry = kzalloc(sizeof(*entry), GFP_ATOMIC); in qp_broker_create()
1412 if (!entry) in qp_broker_create()
1431 entry->qp.handle = handle; in qp_broker_create()
1432 entry->qp.peer = peer; in qp_broker_create()
1433 entry->qp.flags = flags; in qp_broker_create()
1434 entry->qp.produce_size = guest_produce_size; in qp_broker_create()
1435 entry->qp.consume_size = guest_consume_size; in qp_broker_create()
1436 entry->qp.ref_count = 1; in qp_broker_create()
1437 entry->create_id = context_id; in qp_broker_create()
1438 entry->attach_id = VMCI_INVALID_ID; in qp_broker_create()
1439 entry->state = VMCIQPB_NEW; in qp_broker_create()
1440 entry->require_trusted_attach = in qp_broker_create()
1442 entry->created_by_trusted = in qp_broker_create()
1444 entry->vmci_page_files = false; in qp_broker_create()
1445 entry->wakeup_cb = wakeup_cb; in qp_broker_create()
1446 entry->client_data = client_data; in qp_broker_create()
1447 entry->produce_q = qp_host_alloc_queue(guest_produce_size); in qp_broker_create()
1448 if (entry->produce_q == NULL) { in qp_broker_create()
1452 entry->consume_q = qp_host_alloc_queue(guest_consume_size); in qp_broker_create()
1453 if (entry->consume_q == NULL) { in qp_broker_create()
1458 qp_init_queue_mutex(entry->produce_q, entry->consume_q); in qp_broker_create()
1460 INIT_LIST_HEAD(&entry->qp.list_item); in qp_broker_create()
1465 entry->local_mem = kcalloc(QPE_NUM_PAGES(entry->qp), in qp_broker_create()
1467 if (entry->local_mem == NULL) { in qp_broker_create()
1471 entry->state = VMCIQPB_CREATED_MEM; in qp_broker_create()
1472 entry->produce_q->q_header = entry->local_mem; in qp_broker_create()
1473 tmp = (u8 *)entry->local_mem + PAGE_SIZE * in qp_broker_create()
1474 (DIV_ROUND_UP(entry->qp.produce_size, PAGE_SIZE) + 1); in qp_broker_create()
1475 entry->consume_q->q_header = (struct vmci_queue_header *)tmp; in qp_broker_create()
1482 entry->produce_q, in qp_broker_create()
1483 entry->consume_q); in qp_broker_create()
1487 entry->state = VMCIQPB_CREATED_MEM; in qp_broker_create()
1496 entry->state = VMCIQPB_CREATED_NO_MEM; in qp_broker_create()
1499 qp_list_add_entry(&qp_broker_list, &entry->qp); in qp_broker_create()
1501 *ent = entry; in qp_broker_create()
1504 result = vmci_resource_add(&entry->resource, in qp_broker_create()
1513 entry->qp.handle = vmci_resource_handle(&entry->resource); in qp_broker_create()
1515 vmci_q_header_init(entry->produce_q->q_header, in qp_broker_create()
1516 entry->qp.handle); in qp_broker_create()
1517 vmci_q_header_init(entry->consume_q->q_header, in qp_broker_create()
1518 entry->qp.handle); in qp_broker_create()
1521 vmci_ctx_qp_create(context, entry->qp.handle); in qp_broker_create()
1526 if (entry != NULL) { in qp_broker_create()
1527 qp_host_free_queue(entry->produce_q, guest_produce_size); in qp_broker_create()
1528 qp_host_free_queue(entry->consume_q, guest_consume_size); in qp_broker_create()
1529 kfree(entry); in qp_broker_create()
1600 static int qp_broker_attach(struct qp_broker_entry *entry, in qp_broker_attach() argument
1616 if (entry->state != VMCIQPB_CREATED_NO_MEM && in qp_broker_attach()
1617 entry->state != VMCIQPB_CREATED_MEM) in qp_broker_attach()
1621 if (!(entry->qp.flags & VMCI_QPFLAG_LOCAL) || in qp_broker_attach()
1622 context_id != entry->create_id) { in qp_broker_attach()
1625 } else if (context_id == entry->create_id || in qp_broker_attach()
1626 context_id == entry->attach_id) { in qp_broker_attach()
1631 VMCI_CONTEXT_IS_VM(entry->create_id)) in qp_broker_attach()
1639 !entry->created_by_trusted) in qp_broker_attach()
1646 if (entry->require_trusted_attach && in qp_broker_attach()
1654 if (entry->qp.peer != VMCI_INVALID_ID && entry->qp.peer != context_id) in qp_broker_attach()
1657 if (entry->create_id == VMCI_HOST_CONTEXT_ID) { in qp_broker_attach()
1675 create_context = vmci_ctx_get(entry->create_id); in qp_broker_attach()
1683 if ((entry->qp.flags & ~VMCI_QP_ASYMM) != (flags & ~VMCI_QP_ASYMM_PEER)) in qp_broker_attach()
1693 if (entry->qp.produce_size != produce_size || in qp_broker_attach()
1694 entry->qp.consume_size != consume_size) { in qp_broker_attach()
1697 } else if (entry->qp.produce_size != consume_size || in qp_broker_attach()
1698 entry->qp.consume_size != produce_size) { in qp_broker_attach()
1716 if (entry->state != VMCIQPB_CREATED_NO_MEM) in qp_broker_attach()
1728 entry->produce_q, in qp_broker_attach()
1729 entry->consume_q); in qp_broker_attach()
1733 entry->state = VMCIQPB_ATTACHED_MEM; in qp_broker_attach()
1735 entry->state = VMCIQPB_ATTACHED_NO_MEM; in qp_broker_attach()
1737 } else if (entry->state == VMCIQPB_CREATED_NO_MEM) { in qp_broker_attach()
1748 entry->state = VMCIQPB_ATTACHED_MEM; in qp_broker_attach()
1751 if (entry->state == VMCIQPB_ATTACHED_MEM) { in qp_broker_attach()
1753 qp_notify_peer(true, entry->qp.handle, context_id, in qp_broker_attach()
1754 entry->create_id); in qp_broker_attach()
1757 entry->create_id, entry->qp.handle.context, in qp_broker_attach()
1758 entry->qp.handle.resource); in qp_broker_attach()
1761 entry->attach_id = context_id; in qp_broker_attach()
1762 entry->qp.ref_count++; in qp_broker_attach()
1764 entry->wakeup_cb = wakeup_cb; in qp_broker_attach()
1765 entry->client_data = client_data; in qp_broker_attach()
1773 vmci_ctx_qp_create(context, entry->qp.handle); in qp_broker_attach()
1776 *ent = entry; in qp_broker_attach()
1800 struct qp_broker_entry *entry = NULL; in qp_broker_alloc() local
1830 entry = qp_broker_handle_to_entry(handle); in qp_broker_alloc()
1832 if (!entry) { in qp_broker_alloc()
1841 qp_broker_attach(entry, peer, flags, priv_flags, in qp_broker_alloc()
1872 struct qp_broker_entry *entry; in qp_alloc_host_work() local
1883 entry = NULL; in qp_alloc_host_work()
1887 wakeup_cb, client_data, &entry, &swap); in qp_alloc_host_work()
1896 *produce_q = entry->consume_q; in qp_alloc_host_work()
1897 *consume_q = entry->produce_q; in qp_alloc_host_work()
1899 *produce_q = entry->produce_q; in qp_alloc_host_work()
1900 *consume_q = entry->consume_q; in qp_alloc_host_work()
1903 *handle = vmci_resource_handle(&entry->resource); in qp_alloc_host_work()
1986 struct qp_entry *entry = in qp_list_get_head() local
1989 return entry; in qp_list_get_head()
1997 struct qp_entry *entry; in vmci_qp_broker_exit() local
2002 while ((entry = qp_list_get_head(&qp_broker_list))) { in vmci_qp_broker_exit()
2003 be = (struct qp_broker_entry *)entry; in vmci_qp_broker_exit()
2005 qp_list_remove_entry(&qp_broker_list, entry); in vmci_qp_broker_exit()
2054 struct qp_broker_entry *entry; in vmci_qp_broker_set_page_store() local
2079 entry = qp_broker_handle_to_entry(handle); in vmci_qp_broker_set_page_store()
2080 if (!entry) { in vmci_qp_broker_set_page_store()
2091 if (entry->create_id != context_id && in vmci_qp_broker_set_page_store()
2092 (entry->create_id != VMCI_HOST_CONTEXT_ID || in vmci_qp_broker_set_page_store()
2093 entry->attach_id != context_id)) { in vmci_qp_broker_set_page_store()
2098 if (entry->state != VMCIQPB_CREATED_NO_MEM && in vmci_qp_broker_set_page_store()
2099 entry->state != VMCIQPB_ATTACHED_NO_MEM) { in vmci_qp_broker_set_page_store()
2105 entry->produce_q, entry->consume_q); in vmci_qp_broker_set_page_store()
2109 result = qp_host_map_queues(entry->produce_q, entry->consume_q); in vmci_qp_broker_set_page_store()
2111 qp_host_unregister_user_memory(entry->produce_q, in vmci_qp_broker_set_page_store()
2112 entry->consume_q); in vmci_qp_broker_set_page_store()
2116 if (entry->state == VMCIQPB_CREATED_NO_MEM) in vmci_qp_broker_set_page_store()
2117 entry->state = VMCIQPB_CREATED_MEM; in vmci_qp_broker_set_page_store()
2119 entry->state = VMCIQPB_ATTACHED_MEM; in vmci_qp_broker_set_page_store()
2121 entry->vmci_page_files = true; in vmci_qp_broker_set_page_store()
2123 if (entry->state == VMCIQPB_ATTACHED_MEM) { in vmci_qp_broker_set_page_store()
2125 qp_notify_peer(true, handle, context_id, entry->create_id); in vmci_qp_broker_set_page_store()
2128 entry->create_id, entry->qp.handle.context, in vmci_qp_broker_set_page_store()
2129 entry->qp.handle.resource); in vmci_qp_broker_set_page_store()
2144 static void qp_reset_saved_headers(struct qp_broker_entry *entry) in qp_reset_saved_headers() argument
2146 entry->produce_q->saved_header = NULL; in qp_reset_saved_headers()
2147 entry->consume_q->saved_header = NULL; in qp_reset_saved_headers()
2170 struct qp_broker_entry *entry; in vmci_qp_broker_detach() local
2190 entry = qp_broker_handle_to_entry(handle); in vmci_qp_broker_detach()
2191 if (!entry) { in vmci_qp_broker_detach()
2198 if (context_id != entry->create_id && context_id != entry->attach_id) { in vmci_qp_broker_detach()
2203 if (context_id == entry->create_id) { in vmci_qp_broker_detach()
2204 peer_id = entry->attach_id; in vmci_qp_broker_detach()
2205 entry->create_id = VMCI_INVALID_ID; in vmci_qp_broker_detach()
2207 peer_id = entry->create_id; in vmci_qp_broker_detach()
2208 entry->attach_id = VMCI_INVALID_ID; in vmci_qp_broker_detach()
2210 entry->qp.ref_count--; in vmci_qp_broker_detach()
2212 is_local = entry->qp.flags & VMCI_QPFLAG_LOCAL; in vmci_qp_broker_detach()
2225 qp_acquire_queue_mutex(entry->produce_q); in vmci_qp_broker_detach()
2226 headers_mapped = entry->produce_q->q_header || in vmci_qp_broker_detach()
2227 entry->consume_q->q_header; in vmci_qp_broker_detach()
2228 if (QPBROKERSTATE_HAS_MEM(entry)) { in vmci_qp_broker_detach()
2231 entry->produce_q, in vmci_qp_broker_detach()
2232 entry->consume_q); in vmci_qp_broker_detach()
2238 qp_host_unregister_user_memory(entry->produce_q, in vmci_qp_broker_detach()
2239 entry->consume_q); in vmci_qp_broker_detach()
2244 qp_reset_saved_headers(entry); in vmci_qp_broker_detach()
2246 qp_release_queue_mutex(entry->produce_q); in vmci_qp_broker_detach()
2248 if (!headers_mapped && entry->wakeup_cb) in vmci_qp_broker_detach()
2249 entry->wakeup_cb(entry->client_data); in vmci_qp_broker_detach()
2252 if (entry->wakeup_cb) { in vmci_qp_broker_detach()
2253 entry->wakeup_cb = NULL; in vmci_qp_broker_detach()
2254 entry->client_data = NULL; in vmci_qp_broker_detach()
2258 if (entry->qp.ref_count == 0) { in vmci_qp_broker_detach()
2259 qp_list_remove_entry(&qp_broker_list, &entry->qp); in vmci_qp_broker_detach()
2262 kfree(entry->local_mem); in vmci_qp_broker_detach()
2264 qp_cleanup_queue_mutex(entry->produce_q, entry->consume_q); in vmci_qp_broker_detach()
2265 qp_host_free_queue(entry->produce_q, entry->qp.produce_size); in vmci_qp_broker_detach()
2266 qp_host_free_queue(entry->consume_q, entry->qp.consume_size); in vmci_qp_broker_detach()
2268 vmci_resource_remove(&entry->resource); in vmci_qp_broker_detach()
2270 kfree(entry); in vmci_qp_broker_detach()
2276 QPBROKERSTATE_HAS_MEM(entry)) { in vmci_qp_broker_detach()
2277 entry->state = VMCIQPB_SHUTDOWN_MEM; in vmci_qp_broker_detach()
2279 entry->state = VMCIQPB_SHUTDOWN_NO_MEM; in vmci_qp_broker_detach()
2302 struct qp_broker_entry *entry; in vmci_qp_broker_map() local
2320 entry = qp_broker_handle_to_entry(handle); in vmci_qp_broker_map()
2321 if (!entry) { in vmci_qp_broker_map()
2328 if (context_id != entry->create_id && context_id != entry->attach_id) { in vmci_qp_broker_map()
2333 is_local = entry->qp.flags & VMCI_QPFLAG_LOCAL; in vmci_qp_broker_map()
2340 page_store.len = QPE_NUM_PAGES(entry->qp); in vmci_qp_broker_map()
2342 qp_acquire_queue_mutex(entry->produce_q); in vmci_qp_broker_map()
2343 qp_reset_saved_headers(entry); in vmci_qp_broker_map()
2346 entry->produce_q, in vmci_qp_broker_map()
2347 entry->consume_q); in vmci_qp_broker_map()
2348 qp_release_queue_mutex(entry->produce_q); in vmci_qp_broker_map()
2352 entry->state++; in vmci_qp_broker_map()
2354 if (entry->wakeup_cb) in vmci_qp_broker_map()
2355 entry->wakeup_cb(entry->client_data); in vmci_qp_broker_map()
2371 static int qp_save_headers(struct qp_broker_entry *entry) in qp_save_headers() argument
2375 if (entry->produce_q->saved_header != NULL && in qp_save_headers()
2376 entry->consume_q->saved_header != NULL) { in qp_save_headers()
2386 if (NULL == entry->produce_q->q_header || in qp_save_headers()
2387 NULL == entry->consume_q->q_header) { in qp_save_headers()
2388 result = qp_host_map_queues(entry->produce_q, entry->consume_q); in qp_save_headers()
2393 memcpy(&entry->saved_produce_q, entry->produce_q->q_header, in qp_save_headers()
2394 sizeof(entry->saved_produce_q)); in qp_save_headers()
2395 entry->produce_q->saved_header = &entry->saved_produce_q; in qp_save_headers()
2396 memcpy(&entry->saved_consume_q, entry->consume_q->q_header, in qp_save_headers()
2397 sizeof(entry->saved_consume_q)); in qp_save_headers()
2398 entry->consume_q->saved_header = &entry->saved_consume_q; in qp_save_headers()
2413 struct qp_broker_entry *entry; in vmci_qp_broker_unmap() local
2431 entry = qp_broker_handle_to_entry(handle); in vmci_qp_broker_unmap()
2432 if (!entry) { in vmci_qp_broker_unmap()
2439 if (context_id != entry->create_id && context_id != entry->attach_id) { in vmci_qp_broker_unmap()
2444 is_local = entry->qp.flags & VMCI_QPFLAG_LOCAL; in vmci_qp_broker_unmap()
2447 qp_acquire_queue_mutex(entry->produce_q); in vmci_qp_broker_unmap()
2448 result = qp_save_headers(entry); in vmci_qp_broker_unmap()
2453 qp_host_unmap_queues(gid, entry->produce_q, entry->consume_q); in vmci_qp_broker_unmap()
2462 qp_host_unregister_user_memory(entry->produce_q, in vmci_qp_broker_unmap()
2463 entry->consume_q); in vmci_qp_broker_unmap()
2468 entry->state--; in vmci_qp_broker_unmap()
2470 qp_release_queue_mutex(entry->produce_q); in vmci_qp_broker_unmap()
2488 struct qp_entry *entry; in vmci_qp_guest_endpoints_exit() local
2493 while ((entry = qp_list_get_head(&qp_guest_endpoints))) { in vmci_qp_guest_endpoints_exit()
2494 ep = (struct qp_guest_endpoint *)entry; in vmci_qp_guest_endpoints_exit()
2497 if (!(entry->flags & VMCI_QPFLAG_LOCAL)) in vmci_qp_guest_endpoints_exit()
2498 qp_detatch_hypercall(entry->handle); in vmci_qp_guest_endpoints_exit()
2501 entry->ref_count = 0; in vmci_qp_guest_endpoints_exit()
2502 qp_list_remove_entry(&qp_guest_endpoints, entry); in vmci_qp_guest_endpoints_exit()