lkml.org 
[lkml]   [2005]   [Jan]   [18]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    SubjectRe: [PATCH 1/1] tpm: fix cause of SMP stack traces -- updated version
    There were misplaced spinlock acquires and releases in the probe, close and release 
    paths which were causing might_sleep and schedule while atomic error messages accompanied
    by stack traces when the kernel was compiled with SMP support. Bug reported by Reben Jenster
    <ruben@hotheads.de>

    Thanks,
    Kylie

    Signed-off-by: Kylene Hall <kjhall@us.ibm.com>
    ---
    diff -uprN linux-2.6.10/drivers/char/tpm/tpm.c linux-2.6.10-tpm/drivers/char/tpm/tpm.c
    --- linux-2.6.10/drivers/char/tpm/tpm.c 2005-01-18 18:10:16.000000000 -0600
    +++ linux-2.6.10-tpm/drivers/char/tpm/tpm.c 2005-01-18 18:13:59.000000000 -0600
    @@ -422,21 +421,24 @@ EXPORT_SYMBOL_GPL(tpm_open);
    int tpm_release(struct inode *inode, struct file *file)
    {
    struct tpm_chip *chip = file->private_data;
    +
    + file->private_data = NULL;

    spin_lock(&driver_lock);
    chip->num_opens--;
    + spin_unlock(&driver_lock);
    +
    down(&chip->timer_manipulation_mutex);
    if (timer_pending(&chip->user_read_timer))
    del_singleshot_timer_sync(&chip->user_read_timer);
    else if (timer_pending(&chip->device_timer))
    del_singleshot_timer_sync(&chip->device_timer);
    up(&chip->timer_manipulation_mutex);
    +
    kfree(chip->data_buffer);
    atomic_set(&chip->data_pending, 0);

    pci_dev_put(chip->pci_dev);
    - file->private_data = NULL;
    - spin_unlock(&driver_lock);
    return 0;
    }

    @@ -534,6 +536,8 @@ void __devexit tpm_remove(struct pci_dev

    list_del(&chip->list);

    + spin_unlock(&driver_lock);
    +
    pci_set_drvdata(pci_dev, NULL);
    misc_deregister(&chip->vendor->miscdev);

    @@ -541,8 +545,6 @@ void __devexit tpm_remove(struct pci_dev
    device_remove_file(&pci_dev->dev, &dev_attr_pcrs);
    device_remove_file(&pci_dev->dev, &dev_attr_caps);

    - spin_unlock(&driver_lock);
    -
    pci_disable_device(pci_dev);

    dev_mask[chip->dev_num / 32] &= !(1 << (chip->dev_num % 32));
    @@ -583,6 +585,7 @@ EXPORT_SYMBOL_GPL(tpm_pm_suspend);
    int tpm_pm_resume(struct pci_dev *pci_dev)
    {
    struct tpm_chip *chip = pci_get_drvdata(pci_dev);
    +
    if (chip == NULL)
    return -ENODEV;

    @@ -650,15 +653,12 @@ dev_num_search_complete:
    chip->vendor->miscdev.dev = &(pci_dev->dev);
    chip->pci_dev = pci_dev_get(pci_dev);

    - spin_lock(&driver_lock);
    -
    if (misc_register(&chip->vendor->miscdev)) {
    dev_err(&chip->pci_dev->dev,
    "unable to misc_register %s, minor %d\n",
    chip->vendor->miscdev.name,
    chip->vendor->miscdev.minor);
    pci_dev_put(pci_dev);
    - spin_unlock(&driver_lock);
    kfree(chip);
    dev_mask[i] &= !(1 << j);
    return -ENODEV;
    @@ -672,7 +672,6 @@ dev_num_search_complete:
    device_create_file(&pci_dev->dev, &dev_attr_pcrs);
    device_create_file(&pci_dev->dev, &dev_attr_caps);

    - spin_unlock(&driver_lock);
    return 0;
    }

    -
    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/
    \
     
     \ /
      Last update: 2005-03-22 14:09    [W:0.032 / U:0.164 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site