Commit 09e12f9f authored by Kylene Jo Hall's avatar Kylene Jo Hall Committed by Linus Torvalds

[PATCH] tpm: locking fix

Use schedule_work() to avoid down()-in-timer-handler problem.
Signed-off-by: default avatarKylene Hall <kjhall@us.ibm.com>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent f6a2382c
...@@ -43,6 +43,13 @@ static void user_reader_timeout(unsigned long ptr) ...@@ -43,6 +43,13 @@ static void user_reader_timeout(unsigned long ptr)
{ {
struct tpm_chip *chip = (struct tpm_chip *) 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); down(&chip->buffer_mutex);
atomic_set(&chip->data_pending, 0); atomic_set(&chip->data_pending, 0);
memset(chip->data_buffer, 0, TPM_BUFSIZE); memset(chip->data_buffer, 0, TPM_BUFSIZE);
...@@ -527,6 +534,8 @@ int tpm_register_hardware(struct device *dev, struct tpm_vendor_specific *entry) ...@@ -527,6 +534,8 @@ int tpm_register_hardware(struct device *dev, struct tpm_vendor_specific *entry)
init_MUTEX(&chip->tpm_mutex); init_MUTEX(&chip->tpm_mutex);
INIT_LIST_HEAD(&chip->list); INIT_LIST_HEAD(&chip->list);
INIT_WORK(&chip->work, timeout_work, chip);
init_timer(&chip->user_read_timer); init_timer(&chip->user_read_timer);
chip->user_read_timer.function = user_reader_timeout; chip->user_read_timer.function = user_reader_timeout;
chip->user_read_timer.data = (unsigned long) chip; chip->user_read_timer.data = (unsigned long) chip;
......
...@@ -77,6 +77,7 @@ struct tpm_chip { ...@@ -77,6 +77,7 @@ struct tpm_chip {
struct semaphore buffer_mutex; struct semaphore buffer_mutex;
struct timer_list user_read_timer; /* user needs to claim result */ struct timer_list user_read_timer; /* user needs to claim result */
struct work_struct work;
struct semaphore tpm_mutex; /* tpm is processing */ struct semaphore tpm_mutex; /* tpm is processing */
struct tpm_vendor_specific *vendor; struct tpm_vendor_specific *vendor;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment