#include "nvhost_hwctx.h"
#include "nvhost_sync.h"
+DEFINE_MUTEX(channel_lock);
+
static int validate_reg(struct platform_device *ndev, u32 offset, int count)
{
int err = 0;
{
struct nvhost_channel_userctx *priv = filp->private_data;
+ mutex_lock(&channel_lock);
+ if (!priv->ch || !priv->ch->dev) {
+ mutex_unlock(&channel_lock);
+ return 0;
+ }
trace_nvhost_channel_release(dev_name(&priv->ch->dev->dev));
filp->private_data = NULL;
if (priv->job)
nvhost_job_put(priv->job);
+ mutex_unlock(&channel_lock);
nvhost_putchannel(priv->ch);
kfree(priv);
return 0;
return -EBUSY;
}
+ mutex_lock(&channel_lock);
+ if (!ch || !ch->dev) {
+ mutex_unlock(&channel_lock);
+ return -EINVAL;
+ }
trace_nvhost_channel_open(dev_name(&ch->dev->dev));
priv = kzalloc(sizeof(*priv), GFP_KERNEL);
priv->timeout_debug_dump = true;
if (!tegra_platform_is_silicon())
priv->timeout = 0;
+ mutex_unlock(&channel_lock);
return 0;
fail_priv:
nvhost_module_remove_client(ch->dev, priv);
fail_add_client:
kfree(priv);
fail:
+ mutex_unlock(&channel_lock);
nvhost_channelrelease(inode, filp);
return -ENOMEM;
}