Lines Matching refs:context
49 static void ctx_signal_notify(struct vmci_ctx *context) in ctx_signal_notify() argument
51 *context->notify = true; in ctx_signal_notify()
54 static void ctx_clear_notify(struct vmci_ctx *context) in ctx_clear_notify() argument
56 *context->notify = false; in ctx_clear_notify()
63 static void ctx_clear_notify_call(struct vmci_ctx *context) in ctx_clear_notify_call() argument
65 if (context->pending_datagrams == 0 && in ctx_clear_notify_call()
66 vmci_handle_arr_get_size(context->pending_doorbell_array) == 0) in ctx_clear_notify_call()
67 ctx_clear_notify(context); in ctx_clear_notify_call()
74 void vmci_ctx_check_signal_notify(struct vmci_ctx *context) in vmci_ctx_check_signal_notify() argument
76 spin_lock(&context->lock); in vmci_ctx_check_signal_notify()
77 if (context->pending_datagrams) in vmci_ctx_check_signal_notify()
78 ctx_signal_notify(context); in vmci_ctx_check_signal_notify()
79 spin_unlock(&context->lock); in vmci_ctx_check_signal_notify()
90 struct vmci_ctx *context; in vmci_ctx_create() local
112 context = kzalloc(sizeof(*context), GFP_KERNEL); in vmci_ctx_create()
113 if (!context) { in vmci_ctx_create()
119 kref_init(&context->kref); in vmci_ctx_create()
120 spin_lock_init(&context->lock); in vmci_ctx_create()
121 INIT_LIST_HEAD(&context->list_item); in vmci_ctx_create()
122 INIT_LIST_HEAD(&context->datagram_queue); in vmci_ctx_create()
123 INIT_LIST_HEAD(&context->notifier_list); in vmci_ctx_create()
126 init_waitqueue_head(&context->host_context.wait_queue); in vmci_ctx_create()
128 context->queue_pair_array = vmci_handle_arr_create(0); in vmci_ctx_create()
129 if (!context->queue_pair_array) { in vmci_ctx_create()
134 context->doorbell_array = vmci_handle_arr_create(0); in vmci_ctx_create()
135 if (!context->doorbell_array) { in vmci_ctx_create()
140 context->pending_doorbell_array = vmci_handle_arr_create(0); in vmci_ctx_create()
141 if (!context->pending_doorbell_array) { in vmci_ctx_create()
146 context->user_version = user_version; in vmci_ctx_create()
148 context->priv_flags = priv_flags; in vmci_ctx_create()
151 context->cred = get_cred(cred); in vmci_ctx_create()
153 context->notify = &ctx_dummy_notify; in vmci_ctx_create()
154 context->notify_page = NULL; in vmci_ctx_create()
170 context->cid = cid; in vmci_ctx_create()
172 list_add_tail_rcu(&context->list_item, &ctx_list.head); in vmci_ctx_create()
175 return context; in vmci_ctx_create()
178 vmci_handle_arr_destroy(context->doorbell_array); in vmci_ctx_create()
180 vmci_handle_arr_destroy(context->queue_pair_array); in vmci_ctx_create()
182 kfree(context); in vmci_ctx_create()
190 void vmci_ctx_destroy(struct vmci_ctx *context) in vmci_ctx_destroy() argument
193 list_del_rcu(&context->list_item); in vmci_ctx_destroy()
197 vmci_ctx_put(context); in vmci_ctx_destroy()
264 ev.msg.hdr.dst.context); in ctx_fire_notification()
280 struct vmci_ctx *context; in vmci_ctx_pending_datagrams() local
282 context = vmci_ctx_get(cid); in vmci_ctx_pending_datagrams()
283 if (context == NULL) in vmci_ctx_pending_datagrams()
286 spin_lock(&context->lock); in vmci_ctx_pending_datagrams()
288 *pending = context->pending_datagrams; in vmci_ctx_pending_datagrams()
289 spin_unlock(&context->lock); in vmci_ctx_pending_datagrams()
290 vmci_ctx_put(context); in vmci_ctx_pending_datagrams()
301 struct vmci_ctx *context; in vmci_ctx_enqueue_datagram() local
312 context = vmci_ctx_get(cid); in vmci_ctx_enqueue_datagram()
313 if (!context) { in vmci_ctx_enqueue_datagram()
322 vmci_ctx_put(context); in vmci_ctx_enqueue_datagram()
330 spin_lock(&context->lock); in vmci_ctx_enqueue_datagram()
341 if (context->datagram_queue_size + vmci_dg_size >= in vmci_ctx_enqueue_datagram()
347 context->datagram_queue_size + vmci_dg_size >= in vmci_ctx_enqueue_datagram()
349 spin_unlock(&context->lock); in vmci_ctx_enqueue_datagram()
350 vmci_ctx_put(context); in vmci_ctx_enqueue_datagram()
356 list_add(&dq_entry->list_item, &context->datagram_queue); in vmci_ctx_enqueue_datagram()
357 context->pending_datagrams++; in vmci_ctx_enqueue_datagram()
358 context->datagram_queue_size += vmci_dg_size; in vmci_ctx_enqueue_datagram()
359 ctx_signal_notify(context); in vmci_ctx_enqueue_datagram()
360 wake_up(&context->host_context.wait_queue); in vmci_ctx_enqueue_datagram()
361 spin_unlock(&context->lock); in vmci_ctx_enqueue_datagram()
362 vmci_ctx_put(context); in vmci_ctx_enqueue_datagram()
374 struct vmci_ctx *context; in vmci_ctx_exists() local
379 list_for_each_entry_rcu(context, &ctx_list.head, list_item) { in vmci_ctx_exists()
380 if (context->cid == cid) { in vmci_ctx_exists()
395 struct vmci_ctx *c, *context = NULL; in vmci_ctx_get() local
411 context = c; in vmci_ctx_get()
412 kref_get(&context->kref); in vmci_ctx_get()
418 return context; in vmci_ctx_get()
428 struct vmci_ctx *context = container_of(kref, struct vmci_ctx, kref); in ctx_free_ctx() local
437 ctx_fire_notification(context->cid, context->priv_flags); in ctx_free_ctx()
444 temp_handle = vmci_handle_arr_get_entry(context->queue_pair_array, 0); in ctx_free_ctx()
447 context) < VMCI_SUCCESS) { in ctx_free_ctx()
454 vmci_handle_arr_remove_entry(context->queue_pair_array, in ctx_free_ctx()
458 vmci_handle_arr_get_entry(context->queue_pair_array, 0); in ctx_free_ctx()
466 &context->datagram_queue, list_item) { in ctx_free_ctx()
474 &context->notifier_list, node) { in ctx_free_ctx()
479 vmci_handle_arr_destroy(context->queue_pair_array); in ctx_free_ctx()
480 vmci_handle_arr_destroy(context->doorbell_array); in ctx_free_ctx()
481 vmci_handle_arr_destroy(context->pending_doorbell_array); in ctx_free_ctx()
482 vmci_ctx_unset_notify(context); in ctx_free_ctx()
483 if (context->cred) in ctx_free_ctx()
484 put_cred(context->cred); in ctx_free_ctx()
485 kfree(context); in ctx_free_ctx()
497 void vmci_ctx_put(struct vmci_ctx *context) in vmci_ctx_put() argument
499 kref_put(&context->kref, ctx_free_ctx); in vmci_ctx_put()
510 int vmci_ctx_dequeue_datagram(struct vmci_ctx *context, in vmci_ctx_dequeue_datagram() argument
519 spin_lock(&context->lock); in vmci_ctx_dequeue_datagram()
520 if (context->pending_datagrams == 0) { in vmci_ctx_dequeue_datagram()
521 ctx_clear_notify_call(context); in vmci_ctx_dequeue_datagram()
522 spin_unlock(&context->lock); in vmci_ctx_dequeue_datagram()
527 list_item = context->datagram_queue.next; in vmci_ctx_dequeue_datagram()
535 spin_unlock(&context->lock); in vmci_ctx_dequeue_datagram()
542 context->pending_datagrams--; in vmci_ctx_dequeue_datagram()
543 context->datagram_queue_size -= dq_entry->dg_size; in vmci_ctx_dequeue_datagram()
544 if (context->pending_datagrams == 0) { in vmci_ctx_dequeue_datagram()
545 ctx_clear_notify_call(context); in vmci_ctx_dequeue_datagram()
553 list_item = context->datagram_queue.next; in vmci_ctx_dequeue_datagram()
564 spin_unlock(&context->lock); in vmci_ctx_dequeue_datagram()
578 void vmci_ctx_unset_notify(struct vmci_ctx *context) in vmci_ctx_unset_notify() argument
582 spin_lock(&context->lock); in vmci_ctx_unset_notify()
584 notify_page = context->notify_page; in vmci_ctx_unset_notify()
585 context->notify = &ctx_dummy_notify; in vmci_ctx_unset_notify()
586 context->notify_page = NULL; in vmci_ctx_unset_notify()
588 spin_unlock(&context->lock); in vmci_ctx_unset_notify()
602 struct vmci_ctx *context; in vmci_ctx_add_notification() local
607 context = vmci_ctx_get(context_id); in vmci_ctx_add_notification()
608 if (!context) in vmci_ctx_add_notification()
618 if (context->priv_flags & VMCI_PRIVILEGE_FLAG_RESTRICTED) { in vmci_ctx_add_notification()
632 spin_lock(&context->lock); in vmci_ctx_add_notification()
634 list_for_each_entry(n, &context->notifier_list, node) { in vmci_ctx_add_notification()
645 list_add_tail_rcu(¬ifier->node, &context->notifier_list); in vmci_ctx_add_notification()
646 context->n_notifiers++; in vmci_ctx_add_notification()
650 spin_unlock(&context->lock); in vmci_ctx_add_notification()
653 vmci_ctx_put(context); in vmci_ctx_add_notification()
663 struct vmci_ctx *context; in vmci_ctx_remove_notification() local
668 context = vmci_ctx_get(context_id); in vmci_ctx_remove_notification()
669 if (!context) in vmci_ctx_remove_notification()
674 spin_lock(&context->lock); in vmci_ctx_remove_notification()
676 &context->notifier_list, node) { in vmci_ctx_remove_notification()
679 context->n_notifiers--; in vmci_ctx_remove_notification()
684 spin_unlock(&context->lock); in vmci_ctx_remove_notification()
691 vmci_ctx_put(context); in vmci_ctx_remove_notification()
696 static int vmci_ctx_get_chkpt_notifiers(struct vmci_ctx *context, in vmci_ctx_get_chkpt_notifiers() argument
704 if (context->n_notifiers == 0) { in vmci_ctx_get_chkpt_notifiers()
710 data_size = context->n_notifiers * sizeof(*notifiers); in vmci_ctx_get_chkpt_notifiers()
720 list_for_each_entry(entry, &context->notifier_list, node) in vmci_ctx_get_chkpt_notifiers()
721 notifiers[i++] = entry->handle.context; in vmci_ctx_get_chkpt_notifiers()
728 static int vmci_ctx_get_chkpt_doorbells(struct vmci_ctx *context, in vmci_ctx_get_chkpt_doorbells() argument
735 n_doorbells = vmci_handle_arr_get_size(context->doorbell_array); in vmci_ctx_get_chkpt_doorbells()
749 context->doorbell_array, i); in vmci_ctx_get_chkpt_doorbells()
769 struct vmci_ctx *context; in vmci_ctx_get_chkpt_state() local
772 context = vmci_ctx_get(context_id); in vmci_ctx_get_chkpt_state()
773 if (!context) in vmci_ctx_get_chkpt_state()
776 spin_lock(&context->lock); in vmci_ctx_get_chkpt_state()
780 result = vmci_ctx_get_chkpt_notifiers(context, buf_size, pbuf); in vmci_ctx_get_chkpt_state()
795 result = vmci_ctx_get_chkpt_doorbells(context, buf_size, pbuf); in vmci_ctx_get_chkpt_state()
804 spin_unlock(&context->lock); in vmci_ctx_get_chkpt_state()
805 vmci_ctx_put(context); in vmci_ctx_get_chkpt_state()
861 struct vmci_ctx *context; in vmci_ctx_rcv_notifications_get() local
864 context = vmci_ctx_get(context_id); in vmci_ctx_rcv_notifications_get()
865 if (context == NULL) in vmci_ctx_rcv_notifications_get()
868 spin_lock(&context->lock); in vmci_ctx_rcv_notifications_get()
870 *db_handle_array = context->pending_doorbell_array; in vmci_ctx_rcv_notifications_get()
871 context->pending_doorbell_array = vmci_handle_arr_create(0); in vmci_ctx_rcv_notifications_get()
872 if (!context->pending_doorbell_array) { in vmci_ctx_rcv_notifications_get()
873 context->pending_doorbell_array = *db_handle_array; in vmci_ctx_rcv_notifications_get()
879 spin_unlock(&context->lock); in vmci_ctx_rcv_notifications_get()
880 vmci_ctx_put(context); in vmci_ctx_rcv_notifications_get()
896 struct vmci_ctx *context = vmci_ctx_get(context_id); in vmci_ctx_rcv_notifications_release() local
898 spin_lock(&context->lock); in vmci_ctx_rcv_notifications_release()
910 context->pending_doorbell_array); in vmci_ctx_rcv_notifications_release()
918 context->pending_doorbell_array); in vmci_ctx_rcv_notifications_release()
920 vmci_handle_arr_destroy(context->pending_doorbell_array); in vmci_ctx_rcv_notifications_release()
921 context->pending_doorbell_array = db_handle_array; in vmci_ctx_rcv_notifications_release()
924 ctx_clear_notify_call(context); in vmci_ctx_rcv_notifications_release()
926 spin_unlock(&context->lock); in vmci_ctx_rcv_notifications_release()
927 vmci_ctx_put(context); in vmci_ctx_rcv_notifications_release()
942 struct vmci_ctx *context; in vmci_ctx_dbell_create() local
948 context = vmci_ctx_get(context_id); in vmci_ctx_dbell_create()
949 if (context == NULL) in vmci_ctx_dbell_create()
952 spin_lock(&context->lock); in vmci_ctx_dbell_create()
953 if (!vmci_handle_arr_has_entry(context->doorbell_array, handle)) { in vmci_ctx_dbell_create()
954 vmci_handle_arr_append_entry(&context->doorbell_array, handle); in vmci_ctx_dbell_create()
960 spin_unlock(&context->lock); in vmci_ctx_dbell_create()
961 vmci_ctx_put(context); in vmci_ctx_dbell_create()
972 struct vmci_ctx *context; in vmci_ctx_dbell_destroy() local
978 context = vmci_ctx_get(context_id); in vmci_ctx_dbell_destroy()
979 if (context == NULL) in vmci_ctx_dbell_destroy()
982 spin_lock(&context->lock); in vmci_ctx_dbell_destroy()
984 vmci_handle_arr_remove_entry(context->doorbell_array, handle); in vmci_ctx_dbell_destroy()
985 vmci_handle_arr_remove_entry(context->pending_doorbell_array, handle); in vmci_ctx_dbell_destroy()
986 spin_unlock(&context->lock); in vmci_ctx_dbell_destroy()
988 vmci_ctx_put(context); in vmci_ctx_dbell_destroy()
1000 struct vmci_ctx *context; in vmci_ctx_dbell_destroy_all() local
1006 context = vmci_ctx_get(context_id); in vmci_ctx_dbell_destroy_all()
1007 if (context == NULL) in vmci_ctx_dbell_destroy_all()
1010 spin_lock(&context->lock); in vmci_ctx_dbell_destroy_all()
1012 struct vmci_handle_arr *arr = context->doorbell_array; in vmci_ctx_dbell_destroy_all()
1016 struct vmci_handle_arr *arr = context->pending_doorbell_array; in vmci_ctx_dbell_destroy_all()
1019 spin_unlock(&context->lock); in vmci_ctx_dbell_destroy_all()
1021 vmci_ctx_put(context); in vmci_ctx_dbell_destroy_all()
1047 dst_context = vmci_ctx_get(handle.context); in vmci_ctx_notify_dbell()
1049 pr_devel("Invalid context (ID=0x%x)\n", handle.context); in vmci_ctx_notify_dbell()
1053 if (src_cid != handle.context) { in vmci_ctx_notify_dbell()
1057 VMCI_CONTEXT_IS_VM(handle.context)) { in vmci_ctx_notify_dbell()
1059 src_cid, handle.context); in vmci_ctx_notify_dbell()
1067 handle.context, handle.resource); in vmci_ctx_notify_dbell()
1082 if (handle.context == VMCI_HOST_CONTEXT_ID) { in vmci_ctx_notify_dbell()
1113 bool vmci_ctx_supports_host_qp(struct vmci_ctx *context) in vmci_ctx_supports_host_qp() argument
1115 return context && context->user_version >= VMCI_VERSION_HOSTQP; in vmci_ctx_supports_host_qp()
1122 int vmci_ctx_qp_create(struct vmci_ctx *context, struct vmci_handle handle) in vmci_ctx_qp_create() argument
1126 if (context == NULL || vmci_handle_is_invalid(handle)) in vmci_ctx_qp_create()
1129 if (!vmci_handle_arr_has_entry(context->queue_pair_array, handle)) { in vmci_ctx_qp_create()
1130 vmci_handle_arr_append_entry(&context->queue_pair_array, in vmci_ctx_qp_create()
1144 int vmci_ctx_qp_destroy(struct vmci_ctx *context, struct vmci_handle handle) in vmci_ctx_qp_destroy() argument
1148 if (context == NULL || vmci_handle_is_invalid(handle)) in vmci_ctx_qp_destroy()
1151 hndl = vmci_handle_arr_remove_entry(context->queue_pair_array, handle); in vmci_ctx_qp_destroy()
1161 bool vmci_ctx_qp_exists(struct vmci_ctx *context, struct vmci_handle handle) in vmci_ctx_qp_exists() argument
1163 if (context == NULL || vmci_handle_is_invalid(handle)) in vmci_ctx_qp_exists()
1166 return vmci_handle_arr_has_entry(context->queue_pair_array, handle); in vmci_ctx_qp_exists()
1179 struct vmci_ctx *context; in vmci_context_get_priv_flags() local
1181 context = vmci_ctx_get(context_id); in vmci_context_get_priv_flags()
1182 if (!context) in vmci_context_get_priv_flags()
1185 flags = context->priv_flags; in vmci_context_get_priv_flags()
1186 vmci_ctx_put(context); in vmci_context_get_priv_flags()
1205 struct vmci_ctx *context = vmci_ctx_get(context_id); in vmci_is_context_owner() local
1206 if (context) { in vmci_is_context_owner()
1207 if (context->cred) in vmci_is_context_owner()
1208 is_owner = uid_eq(context->cred->uid, uid); in vmci_is_context_owner()
1209 vmci_ctx_put(context); in vmci_is_context_owner()