cdsprm: Don't disable interrupts while holding l3_lock and list_lock

None of those functions run in interrupt context.

Signed-off-by: Kazuki Hashimoto <kazukih@tuta.io>
Signed-off-by: azrim <mirzaspc@gmail.com>
This commit is contained in:
Kazuki Hashimoto 2022-02-20 05:11:53 +09:00 committed by azrim
parent 7e0e5a1f3f
commit 4207704707
No known key found for this signature in database
GPG Key ID: 497F8FB059B45D1C

View File

@ -211,14 +211,12 @@ DECLARE_WAIT_QUEUE_HEAD(cdsprm_wq);
*/
void cdsprm_register_cdspl3gov(struct cdsprm_l3 *arg)
{
unsigned long flags;
if (!arg)
return;
spin_lock_irqsave(&gcdsprm.l3_lock, flags);
spin_lock(&gcdsprm.l3_lock);
gcdsprm.set_l3_freq = arg->set_l3_freq;
spin_unlock_irqrestore(&gcdsprm.l3_lock, flags);
spin_unlock(&gcdsprm.l3_lock);
}
EXPORT_SYMBOL(cdsprm_register_cdspl3gov);
@ -455,11 +453,9 @@ static int cdsprm_thermal_hvx_instruction_limit(unsigned int level)
*/
void cdsprm_unregister_cdspl3gov(void)
{
unsigned long flags;
spin_lock_irqsave(&gcdsprm.l3_lock, flags);
spin_lock(&gcdsprm.l3_lock);
gcdsprm.set_l3_freq = NULL;
spin_unlock_irqrestore(&gcdsprm.l3_lock, flags);
spin_unlock(&gcdsprm.l3_lock);
}
EXPORT_SYMBOL(cdsprm_unregister_cdspl3gov);
@ -625,13 +621,11 @@ static void cdsprm_rpmsg_send_details(void)
static struct cdsprm_request *get_next_request(void)
{
struct cdsprm_request *req = NULL;
unsigned long flags;
spin_lock_irqsave(&gcdsprm.list_lock, flags);
spin_lock(&gcdsprm.list_lock);
req = list_first_entry_or_null(&cdsprm_list,
struct cdsprm_request, node);
spin_unlock_irqrestore(&gcdsprm.list_lock,
flags);
spin_unlock(&gcdsprm.list_lock);
return req;
}
@ -641,7 +635,6 @@ static int process_cdsp_request_thread(void *data)
struct cdsprm_request *req = NULL;
struct sysmon_msg *msg = NULL;
unsigned int l3_clock_khz;
unsigned long flags;
int result = 0;
struct sysmon_msg_tx rpmsg_msg_tx;
@ -661,9 +654,9 @@ static int process_cdsp_request_thread(void *data)
SYSMON_CDSP_FEATURE_L3_RX) {
l3_clock_khz = msg->fs.l3_struct.l3_clock_khz;
spin_lock_irqsave(&gcdsprm.l3_lock, flags);
spin_lock(&gcdsprm.l3_lock);
gcdsprm.set_l3_freq_cached = gcdsprm.set_l3_freq;
spin_unlock_irqrestore(&gcdsprm.l3_lock, flags);
spin_unlock(&gcdsprm.l3_lock);
if (gcdsprm.set_l3_freq_cached) {
gcdsprm.set_l3_freq_cached(l3_clock_khz);
@ -721,10 +714,10 @@ static int process_cdsp_request_thread(void *data)
pr_debug("Sent preserved data to DSP\n");
}
spin_lock_irqsave(&gcdsprm.list_lock, flags);
spin_lock(&gcdsprm.list_lock);
list_del(&req->node);
req->busy = false;
spin_unlock_irqrestore(&gcdsprm.list_lock, flags);
spin_unlock(&gcdsprm.list_lock);
}
do_exit(0);
@ -765,7 +758,6 @@ static int cdsprm_rpmsg_callback(struct rpmsg_device *dev, void *data,
struct sysmon_msg *msg = (struct sysmon_msg *)data;
bool b_valid = false;
struct cdsprm_request *req;
unsigned long flags;
if (!data || (len < sizeof(*msg))) {
dev_err(&dev->dev,
@ -780,9 +772,9 @@ static int cdsprm_rpmsg_callback(struct rpmsg_device *dev, void *data,
b_valid = true;
} else if (msg->feature_id == SYSMON_CDSP_FEATURE_L3_RX) {
dev_dbg(&dev->dev, "Processing L3 request\n");
spin_lock_irqsave(&gcdsprm.l3_lock, flags);
spin_lock(&gcdsprm.l3_lock);
gcdsprm.set_l3_freq_cached = gcdsprm.set_l3_freq;
spin_unlock_irqrestore(&gcdsprm.l3_lock, flags);
spin_unlock(&gcdsprm.l3_lock);
if (gcdsprm.set_l3_freq_cached)
b_valid = true;
} else if ((msg->feature_id == SYSMON_CDSP_FEATURE_NPU_CORNER_RX) &&
@ -814,7 +806,7 @@ static int cdsprm_rpmsg_callback(struct rpmsg_device *dev, void *data,
}
if (b_valid) {
spin_lock_irqsave(&gcdsprm.list_lock, flags);
spin_lock(&gcdsprm.list_lock);
if (!gcdsprm.msg_queue[gcdsprm.msg_queue_idx].busy) {
req = &gcdsprm.msg_queue[gcdsprm.msg_queue_idx];
@ -826,14 +818,14 @@ static int cdsprm_rpmsg_callback(struct rpmsg_device *dev, void *data,
else
gcdsprm.msg_queue_idx = 0;
} else {
spin_unlock_irqrestore(&gcdsprm.list_lock, flags);
spin_unlock(&gcdsprm.list_lock);
dev_dbg(&dev->dev,
"Unable to queue cdsp request, no memory\n");
return -ENOMEM;
}
list_add_tail(&req->node, &cdsprm_list);
spin_unlock_irqrestore(&gcdsprm.list_lock, flags);
spin_unlock(&gcdsprm.list_lock);
wake_up_interruptible(&cdsprm_wq);
}