lkml.org 
[lkml]   [2011]   [Sep]   [28]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[091/244] iommu/amd: Make sure iommu->need_sync contains correct value
    3.0-stable review patch.  If anyone has any objections, please let us know.

    ------------------

    From: Joerg Roedel <joerg.roedel@amd.com>

    commit f1ca1512e765337a7c09eb875eedef8ea4e07654 upstream.

    The value is only set to true but never set back to false,
    which causes to many completion-wait commands to be sent to
    hardware. Fix it with this patch.

    Signed-off-by: Joerg Roedel <joerg.roedel@amd.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>

    ---
    arch/x86/kernel/amd_iommu.c | 13 ++++++++++---
    1 file changed, 10 insertions(+), 3 deletions(-)

    --- a/arch/x86/kernel/amd_iommu.c
    +++ b/arch/x86/kernel/amd_iommu.c
    @@ -531,7 +531,9 @@ static void build_inv_all(struct iommu_c
    * Writes the command to the IOMMUs command buffer and informs the
    * hardware about the new command.
    */
    -static int iommu_queue_command(struct amd_iommu *iommu, struct iommu_cmd *cmd)
    +static int iommu_queue_command_sync(struct amd_iommu *iommu,
    + struct iommu_cmd *cmd,
    + bool sync)
    {
    u32 left, tail, head, next_tail;
    unsigned long flags;
    @@ -565,13 +567,18 @@ again:
    copy_cmd_to_buffer(iommu, cmd, tail);

    /* We need to sync now to make sure all commands are processed */
    - iommu->need_sync = true;
    + iommu->need_sync = sync;

    spin_unlock_irqrestore(&iommu->lock, flags);

    return 0;
    }

    +static int iommu_queue_command(struct amd_iommu *iommu, struct iommu_cmd *cmd)
    +{
    + return iommu_queue_command_sync(iommu, cmd, true);
    +}
    +
    /*
    * This function queues a completion wait command into the command
    * buffer of an IOMMU
    @@ -587,7 +594,7 @@ static int iommu_completion_wait(struct

    build_completion_wait(&cmd, (u64)&sem);

    - ret = iommu_queue_command(iommu, &cmd);
    + ret = iommu_queue_command_sync(iommu, &cmd, false);
    if (ret)
    return ret;




    \
     
     \ /
      Last update: 2011-09-29 00:47    [W:4.037 / U:0.116 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site