| From 938540c6698d76629b8c51e53e6acb8e7463bd6c Mon Sep 17 00:00:00 2001 |
| From: Huang Rui <ray.huang@amd.com> |
| Date: Mon, 12 Dec 2016 07:28:26 -0500 |
| Subject: [PATCH] iommu/amd: Fix the left value check of cmd buffer |
| |
| commit 432abf68a79332282329286d190e21fe3ac02a31 upstream. |
| |
| The generic command buffer entry is 128 bits (16 bytes), so the offset |
| of tail and head pointer should be 16 bytes aligned and increased with |
| 0x10 per command. |
| |
| When cmd buf is full, head = (tail + 0x10) % CMD_BUFFER_SIZE. |
| |
| So when left space of cmd buf should be able to store only two |
| command, we should be issued one COMPLETE_WAIT additionally to wait |
| all older commands completed. Then the left space should be increased |
| after IOMMU fetching from cmd buf. |
| |
| So left check value should be left <= 0x20 (two commands). |
| |
| Signed-off-by: Huang Rui <ray.huang@amd.com> |
| Fixes: ac0ea6e92b222 ('x86/amd-iommu: Improve handling of full command buffer') |
| Signed-off-by: Joerg Roedel <jroedel@suse.de> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/drivers/iommu/amd_iommu.c b/drivers/iommu/amd_iommu.c |
| index 822fc4afad3c..7ffefe090aa5 100644 |
| --- a/drivers/iommu/amd_iommu.c |
| +++ b/drivers/iommu/amd_iommu.c |
| @@ -955,7 +955,7 @@ again: |
| next_tail = (tail + sizeof(*cmd)) % CMD_BUFFER_SIZE; |
| left = (head - next_tail) % CMD_BUFFER_SIZE; |
| |
| - if (left <= 2) { |
| + if (left <= 0x20) { |
| struct iommu_cmd sync_cmd; |
| volatile u64 sem = 0; |
| int ret; |
| -- |
| 2.10.1 |
| |