94 lines
3.0 KiB
Diff
94 lines
3.0 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Grzegorz Janca <grzegorz.janca@intel.com>
|
|
Date: Mon, 4 Mar 2019 16:49:57 +0100
|
|
Subject: [PATCH] ASoC: Intel: Skl: Virt: Don't duplicate VBS audio client
|
|
|
|
In case of resume from S3 the new instance of vbs audio
|
|
client was created. It cause memory overflow.
|
|
This patch prevent to create the new vbs audio client
|
|
if is already created.
|
|
|
|
Change-Id: Ib1d28dde8d3c0f2b01287719ffa899690b7f76f6
|
|
Tracked-On: OAM-76372
|
|
Signed-off-by: Grzegorz Janca <grzegorz.janca@intel.com>
|
|
Reviewed-by: Wojciech Jablonski <wojciech.jablonski@intel.com>
|
|
Tested-by: Wojciech Jablonski <wojciech.jablonski@intel.com>
|
|
---
|
|
.../soc/intel/skylake/virtio/skl-virt-audio.c | 31 ++++++++++++++++---
|
|
1 file changed, 27 insertions(+), 4 deletions(-)
|
|
|
|
diff --git a/sound/soc/intel/skylake/virtio/skl-virt-audio.c b/sound/soc/intel/skylake/virtio/skl-virt-audio.c
|
|
index 0b712db04fe9..3ebbd623d7e3 100644
|
|
--- a/sound/soc/intel/skylake/virtio/skl-virt-audio.c
|
|
+++ b/sound/soc/intel/skylake/virtio/skl-virt-audio.c
|
|
@@ -144,14 +144,22 @@ int vskl_vbs_register_client(struct snd_skl_vbe *vbe)
|
|
unsigned int vmid;
|
|
int ret;
|
|
|
|
+ client = list_first_entry_or_null(&vbe->client_list,
|
|
+ struct snd_skl_vbe_client, list);
|
|
+ if (client != NULL) {
|
|
+ dev_info(vbe->dev, "Assign VBE Audio client id:%d\n",
|
|
+ client->vhm_client_id);
|
|
+ return 0;
|
|
+ }
|
|
+
|
|
/*
|
|
* vbs core has mechanism to manage the client
|
|
* there is no need to handle this in the special BE driver
|
|
* let's use the vbs core client management later
|
|
*/
|
|
- client = devm_kzalloc(vbe->dev, sizeof(*client), GFP_KERNEL);
|
|
+ client = kzalloc(sizeof(*client), GFP_KERNEL);
|
|
if (!client)
|
|
- return -EINVAL;
|
|
+ return -ENOMEM;
|
|
client->vbe = vbe;
|
|
|
|
vmid = dev_info->_ctx.vmid;
|
|
@@ -160,7 +168,7 @@ int vskl_vbs_register_client(struct snd_skl_vbe *vbe)
|
|
"snd_skl_vbe kick init\n");
|
|
if (client->vhm_client_id < 0) {
|
|
dev_err(vbe->dev, "failed to create client of acrn ioreq!\n");
|
|
- return client->vhm_client_id;
|
|
+ goto err;
|
|
}
|
|
|
|
ret = acrn_ioreq_add_iorange(client->vhm_client_id, REQ_PORTIO,
|
|
@@ -197,9 +205,17 @@ int vskl_vbs_register_client(struct snd_skl_vbe *vbe)
|
|
/* complete client init and add to list */
|
|
list_add(&client->list, &vbe->client_list);
|
|
|
|
+ dev_info(vbe->dev, "VBS Audio client:%d had been created\n",
|
|
+ client->vhm_client_id);
|
|
return 0;
|
|
err:
|
|
- acrn_ioreq_destroy_client(client->vhm_client_id);
|
|
+ if (client != NULL && client->vhm_client_id >= 0)
|
|
+ acrn_ioreq_destroy_client(client->vhm_client_id);
|
|
+
|
|
+ if (client != NULL) {
|
|
+ kfree(client);
|
|
+ client = NULL;
|
|
+ }
|
|
return -EINVAL;
|
|
}
|
|
|
|
@@ -214,6 +230,13 @@ static void vskl_vbs_close_client(struct snd_skl_vbe *vbe)
|
|
acrn_ioreq_destroy_client(client->vhm_client_id);
|
|
list_del(&client->list);
|
|
|
|
+ if (client != NULL) {
|
|
+ dev_info(vbe->dev, "Delete VBS Audio client. id:%d\n",
|
|
+ client->vhm_client_id);
|
|
+ kfree(client);
|
|
+ client = NULL;
|
|
+ }
|
|
+
|
|
} else {
|
|
pr_err("%s: vbs client not present!\n", __func__);
|
|
}
|
|
--
|
|
https://clearlinux.org
|
|
|