* [PATCH v3 0/3] staging: tidspbridge: bugfixes
@ 2010-11-05 16:31 Ionut Nicu
2010-11-05 16:31 ` [PATCH v3 1/3] staging: tidspbridge: fix mgr_enum_node_info Ionut Nicu
` (3 more replies)
0 siblings, 4 replies; 6+ messages in thread
From: Ionut Nicu @ 2010-11-05 16:31 UTC (permalink / raw)
To: Greg Kroah-Hartman, Omar Ramirez Luna
Cc: Fernando Guzman Lugo, Felipe Contreras, linux-omap, Ionut Nicu
Changes since v1:
* Split the mgr_enum_node_info patch into two patches:
one that fixes the issue and one that reorganizes the
code.
Ionut Nicu (3):
staging: tidspbridge: fix mgr_enum_node_info
staging: tidspbridge: mgr_enum_node_info cleanup
staging: tidspbridge: fix kernel oops in bridge_io_get_proc_load
drivers/staging/tidspbridge/core/io_sm.c | 78 +++++++++++------------------
drivers/staging/tidspbridge/rmgr/mgr.c | 50 +++++++------------
2 files changed, 48 insertions(+), 80 deletions(-)
--
1.7.2.3
^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH v3 1/3] staging: tidspbridge: fix mgr_enum_node_info
2010-11-05 16:31 [PATCH v3 0/3] staging: tidspbridge: bugfixes Ionut Nicu
@ 2010-11-05 16:31 ` Ionut Nicu
2010-11-05 16:39 ` Nishanth Menon
2010-11-05 16:31 ` [PATCH v3 2/3] staging: tidspbridge: mgr_enum_node_info cleanup Ionut Nicu
` (2 subsequent siblings)
3 siblings, 1 reply; 6+ messages in thread
From: Ionut Nicu @ 2010-11-05 16:31 UTC (permalink / raw)
To: Greg Kroah-Hartman, Omar Ramirez Luna
Cc: Fernando Guzman Lugo, Felipe Contreras, linux-omap, Ionut Nicu
The current code was always returning a non-zero status value
to userspace applications when this ioctl was called.
The error code was ENODATA, which isn't actually an error,
it's always returned by dcd_enumerate_object() when it hits the
end of list.
Signed-off-by: Felipe Contreras <felipe.contreras@gmail.com>
---
drivers/staging/tidspbridge/rmgr/mgr.c | 5 +++++
1 files changed, 5 insertions(+), 0 deletions(-)
diff --git a/drivers/staging/tidspbridge/rmgr/mgr.c b/drivers/staging/tidspbridge/rmgr/mgr.c
index 0ea89a1..2eab6a5 100644
--- a/drivers/staging/tidspbridge/rmgr/mgr.c
+++ b/drivers/staging/tidspbridge/rmgr/mgr.c
@@ -169,6 +169,11 @@ int mgr_enum_node_info(u32 node_id, struct dsp_ndbprops *pndb_props,
}
}
+
+ /* the last status is not 0, but neither an error */
+ if (status > 0)
+ status = 0;
+
if (!status) {
if (node_id > (node_index - 1)) {
status = -EINVAL;
--
1.7.2.3
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH v3 2/3] staging: tidspbridge: mgr_enum_node_info cleanup
2010-11-05 16:31 [PATCH v3 0/3] staging: tidspbridge: bugfixes Ionut Nicu
2010-11-05 16:31 ` [PATCH v3 1/3] staging: tidspbridge: fix mgr_enum_node_info Ionut Nicu
@ 2010-11-05 16:31 ` Ionut Nicu
2010-11-05 16:31 ` [PATCH v3 3/3] staging: tidspbridge: fix kernel oops in bridge_io_get_proc_load Ionut Nicu
2010-12-06 8:56 ` [PATCH v3 0/3] staging: tidspbridge: bugfixes Ramirez Luna, Omar
3 siblings, 0 replies; 6+ messages in thread
From: Ionut Nicu @ 2010-11-05 16:31 UTC (permalink / raw)
To: Greg Kroah-Hartman, Omar Ramirez Luna
Cc: Fernando Guzman Lugo, Felipe Contreras, linux-omap, Ionut Nicu
Reorganized mgr_enum_node_info code to increase its
readability.
Signed-off-by: Ionut Nicu <ionut.nicu@mindbit.ro>
---
drivers/staging/tidspbridge/rmgr/mgr.c | 51 ++++++++++----------------------
1 files changed, 16 insertions(+), 35 deletions(-)
diff --git a/drivers/staging/tidspbridge/rmgr/mgr.c b/drivers/staging/tidspbridge/rmgr/mgr.c
index 2eab6a5..16410a5 100644
--- a/drivers/staging/tidspbridge/rmgr/mgr.c
+++ b/drivers/staging/tidspbridge/rmgr/mgr.c
@@ -134,8 +134,7 @@ int mgr_enum_node_info(u32 node_id, struct dsp_ndbprops *pndb_props,
u32 undb_props_size, u32 *pu_num_nodes)
{
int status = 0;
- struct dsp_uuid node_uuid, temp_uuid;
- u32 temp_index = 0;
+ struct dsp_uuid node_uuid;
u32 node_index = 0;
struct dcd_genericobj gen_obj;
struct mgr_object *pmgr_obj = NULL;
@@ -149,24 +148,27 @@ int mgr_enum_node_info(u32 node_id, struct dsp_ndbprops *pndb_props,
*pu_num_nodes = 0;
/* Get the Manager Object from the driver data */
if (!drv_datap || !drv_datap->mgr_object) {
- status = -ENODATA;
pr_err("%s: Failed to retrieve the object handle\n", __func__);
- goto func_cont;
- } else {
- pmgr_obj = drv_datap->mgr_object;
+ return -ENODATA;
}
+ pmgr_obj = drv_datap->mgr_object;
DBC_ASSERT(pmgr_obj);
/* Forever loop till we hit failed or no more items in the
* Enumeration. We will exit the loop other than 0; */
- while (status == 0) {
- status = dcd_enumerate_object(temp_index++, DSP_DCDNODETYPE,
- &temp_uuid);
- if (status == 0) {
- node_index++;
- if (node_id == (node_index - 1))
- node_uuid = temp_uuid;
-
+ while (!status) {
+ status = dcd_enumerate_object(node_index++, DSP_DCDNODETYPE,
+ &node_uuid);
+ if (status)
+ break;
+ *pu_num_nodes = node_index;
+ if (node_id == (node_index - 1)) {
+ status = dcd_get_object_def(pmgr_obj->hdcd_mgr,
+ &node_uuid, DSP_DCDNODETYPE, &gen_obj);
+ if (status)
+ break;
+ /* Get the Obj def */
+ *pndb_props = gen_obj.obj_data.node_obj.ndb_props;
}
}
@@ -174,27 +176,6 @@ int mgr_enum_node_info(u32 node_id, struct dsp_ndbprops *pndb_props,
if (status > 0)
status = 0;
- if (!status) {
- if (node_id > (node_index - 1)) {
- status = -EINVAL;
- } else {
- status = dcd_get_object_def(pmgr_obj->hdcd_mgr,
- (struct dsp_uuid *)
- &node_uuid, DSP_DCDNODETYPE,
- &gen_obj);
- if (!status) {
- /* Get the Obj def */
- *pndb_props =
- gen_obj.obj_data.node_obj.ndb_props;
- *pu_num_nodes = node_index;
- }
- }
- }
-
-func_cont:
- DBC_ENSURE((!status && *pu_num_nodes > 0) ||
- (status && *pu_num_nodes == 0));
-
return status;
}
--
1.7.2.3
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH v3 3/3] staging: tidspbridge: fix kernel oops in bridge_io_get_proc_load
2010-11-05 16:31 [PATCH v3 0/3] staging: tidspbridge: bugfixes Ionut Nicu
2010-11-05 16:31 ` [PATCH v3 1/3] staging: tidspbridge: fix mgr_enum_node_info Ionut Nicu
2010-11-05 16:31 ` [PATCH v3 2/3] staging: tidspbridge: mgr_enum_node_info cleanup Ionut Nicu
@ 2010-11-05 16:31 ` Ionut Nicu
2010-12-06 8:56 ` [PATCH v3 0/3] staging: tidspbridge: bugfixes Ramirez Luna, Omar
3 siblings, 0 replies; 6+ messages in thread
From: Ionut Nicu @ 2010-11-05 16:31 UTC (permalink / raw)
To: Greg Kroah-Hartman, Omar Ramirez Luna
Cc: Fernando Guzman Lugo, Felipe Contreras, linux-omap, Ionut Nicu
The DSP shared memory area gets initialized only when
a COFF file is loaded.
If bridge_io_get_proc_load is called before loading a base
image into the DSP, the shared_mem member of the io manager
will be NULL, resulting in a kernel oops when it's dereferenced.
Also made some coding style changes to bridge_io_create.
Signed-off-by: Ionut Nicu <ionut.nicu@mindbit.ro>
---
drivers/staging/tidspbridge/core/io_sm.c | 78 +++++++++++------------------
1 files changed, 30 insertions(+), 48 deletions(-)
diff --git a/drivers/staging/tidspbridge/core/io_sm.c b/drivers/staging/tidspbridge/core/io_sm.c
index de2cc3b..bd407b6 100644
--- a/drivers/staging/tidspbridge/core/io_sm.c
+++ b/drivers/staging/tidspbridge/core/io_sm.c
@@ -164,57 +164,41 @@ int bridge_io_create(struct io_mgr **io_man,
struct dev_object *hdev_obj,
const struct io_attrs *mgr_attrts)
{
- int status = 0;
struct io_mgr *pio_mgr = NULL;
- struct shm *shared_mem = NULL;
struct bridge_dev_context *hbridge_context = NULL;
struct cfg_devnode *dev_node_obj;
struct chnl_mgr *hchnl_mgr;
u8 dev_type;
/* Check requirements */
- if (!io_man || !mgr_attrts || mgr_attrts->word_size == 0) {
- status = -EFAULT;
- goto func_end;
- }
+ if (!io_man || !mgr_attrts || mgr_attrts->word_size == 0)
+ return -EFAULT;
+
+ *io_man = NULL;
+
dev_get_chnl_mgr(hdev_obj, &hchnl_mgr);
- if (!hchnl_mgr || hchnl_mgr->hio_mgr) {
- status = -EFAULT;
- goto func_end;
- }
+ if (!hchnl_mgr || hchnl_mgr->hio_mgr)
+ return -EFAULT;
+
/*
* Message manager will be created when a file is loaded, since
* size of message buffer in shared memory is configurable in
* the base image.
*/
dev_get_bridge_context(hdev_obj, &hbridge_context);
- if (!hbridge_context) {
- status = -EFAULT;
- goto func_end;
- }
+ if (!hbridge_context)
+ return -EFAULT;
+
dev_get_dev_type(hdev_obj, &dev_type);
- /*
- * DSP shared memory area will get set properly when
- * a program is loaded. They are unknown until a COFF file is
- * loaded. I chose the value -1 because it was less likely to be
- * a valid address than 0.
- */
- shared_mem = (struct shm *)-1;
/* Allocate IO manager object */
pio_mgr = kzalloc(sizeof(struct io_mgr), GFP_KERNEL);
- if (pio_mgr == NULL) {
- status = -ENOMEM;
- goto func_end;
- }
+ if (!pio_mgr)
+ return -ENOMEM;
/* Initialize chnl_mgr object */
-#if defined(CONFIG_TIDSPBRIDGE_BACKTRACE) || defined(CONFIG_TIDSPBRIDGE_DEBUG)
- pio_mgr->pmsg = NULL;
-#endif
pio_mgr->hchnl_mgr = hchnl_mgr;
pio_mgr->word_size = mgr_attrts->word_size;
- pio_mgr->shared_mem = shared_mem;
if (dev_type == DSP_UNIT) {
/* Create an IO DPC */
@@ -226,29 +210,24 @@ int bridge_io_create(struct io_mgr **io_man,
spin_lock_init(&pio_mgr->dpc_lock);
- status = dev_get_dev_node(hdev_obj, &dev_node_obj);
+ if (dev_get_dev_node(hdev_obj, &dev_node_obj)) {
+ bridge_io_destroy(pio_mgr);
+ return -EIO;
+ }
}
- if (!status) {
- pio_mgr->hbridge_context = hbridge_context;
- pio_mgr->shared_irq = mgr_attrts->irq_shared;
- if (dsp_wdt_init())
- status = -EPERM;
- } else {
- status = -EIO;
- }
-func_end:
- if (status) {
- /* Cleanup */
+ pio_mgr->hbridge_context = hbridge_context;
+ pio_mgr->shared_irq = mgr_attrts->irq_shared;
+ if (dsp_wdt_init()) {
bridge_io_destroy(pio_mgr);
- if (io_man)
- *io_man = NULL;
- } else {
- /* Return IO manager object to caller... */
- hchnl_mgr->hio_mgr = pio_mgr;
- *io_man = pio_mgr;
+ return -EPERM;
}
- return status;
+
+ /* Return IO manager object to caller... */
+ hchnl_mgr->hio_mgr = pio_mgr;
+ *io_man = pio_mgr;
+
+ return 0;
}
/*
@@ -1532,6 +1511,9 @@ int io_sh_msetting(struct io_mgr *hio_mgr, u8 desc, void *pargs)
int bridge_io_get_proc_load(struct io_mgr *hio_mgr,
struct dsp_procloadstat *proc_lstat)
{
+ if (!hio_mgr->shared_mem)
+ return -EFAULT;
+
proc_lstat->curr_load =
hio_mgr->shared_mem->load_mon_info.curr_dsp_load;
proc_lstat->predicted_load =
--
1.7.2.3
^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH v3 1/3] staging: tidspbridge: fix mgr_enum_node_info
2010-11-05 16:31 ` [PATCH v3 1/3] staging: tidspbridge: fix mgr_enum_node_info Ionut Nicu
@ 2010-11-05 16:39 ` Nishanth Menon
0 siblings, 0 replies; 6+ messages in thread
From: Nishanth Menon @ 2010-11-05 16:39 UTC (permalink / raw)
To: Ionut Nicu
Cc: Greg Kroah-Hartman, Omar Ramirez Luna, Fernando Guzman Lugo,
Felipe Contreras, linux-omap, Ionut Nicu
Ionut Nicu wrote, on 11/05/2010 12:31 PM:
> The current code was always returning a non-zero status value
> to userspace applications when this ioctl was called.
>
> The error code was ENODATA, which isn't actually an error,
> it's always returned by dcd_enumerate_object() when it hits the
> end of list.
>
> Signed-off-by: Felipe Contreras<felipe.contreras@gmail.com>
please try this as well:
a) git rebase -i master (to rebase from master if your branch is off that)
b) change this commit to edit
c) git commit --amend --author "Felipe Contreras
<felipe.contreras@gmail.com>"
to change the authorship
d) git rebase --continue
OR
edit the patch Manually and change:
From: Ionut Nicu <ionut.nicu@gmail.com>
to
From: Felipe Contreras <felipe.contreras@gmail.com>
The From shows the authorship, that way, when you do a git send email,
the proper acknowledgements are done :)
--
Regards,
Nishanth Menon
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH v3 0/3] staging: tidspbridge: bugfixes
2010-11-05 16:31 [PATCH v3 0/3] staging: tidspbridge: bugfixes Ionut Nicu
` (2 preceding siblings ...)
2010-11-05 16:31 ` [PATCH v3 3/3] staging: tidspbridge: fix kernel oops in bridge_io_get_proc_load Ionut Nicu
@ 2010-12-06 8:56 ` Ramirez Luna, Omar
3 siblings, 0 replies; 6+ messages in thread
From: Ramirez Luna, Omar @ 2010-12-06 8:56 UTC (permalink / raw)
To: Ionut Nicu
Cc: Greg Kroah-Hartman, Fernando Guzman Lugo, Felipe Contreras,
linux-omap, Ionut Nicu
On Fri, Nov 5, 2010 at 11:31 AM, Ionut Nicu <ionut.nicu@gmail.com> wrote:
> Changes since v1:
>
> * Split the mgr_enum_node_info patch into two patches:
> one that fixes the issue and one that reorganizes the
> code.
>
> Ionut Nicu (3):
> staging: tidspbridge: fix mgr_enum_node_info
> staging: tidspbridge: mgr_enum_node_info cleanup
> staging: tidspbridge: fix kernel oops in bridge_io_get_proc_load
Pushed to dspbridge.
Regards,
Omar
--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2010-12-06 8:56 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-11-05 16:31 [PATCH v3 0/3] staging: tidspbridge: bugfixes Ionut Nicu
2010-11-05 16:31 ` [PATCH v3 1/3] staging: tidspbridge: fix mgr_enum_node_info Ionut Nicu
2010-11-05 16:39 ` Nishanth Menon
2010-11-05 16:31 ` [PATCH v3 2/3] staging: tidspbridge: mgr_enum_node_info cleanup Ionut Nicu
2010-11-05 16:31 ` [PATCH v3 3/3] staging: tidspbridge: fix kernel oops in bridge_io_get_proc_load Ionut Nicu
2010-12-06 8:56 ` [PATCH v3 0/3] staging: tidspbridge: bugfixes Ramirez Luna, Omar
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.