On Mon, Dec 09, 2019 at 01:34:29PM -0800, Tadeusz Struk wrote: > I think that's expected for a non-blocking operation. What do you mean by "expected"? It is a locking bug. When you implemented the feature you failed to free locks before going back to the user space and I failed to notice this when I reviewed the code. > To get rid of the warning it should be changed to something like this: > > diff --git a/drivers/char/tpm/tpm-dev-common.c > b/drivers/char/tpm/tpm-dev-common.c > index 2ec47a69a2a6..47f1c0c5c8de 100644 > --- a/drivers/char/tpm/tpm-dev-common.c > +++ b/drivers/char/tpm/tpm-dev-common.c > @@ -61,6 +61,12 @@ static void tpm_dev_async_work(struct work_struct *work) > > mutex_lock(&priv->buffer_mutex); > priv->command_enqueued = false; > + ret = tpm_try_get_ops(priv->chip); > + if (ret) { > + priv->response_length = ret; > + goto out; > + } > + > ret = tpm_dev_transmit(priv->chip, priv->space, priv->data_buffer, > sizeof(priv->data_buffer)); > tpm_put_ops(priv->chip); > @@ -68,6 +74,7 @@ static void tpm_dev_async_work(struct work_struct *work) > priv->response_length = ret; > mod_timer(&priv->user_read_timer, jiffies + (120 * HZ)); > } > +out: > mutex_unlock(&priv->buffer_mutex); > wake_up_interruptible(&priv->async_wait); > } > @@ -205,6 +212,7 @@ ssize_t tpm_common_write(struct file *file, const > char __user *buf, > priv->command_enqueued = true; > queue_work(tpm_dev_wq, &priv->async_work); > mutex_unlock(&priv->buffer_mutex); > + tpm_put_ops(priv->chip); > return size; > } > > > > -- > Tadeusz The fix looks appropriate but needs to be formalized as a patch. /Jarkko