Lines Matching refs:context
48 static void ctx_signal_notify(struct vmci_ctx *context) in ctx_signal_notify() argument
50 *context->notify = true; in ctx_signal_notify()
53 static void ctx_clear_notify(struct vmci_ctx *context) in ctx_clear_notify() argument
55 *context->notify = false; in ctx_clear_notify()
62 static void ctx_clear_notify_call(struct vmci_ctx *context) in ctx_clear_notify_call() argument
64 if (context->pending_datagrams == 0 && in ctx_clear_notify_call()
65 vmci_handle_arr_get_size(context->pending_doorbell_array) == 0) in ctx_clear_notify_call()
66 ctx_clear_notify(context); in ctx_clear_notify_call()
73 void vmci_ctx_check_signal_notify(struct vmci_ctx *context) in vmci_ctx_check_signal_notify() argument
75 spin_lock(&context->lock); in vmci_ctx_check_signal_notify()
76 if (context->pending_datagrams) in vmci_ctx_check_signal_notify()
77 ctx_signal_notify(context); in vmci_ctx_check_signal_notify()
78 spin_unlock(&context->lock); in vmci_ctx_check_signal_notify()
89 struct vmci_ctx *context; in vmci_ctx_create() local
111 context = kzalloc(sizeof(*context), GFP_KERNEL); in vmci_ctx_create()
112 if (!context) { in vmci_ctx_create()
118 kref_init(&context->kref); in vmci_ctx_create()
119 spin_lock_init(&context->lock); in vmci_ctx_create()
120 INIT_LIST_HEAD(&context->list_item); in vmci_ctx_create()
121 INIT_LIST_HEAD(&context->datagram_queue); in vmci_ctx_create()
122 INIT_LIST_HEAD(&context->notifier_list); in vmci_ctx_create()
125 init_waitqueue_head(&context->host_context.wait_queue); in vmci_ctx_create()
127 context->queue_pair_array = vmci_handle_arr_create(0); in vmci_ctx_create()
128 if (!context->queue_pair_array) { in vmci_ctx_create()
133 context->doorbell_array = vmci_handle_arr_create(0); in vmci_ctx_create()
134 if (!context->doorbell_array) { in vmci_ctx_create()
139 context->pending_doorbell_array = vmci_handle_arr_create(0); in vmci_ctx_create()
140 if (!context->pending_doorbell_array) { in vmci_ctx_create()
145 context->user_version = user_version; in vmci_ctx_create()
147 context->priv_flags = priv_flags; in vmci_ctx_create()
150 context->cred = get_cred(cred); in vmci_ctx_create()
152 context->notify = &ctx_dummy_notify; in vmci_ctx_create()
153 context->notify_page = NULL; in vmci_ctx_create()
169 context->cid = cid; in vmci_ctx_create()
171 list_add_tail_rcu(&context->list_item, &ctx_list.head); in vmci_ctx_create()
174 return context; in vmci_ctx_create()
177 vmci_handle_arr_destroy(context->doorbell_array); in vmci_ctx_create()
179 vmci_handle_arr_destroy(context->queue_pair_array); in vmci_ctx_create()
181 kfree(context); in vmci_ctx_create()
189 void vmci_ctx_destroy(struct vmci_ctx *context) in vmci_ctx_destroy() argument
192 list_del_rcu(&context->list_item); in vmci_ctx_destroy()
196 vmci_ctx_put(context); in vmci_ctx_destroy()
263 ev.msg.hdr.dst.context); in ctx_fire_notification()
279 struct vmci_ctx *context; in vmci_ctx_pending_datagrams() local
281 context = vmci_ctx_get(cid); in vmci_ctx_pending_datagrams()
282 if (context == NULL) in vmci_ctx_pending_datagrams()
285 spin_lock(&context->lock); in vmci_ctx_pending_datagrams()
287 *pending = context->pending_datagrams; in vmci_ctx_pending_datagrams()
288 spin_unlock(&context->lock); in vmci_ctx_pending_datagrams()
289 vmci_ctx_put(context); in vmci_ctx_pending_datagrams()
300 struct vmci_ctx *context; in vmci_ctx_enqueue_datagram() local
311 context = vmci_ctx_get(cid); in vmci_ctx_enqueue_datagram()
312 if (!context) { in vmci_ctx_enqueue_datagram()
321 vmci_ctx_put(context); in vmci_ctx_enqueue_datagram()
329 spin_lock(&context->lock); in vmci_ctx_enqueue_datagram()
340 if (context->datagram_queue_size + vmci_dg_size >= in vmci_ctx_enqueue_datagram()
346 context->datagram_queue_size + vmci_dg_size >= in vmci_ctx_enqueue_datagram()
348 spin_unlock(&context->lock); in vmci_ctx_enqueue_datagram()
349 vmci_ctx_put(context); in vmci_ctx_enqueue_datagram()
355 list_add(&dq_entry->list_item, &context->datagram_queue); in vmci_ctx_enqueue_datagram()
356 context->pending_datagrams++; in vmci_ctx_enqueue_datagram()
357 context->datagram_queue_size += vmci_dg_size; in vmci_ctx_enqueue_datagram()
358 ctx_signal_notify(context); in vmci_ctx_enqueue_datagram()
359 wake_up(&context->host_context.wait_queue); in vmci_ctx_enqueue_datagram()
360 spin_unlock(&context->lock); in vmci_ctx_enqueue_datagram()
361 vmci_ctx_put(context); in vmci_ctx_enqueue_datagram()
373 struct vmci_ctx *context; in vmci_ctx_exists() local
378 list_for_each_entry_rcu(context, &ctx_list.head, list_item) { in vmci_ctx_exists()
379 if (context->cid == cid) { in vmci_ctx_exists()
394 struct vmci_ctx *c, *context = NULL; in vmci_ctx_get() local
410 context = c; in vmci_ctx_get()
411 kref_get(&context->kref); in vmci_ctx_get()
417 return context; in vmci_ctx_get()
427 struct vmci_ctx *context = container_of(kref, struct vmci_ctx, kref); in ctx_free_ctx() local
436 ctx_fire_notification(context->cid, context->priv_flags); in ctx_free_ctx()
443 temp_handle = vmci_handle_arr_get_entry(context->queue_pair_array, 0); in ctx_free_ctx()
446 context) < VMCI_SUCCESS) { in ctx_free_ctx()
453 vmci_handle_arr_remove_entry(context->queue_pair_array, in ctx_free_ctx()
457 vmci_handle_arr_get_entry(context->queue_pair_array, 0); in ctx_free_ctx()
465 &context->datagram_queue, list_item) { in ctx_free_ctx()
473 &context->notifier_list, node) { in ctx_free_ctx()
478 vmci_handle_arr_destroy(context->queue_pair_array); in ctx_free_ctx()
479 vmci_handle_arr_destroy(context->doorbell_array); in ctx_free_ctx()
480 vmci_handle_arr_destroy(context->pending_doorbell_array); in ctx_free_ctx()
481 vmci_ctx_unset_notify(context); in ctx_free_ctx()
482 if (context->cred) in ctx_free_ctx()
483 put_cred(context->cred); in ctx_free_ctx()
484 kfree(context); in ctx_free_ctx()
496 void vmci_ctx_put(struct vmci_ctx *context) in vmci_ctx_put() argument
498 kref_put(&context->kref, ctx_free_ctx); in vmci_ctx_put()
509 int vmci_ctx_dequeue_datagram(struct vmci_ctx *context, in vmci_ctx_dequeue_datagram() argument
518 spin_lock(&context->lock); in vmci_ctx_dequeue_datagram()
519 if (context->pending_datagrams == 0) { in vmci_ctx_dequeue_datagram()
520 ctx_clear_notify_call(context); in vmci_ctx_dequeue_datagram()
521 spin_unlock(&context->lock); in vmci_ctx_dequeue_datagram()
526 list_item = context->datagram_queue.next; in vmci_ctx_dequeue_datagram()
534 spin_unlock(&context->lock); in vmci_ctx_dequeue_datagram()
541 context->pending_datagrams--; in vmci_ctx_dequeue_datagram()
542 context->datagram_queue_size -= dq_entry->dg_size; in vmci_ctx_dequeue_datagram()
543 if (context->pending_datagrams == 0) { in vmci_ctx_dequeue_datagram()
544 ctx_clear_notify_call(context); in vmci_ctx_dequeue_datagram()
552 list_item = context->datagram_queue.next; in vmci_ctx_dequeue_datagram()
563 spin_unlock(&context->lock); in vmci_ctx_dequeue_datagram()
577 void vmci_ctx_unset_notify(struct vmci_ctx *context) in vmci_ctx_unset_notify() argument
581 spin_lock(&context->lock); in vmci_ctx_unset_notify()
583 notify_page = context->notify_page; in vmci_ctx_unset_notify()
584 context->notify = &ctx_dummy_notify; in vmci_ctx_unset_notify()
585 context->notify_page = NULL; in vmci_ctx_unset_notify()
587 spin_unlock(&context->lock); in vmci_ctx_unset_notify()
601 struct vmci_ctx *context; in vmci_ctx_add_notification() local
606 context = vmci_ctx_get(context_id); in vmci_ctx_add_notification()
607 if (!context) in vmci_ctx_add_notification()
617 if (context->priv_flags & VMCI_PRIVILEGE_FLAG_RESTRICTED) { in vmci_ctx_add_notification()
631 spin_lock(&context->lock); in vmci_ctx_add_notification()
633 list_for_each_entry(n, &context->notifier_list, node) { in vmci_ctx_add_notification()
644 list_add_tail_rcu(¬ifier->node, &context->notifier_list); in vmci_ctx_add_notification()
645 context->n_notifiers++; in vmci_ctx_add_notification()
649 spin_unlock(&context->lock); in vmci_ctx_add_notification()
652 vmci_ctx_put(context); in vmci_ctx_add_notification()
662 struct vmci_ctx *context; in vmci_ctx_remove_notification() local
667 context = vmci_ctx_get(context_id); in vmci_ctx_remove_notification()
668 if (!context) in vmci_ctx_remove_notification()
673 spin_lock(&context->lock); in vmci_ctx_remove_notification()
675 &context->notifier_list, node) { in vmci_ctx_remove_notification()
678 context->n_notifiers--; in vmci_ctx_remove_notification()
683 spin_unlock(&context->lock); in vmci_ctx_remove_notification()
690 vmci_ctx_put(context); in vmci_ctx_remove_notification()
695 static int vmci_ctx_get_chkpt_notifiers(struct vmci_ctx *context, in vmci_ctx_get_chkpt_notifiers() argument
703 if (context->n_notifiers == 0) { in vmci_ctx_get_chkpt_notifiers()
709 data_size = context->n_notifiers * sizeof(*notifiers); in vmci_ctx_get_chkpt_notifiers()
719 list_for_each_entry(entry, &context->notifier_list, node) in vmci_ctx_get_chkpt_notifiers()
720 notifiers[i++] = entry->handle.context; in vmci_ctx_get_chkpt_notifiers()
727 static int vmci_ctx_get_chkpt_doorbells(struct vmci_ctx *context, in vmci_ctx_get_chkpt_doorbells() argument
734 n_doorbells = vmci_handle_arr_get_size(context->doorbell_array); in vmci_ctx_get_chkpt_doorbells()
748 context->doorbell_array, i); in vmci_ctx_get_chkpt_doorbells()
768 struct vmci_ctx *context; in vmci_ctx_get_chkpt_state() local
771 context = vmci_ctx_get(context_id); in vmci_ctx_get_chkpt_state()
772 if (!context) in vmci_ctx_get_chkpt_state()
775 spin_lock(&context->lock); in vmci_ctx_get_chkpt_state()
779 result = vmci_ctx_get_chkpt_notifiers(context, buf_size, pbuf); in vmci_ctx_get_chkpt_state()
794 result = vmci_ctx_get_chkpt_doorbells(context, buf_size, pbuf); in vmci_ctx_get_chkpt_state()
803 spin_unlock(&context->lock); in vmci_ctx_get_chkpt_state()
804 vmci_ctx_put(context); in vmci_ctx_get_chkpt_state()
860 struct vmci_ctx *context; in vmci_ctx_rcv_notifications_get() local
863 context = vmci_ctx_get(context_id); in vmci_ctx_rcv_notifications_get()
864 if (context == NULL) in vmci_ctx_rcv_notifications_get()
867 spin_lock(&context->lock); in vmci_ctx_rcv_notifications_get()
869 *db_handle_array = context->pending_doorbell_array; in vmci_ctx_rcv_notifications_get()
870 context->pending_doorbell_array = vmci_handle_arr_create(0); in vmci_ctx_rcv_notifications_get()
871 if (!context->pending_doorbell_array) { in vmci_ctx_rcv_notifications_get()
872 context->pending_doorbell_array = *db_handle_array; in vmci_ctx_rcv_notifications_get()
878 spin_unlock(&context->lock); in vmci_ctx_rcv_notifications_get()
879 vmci_ctx_put(context); in vmci_ctx_rcv_notifications_get()
895 struct vmci_ctx *context = vmci_ctx_get(context_id); in vmci_ctx_rcv_notifications_release() local
897 spin_lock(&context->lock); in vmci_ctx_rcv_notifications_release()
909 context->pending_doorbell_array); in vmci_ctx_rcv_notifications_release()
917 context->pending_doorbell_array); in vmci_ctx_rcv_notifications_release()
919 vmci_handle_arr_destroy(context->pending_doorbell_array); in vmci_ctx_rcv_notifications_release()
920 context->pending_doorbell_array = db_handle_array; in vmci_ctx_rcv_notifications_release()
923 ctx_clear_notify_call(context); in vmci_ctx_rcv_notifications_release()
925 spin_unlock(&context->lock); in vmci_ctx_rcv_notifications_release()
926 vmci_ctx_put(context); in vmci_ctx_rcv_notifications_release()
941 struct vmci_ctx *context; in vmci_ctx_dbell_create() local
947 context = vmci_ctx_get(context_id); in vmci_ctx_dbell_create()
948 if (context == NULL) in vmci_ctx_dbell_create()
951 spin_lock(&context->lock); in vmci_ctx_dbell_create()
952 if (!vmci_handle_arr_has_entry(context->doorbell_array, handle)) { in vmci_ctx_dbell_create()
953 vmci_handle_arr_append_entry(&context->doorbell_array, handle); in vmci_ctx_dbell_create()
959 spin_unlock(&context->lock); in vmci_ctx_dbell_create()
960 vmci_ctx_put(context); in vmci_ctx_dbell_create()
971 struct vmci_ctx *context; in vmci_ctx_dbell_destroy() local
977 context = vmci_ctx_get(context_id); in vmci_ctx_dbell_destroy()
978 if (context == NULL) in vmci_ctx_dbell_destroy()
981 spin_lock(&context->lock); in vmci_ctx_dbell_destroy()
983 vmci_handle_arr_remove_entry(context->doorbell_array, handle); in vmci_ctx_dbell_destroy()
984 vmci_handle_arr_remove_entry(context->pending_doorbell_array, handle); in vmci_ctx_dbell_destroy()
985 spin_unlock(&context->lock); in vmci_ctx_dbell_destroy()
987 vmci_ctx_put(context); in vmci_ctx_dbell_destroy()
999 struct vmci_ctx *context; in vmci_ctx_dbell_destroy_all() local
1005 context = vmci_ctx_get(context_id); in vmci_ctx_dbell_destroy_all()
1006 if (context == NULL) in vmci_ctx_dbell_destroy_all()
1009 spin_lock(&context->lock); in vmci_ctx_dbell_destroy_all()
1011 struct vmci_handle_arr *arr = context->doorbell_array; in vmci_ctx_dbell_destroy_all()
1015 struct vmci_handle_arr *arr = context->pending_doorbell_array; in vmci_ctx_dbell_destroy_all()
1018 spin_unlock(&context->lock); in vmci_ctx_dbell_destroy_all()
1020 vmci_ctx_put(context); in vmci_ctx_dbell_destroy_all()
1046 dst_context = vmci_ctx_get(handle.context); in vmci_ctx_notify_dbell()
1048 pr_devel("Invalid context (ID=0x%x)\n", handle.context); in vmci_ctx_notify_dbell()
1052 if (src_cid != handle.context) { in vmci_ctx_notify_dbell()
1056 VMCI_CONTEXT_IS_VM(handle.context)) { in vmci_ctx_notify_dbell()
1058 src_cid, handle.context); in vmci_ctx_notify_dbell()
1066 handle.context, handle.resource); in vmci_ctx_notify_dbell()
1081 if (handle.context == VMCI_HOST_CONTEXT_ID) { in vmci_ctx_notify_dbell()
1112 bool vmci_ctx_supports_host_qp(struct vmci_ctx *context) in vmci_ctx_supports_host_qp() argument
1114 return context && context->user_version >= VMCI_VERSION_HOSTQP; in vmci_ctx_supports_host_qp()
1121 int vmci_ctx_qp_create(struct vmci_ctx *context, struct vmci_handle handle) in vmci_ctx_qp_create() argument
1125 if (context == NULL || vmci_handle_is_invalid(handle)) in vmci_ctx_qp_create()
1128 if (!vmci_handle_arr_has_entry(context->queue_pair_array, handle)) { in vmci_ctx_qp_create()
1129 vmci_handle_arr_append_entry(&context->queue_pair_array, in vmci_ctx_qp_create()
1143 int vmci_ctx_qp_destroy(struct vmci_ctx *context, struct vmci_handle handle) in vmci_ctx_qp_destroy() argument
1147 if (context == NULL || vmci_handle_is_invalid(handle)) in vmci_ctx_qp_destroy()
1150 hndl = vmci_handle_arr_remove_entry(context->queue_pair_array, handle); in vmci_ctx_qp_destroy()
1160 bool vmci_ctx_qp_exists(struct vmci_ctx *context, struct vmci_handle handle) in vmci_ctx_qp_exists() argument
1162 if (context == NULL || vmci_handle_is_invalid(handle)) in vmci_ctx_qp_exists()
1165 return vmci_handle_arr_has_entry(context->queue_pair_array, handle); in vmci_ctx_qp_exists()
1178 struct vmci_ctx *context; in vmci_context_get_priv_flags() local
1180 context = vmci_ctx_get(context_id); in vmci_context_get_priv_flags()
1181 if (!context) in vmci_context_get_priv_flags()
1184 flags = context->priv_flags; in vmci_context_get_priv_flags()
1185 vmci_ctx_put(context); in vmci_context_get_priv_flags()
1204 struct vmci_ctx *context = vmci_ctx_get(context_id); in vmci_is_context_owner() local
1205 if (context) { in vmci_is_context_owner()
1206 if (context->cred) in vmci_is_context_owner()
1207 is_owner = uid_eq(context->cred->uid, uid); in vmci_is_context_owner()
1208 vmci_ctx_put(context); in vmci_is_context_owner()