diff --git a/drivers/virt/haven/hh_dbl.c b/drivers/virt/haven/hh_dbl.c index b9a797c230ed..f441c3781d15 100644 --- a/drivers/virt/haven/hh_dbl.c +++ b/drivers/virt/haven/hh_dbl.c @@ -329,7 +329,7 @@ void *hh_dbl_tx_register(enum hh_dbl_label label) if (cap_table_entry->client_desc) { client_desc = cap_table_entry->client_desc; } else { - client_desc = kzalloc(sizeof(*client_desc), GFP_KERNEL); + client_desc = kzalloc(sizeof(*client_desc), GFP_ATOMIC); if (!client_desc) { ret = -ENOMEM; goto err; @@ -391,7 +391,7 @@ void *hh_dbl_rx_register(enum hh_dbl_label label, dbl_rx_cb_t rx_cb, void *priv) if (cap_table_entry->client_desc) { client_desc = cap_table_entry->client_desc; } else { - client_desc = kzalloc(sizeof(*client_desc), GFP_KERNEL); + client_desc = kzalloc(sizeof(*client_desc), GFP_ATOMIC); if (!client_desc) { ret = -ENOMEM; goto err; diff --git a/drivers/virt/haven/hh_msgq.c b/drivers/virt/haven/hh_msgq.c index 899f61b77d74..0f19aa8468af 100644 --- a/drivers/virt/haven/hh_msgq.c +++ b/drivers/virt/haven/hh_msgq.c @@ -434,16 +434,16 @@ int hh_msgq_populate_cap_info(enum hh_msgq_label label, u64 cap_id, cap_table_entry = &hh_msgq_cap_table[label]; - spin_lock(&cap_table_entry->cap_entry_lock); - if (direction == HH_MSGQ_DIRECTION_TX) { ret = request_irq(irq, hh_msgq_tx_isr, 0, cap_table_entry->tx_irq_name, cap_table_entry); if (ret < 0) goto err; - cap_table_entry->tx_irq = irq; + spin_lock(&cap_table_entry->cap_entry_lock); cap_table_entry->tx_cap_id = cap_id; + cap_table_entry->tx_irq = irq; + spin_unlock(&cap_table_entry->cap_entry_lock); wake_up_interruptible(&cap_table_entry->tx_wq); } else if (direction == HH_MSGQ_DIRECTION_RX) { @@ -452,8 +452,10 @@ int hh_msgq_populate_cap_info(enum hh_msgq_label label, u64 cap_id, if (ret < 0) goto err; + spin_lock(&cap_table_entry->cap_entry_lock); cap_table_entry->rx_cap_id = cap_id; cap_table_entry->rx_irq = irq; + spin_unlock(&cap_table_entry->cap_entry_lock); wake_up_interruptible(&cap_table_entry->rx_wq); } else { @@ -463,7 +465,6 @@ int hh_msgq_populate_cap_info(enum hh_msgq_label label, u64 cap_id, } irq_set_irq_wake(irq, 1); - spin_unlock(&cap_table_entry->cap_entry_lock); pr_debug( "%s: label: %d; cap_id: %llu; dir: %d; irq: %d\n", @@ -472,7 +473,6 @@ int hh_msgq_populate_cap_info(enum hh_msgq_label label, u64 cap_id, return 0; err: - spin_unlock(&cap_table_entry->cap_entry_lock); return ret; } EXPORT_SYMBOL(hh_msgq_populate_cap_info);