]> git.kernelconcepts.de Git - karo-tx-linux.git/blobdiff - drivers/hv/channel.c
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux
[karo-tx-linux.git] / drivers / hv / channel.c
index 602ca86a6488d6d90e4927d79ed99ca6c5df42b8..284cf66489f428f1b00434d088da85222f00ea3a 100644 (file)
@@ -471,18 +471,26 @@ int vmbus_teardown_gpadl(struct vmbus_channel *channel, u32 gpadl_handle)
 }
 EXPORT_SYMBOL_GPL(vmbus_teardown_gpadl);
 
+static void reset_channel_cb(void *arg)
+{
+       struct vmbus_channel *channel = arg;
+
+       channel->onchannel_callback = NULL;
+}
+
 static void vmbus_close_internal(struct vmbus_channel *channel)
 {
        struct vmbus_channel_close_channel *msg;
        int ret;
-       unsigned long flags;
 
        channel->state = CHANNEL_OPEN_STATE;
        channel->sc_creation_callback = NULL;
        /* Stop callback and cancel the timer asap */
-       spin_lock_irqsave(&channel->inbound_lock, flags);
-       channel->onchannel_callback = NULL;
-       spin_unlock_irqrestore(&channel->inbound_lock, flags);
+       if (channel->target_cpu != smp_processor_id())
+               smp_call_function_single(channel->target_cpu, reset_channel_cb,
+                                        channel, true);
+       else
+               reset_channel_cb(channel);
 
        /* Send a closing message */
 
@@ -674,8 +682,7 @@ int vmbus_sendpacket_multipagebuffer(struct vmbus_channel *channel,
        u32 pfncount = NUM_PAGES_SPANNED(multi_pagebuffer->offset,
                                         multi_pagebuffer->len);
 
-
-       if ((pfncount < 0) || (pfncount > MAX_MULTIPAGE_BUFFER_COUNT))
+       if (pfncount > MAX_MULTIPAGE_BUFFER_COUNT)
                return -EINVAL;
 
        /*