-
Notifications
You must be signed in to change notification settings - Fork 353
Memory attributes to user space dp module #10603
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Changes from all commits
3cfeb71
38c2894
2e07ee5
c58749b
e32ab4d
4b50cac
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -59,23 +59,46 @@ struct comp_dev *module_adapter_new(const struct comp_driver *drv, | |
| #endif | ||
|
|
||
| static struct vregion *module_adapter_dp_heap_new(const struct comp_ipc_config *config, | ||
| const struct module_ext_init_data *ext_init, | ||
| size_t *heap_size) | ||
| { | ||
| /* src-lite with 8 channels has been seen allocating 14k in one go */ | ||
| /* FIXME: the size will be derived from configuration */ | ||
| const size_t buf_size = 20 * 1024; | ||
| size_t buf_size = CONFIG_SOF_USERSPACE_DP_DEFAULT_HEAP_SIZE; | ||
| size_t lifetime_size = 4096; | ||
|
|
||
| /* | ||
| * A 1-to-1 replacement of the original heap implementation would be to | ||
| * have "lifetime size" equal to 0. But (1) this is invalid for | ||
| * vregion_create() and (2) we gradually move objects, that are simple | ||
| * to move to the lifetime buffer. Make it 1k for the beginning. | ||
| */ | ||
| return vregion_create(4096, buf_size - 4096); | ||
| #if CONFIG_IPC_MAJOR_4 | ||
| if (config->ipc_extended_init && ext_init && ext_init->dp_data && | ||
| (ext_init->dp_data->lifetime_heap_bytes > 0 || | ||
| ext_init->dp_data->interim_heap_bytes > 0)) { | ||
| if (ext_init->dp_data->lifetime_heap_bytes > 64*1024*1024 || | ||
| ext_init->dp_data->interim_heap_bytes > 64*1024*1024 || | ||
| ext_init->dp_data->lifetime_heap_bytes == 0 || | ||
| ext_init->dp_data->interim_heap_bytes == 0) { | ||
| LOG_ERR("Bad lifetime %u or interim %u heap size for %#x", | ||
| ext_init->dp_data->lifetime_heap_bytes, | ||
| ext_init->dp_data->interim_heap_bytes, config->id); | ||
| return NULL; | ||
| } | ||
|
|
||
| lifetime_size = ext_init->dp_data->lifetime_heap_bytes; | ||
| buf_size = ext_init->dp_data->lifetime_heap_bytes + | ||
| ext_init->dp_data->interim_heap_bytes; | ||
|
|
||
| LOG_INF("to %u + %u = %zu byte heap size requested in IPC for %#x", | ||
| ext_init->dp_data->lifetime_heap_bytes, | ||
| ext_init->dp_data->interim_heap_bytes, buf_size, config->id); | ||
| } | ||
|
Comment on lines
+84
to
+90
|
||
| #endif | ||
|
|
||
| *heap_size = buf_size; | ||
|
|
||
| return vregion_create(lifetime_size, buf_size - lifetime_size); | ||
| } | ||
|
|
||
| static struct processing_module *module_adapter_mem_alloc(const struct comp_driver *drv, | ||
| const struct comp_ipc_config *config) | ||
| static | ||
| struct processing_module *module_adapter_mem_alloc(const struct comp_driver *drv, | ||
| const struct comp_ipc_config *config, | ||
| const struct module_ext_init_data *ext_init) | ||
| { | ||
| struct k_heap *mod_heap; | ||
| struct vregion *mod_vreg; | ||
|
|
@@ -94,7 +117,7 @@ static struct processing_module *module_adapter_mem_alloc(const struct comp_driv | |
|
|
||
| if (config->proc_domain == COMP_PROCESSING_DOMAIN_DP && IS_ENABLED(CONFIG_USERSPACE) && | ||
| !IS_ENABLED(CONFIG_SOF_USERSPACE_USE_DRIVER_HEAP)) { | ||
| mod_vreg = module_adapter_dp_heap_new(config, &heap_size); | ||
| mod_vreg = module_adapter_dp_heap_new(config, ext_init, &heap_size); | ||
| if (!mod_vreg) { | ||
| comp_cl_err(drv, "Failed to allocate DP module heap / vregion"); | ||
| return NULL; | ||
|
|
@@ -230,8 +253,14 @@ struct comp_dev *module_adapter_new_ext(const struct comp_driver *drv, | |
| return NULL; | ||
| } | ||
| #endif | ||
| const struct module_ext_init_data *ext_init = | ||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Minor: You could probably pass only dp_data to module_adapter_mem_alloc instead of the entire structure ext_data.
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. dp_data is defined only in ipc4 headers, so I think its easiest to keep it behind #if , and keep the module_adapter_mem_alloc() arguments the way they are. |
||
| #if CONFIG_IPC_MAJOR_4 | ||
| &ext_data; | ||
| #else | ||
| NULL; | ||
| #endif | ||
|
|
||
| struct processing_module *mod = module_adapter_mem_alloc(drv, config); | ||
| struct processing_module *mod = module_adapter_mem_alloc(drv, config, ext_init); | ||
|
|
||
| if (!mod) | ||
| return NULL; | ||
|
|
@@ -244,6 +273,18 @@ struct comp_dev *module_adapter_new_ext(const struct comp_driver *drv, | |
|
|
||
| struct comp_dev *dev = mod->dev; | ||
|
|
||
| dst = &mod->priv.cfg; | ||
| /* | ||
| * NOTE: dst->ext_data points to stack variable and contains | ||
| * pointers to IPC payload mailbox, so its only valid in | ||
| * functions that are called from this function. This is | ||
| * why the pointer is set to NULL before this function | ||
| * exits. | ||
| */ | ||
| #if CONFIG_IPC_MAJOR_4 | ||
| dst->ext_data = &ext_data; | ||
| #endif | ||
|
|
||
| #if CONFIG_ZEPHYR_DP_SCHEDULER | ||
| /* create a task for DP processing */ | ||
| if (config->proc_domain == COMP_PROCESSING_DOMAIN_DP) { | ||
|
|
@@ -256,16 +297,6 @@ struct comp_dev *module_adapter_new_ext(const struct comp_driver *drv, | |
| } | ||
| #endif /* CONFIG_ZEPHYR_DP_SCHEDULER */ | ||
|
|
||
| dst = &mod->priv.cfg; | ||
| /* | ||
| * NOTE: dst->ext_data points to stack variable and contains | ||
| * pointers to IPC payload mailbox, so its only valid in | ||
| * functions that called from this function. This why | ||
| * the pointer is set NULL before this function exits. | ||
| */ | ||
| #if CONFIG_IPC_MAJOR_4 | ||
| dst->ext_data = &ext_data; | ||
| #endif | ||
| ret = module_adapter_init_data(dev, dst, config, &spec); | ||
| if (ret) { | ||
| comp_err(dev, "%d: module init data failed", | ||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -388,6 +388,7 @@ int pipeline_comp_dp_task_init(struct comp_dev *comp) | |
| { | ||
| /* DP tasks are guaranteed to have a module_adapter */ | ||
| struct processing_module *mod = comp_mod(comp); | ||
| size_t stack_size = TASK_DP_STACK_SIZE; | ||
| struct task_ops ops = { | ||
| .run = dp_task_run, | ||
| .get_deadline = NULL, | ||
|
|
@@ -403,8 +404,17 @@ int pipeline_comp_dp_task_init(struct comp_dev *comp) | |
| unsigned int flags = IS_ENABLED(CONFIG_USERSPACE) ? K_USER : 0; | ||
| #endif | ||
|
|
||
| if (mod->priv.cfg.ext_data && mod->priv.cfg.ext_data->dp_data && | ||
| mod->priv.cfg.ext_data->dp_data->stack_bytes > 0) { | ||
| stack_size = MAX(mod->priv.cfg.ext_data->dp_data->stack_bytes, | ||
| CONFIG_ZEPHYR_DP_SCHEDULER_MIN_STACK_SIZE); | ||
|
Collaborator
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. this doesn't seem very logical to me. The default is
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I can of course change this, but to me it looks quite logical. If the stack size is not set, e.g. dp_data->stack_bytes = 0, use the default which is TASK_DP_STACK_SIZE. Then if somebody is deliberately trying to cause some specific crash by sending a ridiculously small stack size, then that is prevented by forcing the minimum to 512. @lgirdwood what did you mean exactly by this comment: #10603 (comment) ? ps. Sorry, something wrong with github webpage today. It does not show all the comments in the commits section, and then its impossible to comment to them in review mode ̣. |
||
| comp_info(comp, "stack size set to %zu, %zu requested, min allowed %zu", | ||
| stack_size, mod->priv.cfg.ext_data->dp_data->stack_bytes, | ||
| CONFIG_ZEPHYR_DP_SCHEDULER_MIN_STACK_SIZE); | ||
| } | ||
|
|
||
| return scheduler_dp_task_init(&comp->task, SOF_UUID(dp_task_uuid), &ops, mod, | ||
| comp->ipc_config.core, TASK_DP_STACK_SIZE, flags); | ||
| comp->ipc_config.core, stack_size, flags); | ||
| } | ||
| #endif /* CONFIG_ZEPHYR_DP_SCHEDULER */ | ||
|
|
||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -698,9 +698,11 @@ IncludeByKey.PASSTHROUGH { | |
| IncludeByKey.SRC_DOMAIN { | ||
| "DP" { | ||
| core_id $DP_SRC_CORE_ID | ||
| domain_id 123 | ||
| stack_bytes_requirement 4096 | ||
| heap_bytes_requirement 8192 | ||
| domain_id 0 | ||
| stack_bytes_requirement 2048 | ||
| interim_heap_bytes_requirement "$[(28 * 1024)]" | ||
| lifetime_heap_bytes_requirement 4096 | ||
|
Collaborator
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Let's keep the same values as set by 260ce13 |
||
| shared_bytes_requirement 0 | ||
| } | ||
| } | ||
| } | ||
|
|
@@ -1382,9 +1384,11 @@ IncludeByKey.PASSTHROUGH { | |
| IncludeByKey.SRC_DOMAIN { | ||
| "DP" { | ||
| core_id $DP_SRC_CORE_ID | ||
| domain_id 123 | ||
| stack_bytes_requirement 4096 | ||
| heap_bytes_requirement 8192 | ||
| domain_id 0 | ||
| stack_bytes_requirement 2048 | ||
| interim_heap_bytes_requirement "$[(28 * 1024)]" | ||
| lifetime_heap_bytes_requirement 4096 | ||
| shared_bytes_requirement 0 | ||
| } | ||
| } | ||
|
|
||
|
|
||
Uh oh!
There was an error while loading. Please reload this page.