static int kvp_handle_handshake(struct hv_kvp_msg *msg) { int ret = 1; switch (msg->kvp_hdr.operation) { case KVP_OP_REGISTER: dm_reg_value = KVP_OP_REGISTER; pr_info("KVP: IP injection functionality not available\n"); pr_info("KVP: Upgrade the KVP daemon\n"); break; case KVP_OP_REGISTER1: dm_reg_value = KVP_OP_REGISTER1; break; default: pr_info("KVP: incompatible daemon\n"); pr_info("KVP: KVP version: %d, Daemon version: %d\n", KVP_OP_REGISTER1, msg->kvp_hdr.operation); ret = 0; } if (ret) { /* * We have a compatible daemon; complete the handshake. */ pr_info("KVP: user-mode registering done.\n"); kvp_register(dm_reg_value); kvp_transaction.active = false; if (kvp_transaction.kvp_context) hv_kvp_onchannelcallback(kvp_transaction.kvp_context); } return ret; }
static void poll_channel(struct vmbus_channel *channel) { unsigned long flags; spin_lock_irqsave(&channel->inbound_lock, flags); hv_kvp_onchannelcallback(channel); spin_unlock_irqrestore(&channel->inbound_lock, flags); }
static void poll_channel(struct vmbus_channel *channel) { if (channel->target_cpu != smp_processor_id()) smp_call_function_single(channel->target_cpu, hv_kvp_onchannelcallback, channel, true); else hv_kvp_onchannelcallback(channel); }
static void kvp_poll_wrapper(void *channel) { /* Transaction is finished, reset the state here to avoid races. */ kvp_transaction.state = HVUTIL_READY; hv_kvp_onchannelcallback(channel); }