From dcf7b284d313d0562f6d5941279bf1ece827fb86 Mon Sep 17 00:00:00 2001 From: Murali Nalajala Date: Fri, 2 Oct 2020 16:29:22 -0700 Subject: [PATCH] haven: avoid sleeping in atomic context messages Currently blocking calls are made from atomic context in doorbell and message queue drivers. Modify the code flow to avoid kernel warnings when drivers are initializing. Change-Id: Iae851d5d7e09210a8fb617da0e2cc4cc52c0f258 Signed-off-by: Murali Nalajala --- drivers/virt/haven/hh_dbl.c | 4 ++-- drivers/virt/haven/hh_msgq.c | 10 +++++----- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/drivers/virt/haven/hh_dbl.c b/drivers/virt/haven/hh_dbl.c index 1120ccee5ec8..ce15dbcc2203 100644 --- a/drivers/virt/haven/hh_dbl.c +++ b/drivers/virt/haven/hh_dbl.c @@ -328,7 +328,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; @@ -390,7 +390,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);