Messages in this thread | | | Date | Fri, 20 Apr 2007 18:11:10 -0400 | From | "David Kyle" <> | Subject | Sleep during spinlock in TPM driver |
| |
I've been working with the TPM driver, and I found that if I opened, used, then closed the TPM char device very frequently, I would get a kernel BUG message saying that the kernel tried to sleep while holding a spinlock. I think I've isolated the problem to this function, in drivers/char/tpm/tpm.c:
int tpm_release(struct inode *inode, struct file *file) { struct tpm_chip *chip = file->private_data; spin_lock(&driver_lock); file->private_data = NULL; chip->num_opens--; del_singleshot_timer_sync(&chip->user_read_timer); flush_scheduled_work(); atomic_set(&chip->data_pending, 0); put_device(chip->dev); kfree(chip->data_buffer); spin_unlock(&driver_lock); return 0; } EXPORT_SYMBOL_GPL(tpm_release);
I believe that flush_scheduled_work can sleep, correct? Does anyone know why this function is called while the spinlock is held?
-David - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
| |