static void oz_def_app_stop(struct oz_pd *pd, int pause);
static void oz_def_app_rx(struct oz_pd *pd, struct oz_elt *elt);
static void oz_pd_free(struct work_struct *work);
+static void oz_pd_uevent_workitem(struct work_struct *work);
/*------------------------------------------------------------------------------
* Counts the uncompleted isoc frames submitted to netcard.
*/
spin_lock_init(&pd->pd_destroy_lock);
pd->pd_destroy_scheduled = false;
- memset(&pd->workitem, 0, sizeof(pd->workitem));
INIT_WORK(&pd->workitem, oz_pd_free);
+ INIT_WORK(&pd->uevent_workitem, oz_pd_uevent_workitem);
}
return pd;
}
oz_trace_msg(M, "Destroying PD:%p\n", pd);
tasklet_kill(&pd->heartbeat_tasklet);
tasklet_kill(&pd->timeout_tasklet);
+
+ /* Finish scheduled uevent work, uevent might be rescheduled by
+ * oz timeout tasklet again
+ */
+ cancel_work_sync(&pd->uevent_workitem);
+
/* Delete any streams.
*/
e = pd->stream_list.next;
oz_trace_msg(M, "dev_put(%p)\n", pd->net_dev);
dev_put(pd->net_dev);
}
+
kfree(pd);
}
if (hrtimer_active(&pd->heartbeat))
hrtimer_cancel(&pd->heartbeat);
+
ret = schedule_work(&pd->workitem);
if (!ret)
pr_info("failed to schedule workitem\n");
int ret;
oz_pd_get(pd);
- memset(&pd->uevent_workitem, 0, sizeof(pd->uevent_workitem));
- INIT_WORK(&pd->uevent_workitem, oz_pd_uevent_workitem);
- ret = schedule_work(&pd->uevent_workitem);
+ ret = schedule_work(&pd->uevent_workitem);
if (!ret) {
- oz_trace("failed to schedule workitem\n");
+ pr_info("%s: failed to schedule workitem\n", __func__);
oz_pd_put(pd);
}
}