[PATCH] tpm: locking fix
Use schedule_work() to avoid down()-in-timer-handler problem. Signed-off-by: Kylene Hall <kjhall@us.ibm.com> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
Родитель
f6a2382cec
Коммит
09e12f9f6b
|
@ -43,6 +43,13 @@ static void user_reader_timeout(unsigned long ptr)
|
|||
{
|
||||
struct tpm_chip *chip = (struct tpm_chip *) ptr;
|
||||
|
||||
schedule_work(&chip->work);
|
||||
}
|
||||
|
||||
static void timeout_work(void * ptr)
|
||||
{
|
||||
struct tpm_chip *chip = ptr;
|
||||
|
||||
down(&chip->buffer_mutex);
|
||||
atomic_set(&chip->data_pending, 0);
|
||||
memset(chip->data_buffer, 0, TPM_BUFSIZE);
|
||||
|
@ -527,6 +534,8 @@ int tpm_register_hardware(struct device *dev, struct tpm_vendor_specific *entry)
|
|||
init_MUTEX(&chip->tpm_mutex);
|
||||
INIT_LIST_HEAD(&chip->list);
|
||||
|
||||
INIT_WORK(&chip->work, timeout_work, chip);
|
||||
|
||||
init_timer(&chip->user_read_timer);
|
||||
chip->user_read_timer.function = user_reader_timeout;
|
||||
chip->user_read_timer.data = (unsigned long) chip;
|
||||
|
|
|
@ -77,6 +77,7 @@ struct tpm_chip {
|
|||
struct semaphore buffer_mutex;
|
||||
|
||||
struct timer_list user_read_timer; /* user needs to claim result */
|
||||
struct work_struct work;
|
||||
struct semaphore tpm_mutex; /* tpm is processing */
|
||||
|
||||
struct tpm_vendor_specific *vendor;
|
||||
|
|
Загрузка…
Ссылка в новой задаче