Messages in this thread | | | Date | Thu, 10 Mar 2005 09:35:36 -0800 | From | Nish Aravamudan <> | Subject | Re: [PATCH] Add TPM hardware enablement driver |
| |
On Wed, 9 Mar 2005 16:42:01 -0800, Greg KH <greg@kroah.com> wrote: > ChangeSet 1.2035, 2005/03/09 10:12:19-08:00, kjhall@us.ibm.com > > [PATCH] Add TPM hardware enablement driver
<snip>
> +void tpm_time_expired(unsigned long ptr) > +{ > + int *exp = (int *) ptr; > + *exp = 1; > +} > + > +EXPORT_SYMBOL_GPL(tpm_time_expired);
<snip>
> + down(&chip->timer_manipulation_mutex); > + chip->time_expired = 0; > + init_timer(&chip->device_timer); > + chip->device_timer.function = tpm_time_expired; > + chip->device_timer.expires = jiffies + 2 * 60 * HZ; > + chip->device_timer.data = (unsigned long) &chip->time_expired; > + add_timer(&chip->device_timer); > + up(&chip->timer_manipulation_mutex); > + > + do { > + u8 status = inb(chip->vendor->base + 1); > + if ((status & chip->vendor->req_complete_mask) == > + chip->vendor->req_complete_val) { > + down(&chip->timer_manipulation_mutex); > + del_singleshot_timer_sync(&chip->device_timer); > + up(&chip->timer_manipulation_mutex); > + goto out_recv; > + } > + set_current_state(TASK_UNINTERRUPTIBLE); > + schedule_timeout(TPM_TIMEOUT); > + rmb(); > + } while (!chip->time_expired);
<snip>
It seems like this use of schedule_timeout() and the others are a bit excessive. In this case, a timer is set to go off in 2 hours or so, with tpm_time_expired() as the callback. tpm_time_expired(), it seems just takes data and sets it to 1, which in this case is chip->time_expired (and is similar in the other cases). We then loop while (!chip->time_expired), which to me means until chip->device_timer goes off, checking if the request is complete every 5 milliseconds. The chip->device_timer doesn't really do anything, does it? It just guarantees a maximum time (of 2 hours). Couldn't the same be achieved with (please excuse the lack of tabs, any real patches I submit will have them):
unsigned long stop = jiffies + 2 * 60 * HZ; do { u8 status = inb(chip->vendor->base + 1); if ((status & chip->vendor->req_complete_mask == chip->vendor->req_complete_val) goto out_recv; msleep(TPM_TIMEOUT); // TPM_TIMEOUT could now be 5 ms rmb(); } while (time_before(jiffies, stop);
I think similar replacements would work in the other locations.
If people agree, I will send patches.
Thanks, Nish - 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/
| |