]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - drivers/hv/hv.c
Merge remote-tracking branches 'asoc/topic/davinci' and 'asoc/topic/dwc' into asoc...
[karo-tx-linux.git] / drivers / hv / hv.c
index 11bca51ef5ff9ea9a522c2f1a9bf9c5a682bb2cd..a1c086ba3b9a0736c522d648092d04d4ac92a3c7 100644 (file)
@@ -204,6 +204,8 @@ int hv_init(void)
               sizeof(int) * NR_CPUS);
        memset(hv_context.event_dpc, 0,
               sizeof(void *) * NR_CPUS);
+       memset(hv_context.msg_dpc, 0,
+              sizeof(void *) * NR_CPUS);
        memset(hv_context.clk_evt, 0,
               sizeof(void *) * NR_CPUS);
 
@@ -295,8 +297,14 @@ void hv_cleanup(void)
         * Cleanup the TSC page based CS.
         */
        if (ms_hyperv.features & HV_X64_MSR_REFERENCE_TSC_AVAILABLE) {
-               clocksource_change_rating(&hyperv_cs_tsc, 10);
-               clocksource_unregister(&hyperv_cs_tsc);
+               /*
+                * Crash can happen in an interrupt context and unregistering
+                * a clocksource is impossible and redundant in this case.
+                */
+               if (!oops_in_progress) {
+                       clocksource_change_rating(&hyperv_cs_tsc, 10);
+                       clocksource_unregister(&hyperv_cs_tsc);
+               }
 
                hypercall_msr.as_uint64 = 0;
                wrmsrl(HV_X64_MSR_REFERENCE_TSC, hypercall_msr.as_uint64);
@@ -337,22 +345,6 @@ int hv_post_message(union hv_connection_id connection_id,
        return status & 0xFFFF;
 }
 
-
-/*
- * hv_signal_event -
- * Signal an event on the specified connection using the hypervisor event IPC.
- *
- * This involves a hypercall.
- */
-int hv_signal_event(void *con_id)
-{
-       u64 status;
-
-       status = hv_do_hypercall(HVCALL_SIGNAL_EVENT, con_id, NULL);
-
-       return status & 0xFFFF;
-}
-
 static int hv_ce_set_next_event(unsigned long delta,
                                struct clock_event_device *evt)
 {
@@ -425,6 +417,13 @@ int hv_synic_alloc(void)
                }
                tasklet_init(hv_context.event_dpc[cpu], vmbus_on_event, cpu);
 
+               hv_context.msg_dpc[cpu] = kmalloc(size, GFP_ATOMIC);
+               if (hv_context.msg_dpc[cpu] == NULL) {
+                       pr_err("Unable to allocate event dpc\n");
+                       goto err;
+               }
+               tasklet_init(hv_context.msg_dpc[cpu], vmbus_on_msg_dpc, cpu);
+
                hv_context.clk_evt[cpu] = kzalloc(ced_size, GFP_ATOMIC);
                if (hv_context.clk_evt[cpu] == NULL) {
                        pr_err("Unable to allocate clock event device\n");
@@ -466,6 +465,7 @@ err:
 static void hv_synic_free_cpu(int cpu)
 {
        kfree(hv_context.event_dpc[cpu]);
+       kfree(hv_context.msg_dpc[cpu]);
        kfree(hv_context.clk_evt[cpu]);
        if (hv_context.synic_event_page[cpu])
                free_page((unsigned long)hv_context.synic_event_page[cpu]);