Lines Matching refs:context
44 static void ctx_signal_notify(struct vmci_ctx *context) in ctx_signal_notify() argument
46 *context->notify = true; in ctx_signal_notify()
49 static void ctx_clear_notify(struct vmci_ctx *context) in ctx_clear_notify() argument
51 *context->notify = false; in ctx_clear_notify()
58 static void ctx_clear_notify_call(struct vmci_ctx *context) in ctx_clear_notify_call() argument
60 if (context->pending_datagrams == 0 && in ctx_clear_notify_call()
61 vmci_handle_arr_get_size(context->pending_doorbell_array) == 0) in ctx_clear_notify_call()
62 ctx_clear_notify(context); in ctx_clear_notify_call()
69 void vmci_ctx_check_signal_notify(struct vmci_ctx *context) in vmci_ctx_check_signal_notify() argument
71 spin_lock(&context->lock); in vmci_ctx_check_signal_notify()
72 if (context->pending_datagrams) in vmci_ctx_check_signal_notify()
73 ctx_signal_notify(context); in vmci_ctx_check_signal_notify()
74 spin_unlock(&context->lock); in vmci_ctx_check_signal_notify()
85 struct vmci_ctx *context; in vmci_ctx_create() local
107 context = kzalloc(sizeof(*context), GFP_KERNEL); in vmci_ctx_create()
108 if (!context) { in vmci_ctx_create()
114 kref_init(&context->kref); in vmci_ctx_create()
115 spin_lock_init(&context->lock); in vmci_ctx_create()
116 INIT_LIST_HEAD(&context->list_item); in vmci_ctx_create()
117 INIT_LIST_HEAD(&context->datagram_queue); in vmci_ctx_create()
118 INIT_LIST_HEAD(&context->notifier_list); in vmci_ctx_create()
121 init_waitqueue_head(&context->host_context.wait_queue); in vmci_ctx_create()
123 context->queue_pair_array = in vmci_ctx_create()
125 if (!context->queue_pair_array) { in vmci_ctx_create()
130 context->doorbell_array = in vmci_ctx_create()
132 if (!context->doorbell_array) { in vmci_ctx_create()
137 context->pending_doorbell_array = in vmci_ctx_create()
139 if (!context->pending_doorbell_array) { in vmci_ctx_create()
144 context->user_version = user_version; in vmci_ctx_create()
146 context->priv_flags = priv_flags; in vmci_ctx_create()
149 context->cred = get_cred(cred); in vmci_ctx_create()
151 context->notify = &ctx_dummy_notify; in vmci_ctx_create()
152 context->notify_page = NULL; in vmci_ctx_create()
168 context->cid = cid; in vmci_ctx_create()
170 list_add_tail_rcu(&context->list_item, &ctx_list.head); in vmci_ctx_create()
173 return context; in vmci_ctx_create()
176 vmci_handle_arr_destroy(context->doorbell_array); in vmci_ctx_create()
178 vmci_handle_arr_destroy(context->queue_pair_array); in vmci_ctx_create()
180 kfree(context); in vmci_ctx_create()
188 void vmci_ctx_destroy(struct vmci_ctx *context) in vmci_ctx_destroy() argument
191 list_del_rcu(&context->list_item); in vmci_ctx_destroy()
195 vmci_ctx_put(context); in vmci_ctx_destroy()
264 ev.msg.hdr.dst.context); in ctx_fire_notification()
279 struct vmci_ctx *context; in vmci_ctx_enqueue_datagram() local
290 context = vmci_ctx_get(cid); in vmci_ctx_enqueue_datagram()
291 if (!context) { in vmci_ctx_enqueue_datagram()
300 vmci_ctx_put(context); in vmci_ctx_enqueue_datagram()
308 spin_lock(&context->lock); in vmci_ctx_enqueue_datagram()
319 if (context->datagram_queue_size + vmci_dg_size >= in vmci_ctx_enqueue_datagram()
325 context->datagram_queue_size + vmci_dg_size >= in vmci_ctx_enqueue_datagram()
327 spin_unlock(&context->lock); in vmci_ctx_enqueue_datagram()
328 vmci_ctx_put(context); in vmci_ctx_enqueue_datagram()
334 list_add(&dq_entry->list_item, &context->datagram_queue); in vmci_ctx_enqueue_datagram()
335 context->pending_datagrams++; in vmci_ctx_enqueue_datagram()
336 context->datagram_queue_size += vmci_dg_size; in vmci_ctx_enqueue_datagram()
337 ctx_signal_notify(context); in vmci_ctx_enqueue_datagram()
338 wake_up(&context->host_context.wait_queue); in vmci_ctx_enqueue_datagram()
339 spin_unlock(&context->lock); in vmci_ctx_enqueue_datagram()
340 vmci_ctx_put(context); in vmci_ctx_enqueue_datagram()
352 struct vmci_ctx *context; in vmci_ctx_exists() local
357 list_for_each_entry_rcu(context, &ctx_list.head, list_item) { in vmci_ctx_exists()
358 if (context->cid == cid) { in vmci_ctx_exists()
373 struct vmci_ctx *c, *context = NULL; in vmci_ctx_get() local
389 context = c; in vmci_ctx_get()
390 kref_get(&context->kref); in vmci_ctx_get()
396 return context; in vmci_ctx_get()
406 struct vmci_ctx *context = container_of(kref, struct vmci_ctx, kref); in ctx_free_ctx() local
415 ctx_fire_notification(context->cid, context->priv_flags); in ctx_free_ctx()
422 temp_handle = vmci_handle_arr_get_entry(context->queue_pair_array, 0); in ctx_free_ctx()
425 context) < VMCI_SUCCESS) { in ctx_free_ctx()
432 vmci_handle_arr_remove_entry(context->queue_pair_array, in ctx_free_ctx()
436 vmci_handle_arr_get_entry(context->queue_pair_array, 0); in ctx_free_ctx()
444 &context->datagram_queue, list_item) { in ctx_free_ctx()
452 &context->notifier_list, node) { in ctx_free_ctx()
457 vmci_handle_arr_destroy(context->queue_pair_array); in ctx_free_ctx()
458 vmci_handle_arr_destroy(context->doorbell_array); in ctx_free_ctx()
459 vmci_handle_arr_destroy(context->pending_doorbell_array); in ctx_free_ctx()
460 vmci_ctx_unset_notify(context); in ctx_free_ctx()
461 if (context->cred) in ctx_free_ctx()
462 put_cred(context->cred); in ctx_free_ctx()
463 kfree(context); in ctx_free_ctx()
475 void vmci_ctx_put(struct vmci_ctx *context) in vmci_ctx_put() argument
477 kref_put(&context->kref, ctx_free_ctx); in vmci_ctx_put()
488 int vmci_ctx_dequeue_datagram(struct vmci_ctx *context, in vmci_ctx_dequeue_datagram() argument
497 spin_lock(&context->lock); in vmci_ctx_dequeue_datagram()
498 if (context->pending_datagrams == 0) { in vmci_ctx_dequeue_datagram()
499 ctx_clear_notify_call(context); in vmci_ctx_dequeue_datagram()
500 spin_unlock(&context->lock); in vmci_ctx_dequeue_datagram()
505 list_item = context->datagram_queue.next; in vmci_ctx_dequeue_datagram()
513 spin_unlock(&context->lock); in vmci_ctx_dequeue_datagram()
520 context->pending_datagrams--; in vmci_ctx_dequeue_datagram()
521 context->datagram_queue_size -= dq_entry->dg_size; in vmci_ctx_dequeue_datagram()
522 if (context->pending_datagrams == 0) { in vmci_ctx_dequeue_datagram()
523 ctx_clear_notify_call(context); in vmci_ctx_dequeue_datagram()
531 list_item = context->datagram_queue.next; in vmci_ctx_dequeue_datagram()
542 spin_unlock(&context->lock); in vmci_ctx_dequeue_datagram()
556 void vmci_ctx_unset_notify(struct vmci_ctx *context) in vmci_ctx_unset_notify() argument
560 spin_lock(&context->lock); in vmci_ctx_unset_notify()
562 notify_page = context->notify_page; in vmci_ctx_unset_notify()
563 context->notify = &ctx_dummy_notify; in vmci_ctx_unset_notify()
564 context->notify_page = NULL; in vmci_ctx_unset_notify()
566 spin_unlock(&context->lock); in vmci_ctx_unset_notify()
580 struct vmci_ctx *context; in vmci_ctx_add_notification() local
585 context = vmci_ctx_get(context_id); in vmci_ctx_add_notification()
586 if (!context) in vmci_ctx_add_notification()
596 if (context->priv_flags & VMCI_PRIVILEGE_FLAG_RESTRICTED) { in vmci_ctx_add_notification()
610 spin_lock(&context->lock); in vmci_ctx_add_notification()
612 if (context->n_notifiers < VMCI_MAX_CONTEXTS) { in vmci_ctx_add_notification()
613 list_for_each_entry(n, &context->notifier_list, node) { in vmci_ctx_add_notification()
625 &context->notifier_list); in vmci_ctx_add_notification()
626 context->n_notifiers++; in vmci_ctx_add_notification()
634 spin_unlock(&context->lock); in vmci_ctx_add_notification()
637 vmci_ctx_put(context); in vmci_ctx_add_notification()
647 struct vmci_ctx *context; in vmci_ctx_remove_notification() local
651 context = vmci_ctx_get(context_id); in vmci_ctx_remove_notification()
652 if (!context) in vmci_ctx_remove_notification()
657 spin_lock(&context->lock); in vmci_ctx_remove_notification()
659 &context->notifier_list, node) { in vmci_ctx_remove_notification()
662 context->n_notifiers--; in vmci_ctx_remove_notification()
667 spin_unlock(&context->lock); in vmci_ctx_remove_notification()
672 vmci_ctx_put(context); in vmci_ctx_remove_notification()
677 static int vmci_ctx_get_chkpt_notifiers(struct vmci_ctx *context, in vmci_ctx_get_chkpt_notifiers() argument
685 if (context->n_notifiers == 0) { in vmci_ctx_get_chkpt_notifiers()
691 data_size = context->n_notifiers * sizeof(*notifiers); in vmci_ctx_get_chkpt_notifiers()
701 list_for_each_entry(entry, &context->notifier_list, node) in vmci_ctx_get_chkpt_notifiers()
702 notifiers[i++] = entry->handle.context; in vmci_ctx_get_chkpt_notifiers()
709 static int vmci_ctx_get_chkpt_doorbells(struct vmci_ctx *context, in vmci_ctx_get_chkpt_doorbells() argument
715 n_doorbells = vmci_handle_arr_get_size(context->doorbell_array); in vmci_ctx_get_chkpt_doorbells()
729 context->doorbell_array, i); in vmci_ctx_get_chkpt_doorbells()
749 struct vmci_ctx *context; in vmci_ctx_get_chkpt_state() local
752 context = vmci_ctx_get(context_id); in vmci_ctx_get_chkpt_state()
753 if (!context) in vmci_ctx_get_chkpt_state()
756 spin_lock(&context->lock); in vmci_ctx_get_chkpt_state()
760 result = vmci_ctx_get_chkpt_notifiers(context, buf_size, pbuf); in vmci_ctx_get_chkpt_state()
775 result = vmci_ctx_get_chkpt_doorbells(context, buf_size, pbuf); in vmci_ctx_get_chkpt_state()
784 spin_unlock(&context->lock); in vmci_ctx_get_chkpt_state()
785 vmci_ctx_put(context); in vmci_ctx_get_chkpt_state()
841 struct vmci_ctx *context; in vmci_ctx_rcv_notifications_get() local
844 context = vmci_ctx_get(context_id); in vmci_ctx_rcv_notifications_get()
845 if (context == NULL) in vmci_ctx_rcv_notifications_get()
848 spin_lock(&context->lock); in vmci_ctx_rcv_notifications_get()
850 *db_handle_array = context->pending_doorbell_array; in vmci_ctx_rcv_notifications_get()
851 context->pending_doorbell_array = in vmci_ctx_rcv_notifications_get()
853 if (!context->pending_doorbell_array) { in vmci_ctx_rcv_notifications_get()
854 context->pending_doorbell_array = *db_handle_array; in vmci_ctx_rcv_notifications_get()
860 spin_unlock(&context->lock); in vmci_ctx_rcv_notifications_get()
861 vmci_ctx_put(context); in vmci_ctx_rcv_notifications_get()
877 struct vmci_ctx *context = vmci_ctx_get(context_id); in vmci_ctx_rcv_notifications_release() local
879 spin_lock(&context->lock); in vmci_ctx_rcv_notifications_release()
891 context->pending_doorbell_array); in vmci_ctx_rcv_notifications_release()
899 context->pending_doorbell_array); in vmci_ctx_rcv_notifications_release()
901 vmci_handle_arr_destroy(context->pending_doorbell_array); in vmci_ctx_rcv_notifications_release()
902 context->pending_doorbell_array = db_handle_array; in vmci_ctx_rcv_notifications_release()
905 ctx_clear_notify_call(context); in vmci_ctx_rcv_notifications_release()
907 spin_unlock(&context->lock); in vmci_ctx_rcv_notifications_release()
908 vmci_ctx_put(context); in vmci_ctx_rcv_notifications_release()
923 struct vmci_ctx *context; in vmci_ctx_dbell_create() local
929 context = vmci_ctx_get(context_id); in vmci_ctx_dbell_create()
930 if (context == NULL) in vmci_ctx_dbell_create()
933 spin_lock(&context->lock); in vmci_ctx_dbell_create()
934 if (!vmci_handle_arr_has_entry(context->doorbell_array, handle)) in vmci_ctx_dbell_create()
935 result = vmci_handle_arr_append_entry(&context->doorbell_array, in vmci_ctx_dbell_create()
940 spin_unlock(&context->lock); in vmci_ctx_dbell_create()
941 vmci_ctx_put(context); in vmci_ctx_dbell_create()
952 struct vmci_ctx *context; in vmci_ctx_dbell_destroy() local
958 context = vmci_ctx_get(context_id); in vmci_ctx_dbell_destroy()
959 if (context == NULL) in vmci_ctx_dbell_destroy()
962 spin_lock(&context->lock); in vmci_ctx_dbell_destroy()
964 vmci_handle_arr_remove_entry(context->doorbell_array, handle); in vmci_ctx_dbell_destroy()
965 vmci_handle_arr_remove_entry(context->pending_doorbell_array, handle); in vmci_ctx_dbell_destroy()
966 spin_unlock(&context->lock); in vmci_ctx_dbell_destroy()
968 vmci_ctx_put(context); in vmci_ctx_dbell_destroy()
995 dst_context = vmci_ctx_get(handle.context); in vmci_ctx_notify_dbell()
997 pr_devel("Invalid context (ID=0x%x)\n", handle.context); in vmci_ctx_notify_dbell()
1001 if (src_cid != handle.context) { in vmci_ctx_notify_dbell()
1005 VMCI_CONTEXT_IS_VM(handle.context)) { in vmci_ctx_notify_dbell()
1007 src_cid, handle.context); in vmci_ctx_notify_dbell()
1015 handle.context, handle.resource); in vmci_ctx_notify_dbell()
1030 if (handle.context == VMCI_HOST_CONTEXT_ID) { in vmci_ctx_notify_dbell()
1062 bool vmci_ctx_supports_host_qp(struct vmci_ctx *context) in vmci_ctx_supports_host_qp() argument
1064 return context && context->user_version >= VMCI_VERSION_HOSTQP; in vmci_ctx_supports_host_qp()
1071 int vmci_ctx_qp_create(struct vmci_ctx *context, struct vmci_handle handle) in vmci_ctx_qp_create() argument
1075 if (context == NULL || vmci_handle_is_invalid(handle)) in vmci_ctx_qp_create()
1078 if (!vmci_handle_arr_has_entry(context->queue_pair_array, handle)) in vmci_ctx_qp_create()
1080 &context->queue_pair_array, handle); in vmci_ctx_qp_create()
1091 int vmci_ctx_qp_destroy(struct vmci_ctx *context, struct vmci_handle handle) in vmci_ctx_qp_destroy() argument
1095 if (context == NULL || vmci_handle_is_invalid(handle)) in vmci_ctx_qp_destroy()
1098 hndl = vmci_handle_arr_remove_entry(context->queue_pair_array, handle); in vmci_ctx_qp_destroy()
1108 bool vmci_ctx_qp_exists(struct vmci_ctx *context, struct vmci_handle handle) in vmci_ctx_qp_exists() argument
1110 if (context == NULL || vmci_handle_is_invalid(handle)) in vmci_ctx_qp_exists()
1113 return vmci_handle_arr_has_entry(context->queue_pair_array, handle); in vmci_ctx_qp_exists()
1126 struct vmci_ctx *context; in vmci_context_get_priv_flags() local
1128 context = vmci_ctx_get(context_id); in vmci_context_get_priv_flags()
1129 if (!context) in vmci_context_get_priv_flags()
1132 flags = context->priv_flags; in vmci_context_get_priv_flags()
1133 vmci_ctx_put(context); in vmci_context_get_priv_flags()
1152 struct vmci_ctx *context = vmci_ctx_get(context_id); in vmci_is_context_owner() local
1153 if (context) { in vmci_is_context_owner()
1154 if (context->cred) in vmci_is_context_owner()
1155 is_owner = uid_eq(context->cred->uid, uid); in vmci_is_context_owner()
1156 vmci_ctx_put(context); in vmci_is_context_owner()