<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class=""><div><br class=""><blockquote type="cite" class=""><div class="">On Feb 3, 2020, at 11:16 AM, Christian König <<a href="mailto:christian.koenig@amd.com" class="">christian.koenig@amd.com</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><span style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none; float: none; display: inline !important;" class="">Am 03.02.20 um 17:18 schrieb Tianlin Li:</span><br style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;" class=""><blockquote type="cite" style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; text-decoration: none;" class="">Right now several architectures allow their set_memory_*() family of<br class="">functions to fail,<br class=""></blockquote><br style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;" class=""><span style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none; float: none; display: inline !important;" class="">Oh, that is a detail I previously didn't recognized. Which architectures are that?</span><br style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;" class=""><br style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;" class=""><span style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none; float: none; display: inline !important;" class="">Cause the RS400/480, RS690 and RS740 which are affected by this are integrated in the south-bridge.</span><br style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;" class=""></div></blockquote><br class=""></div><div>At least x86 is. </div><div>Some details: <a href="https://lore.kernel.org/netdev/20180628213459.28631-4-daniel@iogearbox.net/" class="">https://lore.kernel.org/netdev/20180628213459.28631-4-daniel@iogearbox.net/</a></div><div><br class=""><blockquote type="cite" class=""><div class=""><blockquote type="cite" style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; text-decoration: none;" class=""> but callers may not be checking the return values.<br class="">If set_memory_*() returns with an error, call-site assumptions may be<br class="">infact wrong to assume that it would either succeed or not succeed at<br class="">all. Ideally, the failure of set_memory_*() should be passed up the<br class="">call stack, and callers should examine the failure and deal with it.<br class=""><br class="">Need to fix the callers and add the __must_check attribute. They also<br class="">may not provide any level of atomicity, in the sense that the memory<br class="">protections may be left incomplete on failure. This issue likely has a<br class="">few steps on effects architectures:<br class="">1)Have all callers of set_memory_*() helpers check the return value.<br class="">2)Add __must_check to all set_memory_*() helpers so that new uses do<br class="">not ignore the return value.<br class="">3)Add atomicity to the calls so that the memory protections aren't left<br class="">in a partial state.<br class=""><br class="">This series is part of step 1. Make drm/radeon check the return value of<br class="">set_memory_*().<br class=""><br class="">Signed-off-by: Tianlin Li <<a href="mailto:tli@digitalocean.com" class="">tli@digitalocean.com</a>><br class=""></blockquote><br style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;" class=""><span style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none; float: none; display: inline !important;" class="">Reviewed-by: Christian König <</span><a href="mailto:christian.koenig@amd.com" style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;" class="">christian.koenig@amd.com</a><span style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none; float: none; display: inline !important;" class="">></span><br style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;" class=""><br style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;" class=""><blockquote type="cite" style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; text-decoration: none;" class="">---<br class="">v2:<br class="">The hardware is too old to be tested on and the code cannot be simply<br class="">removed from the kernel, so this is the solution for the short term.<br class="">- Just print an error when something goes wrong<br class="">- Remove patch 2.<br class="">v1:<br class=""><a href="https://nam11.safelinks.protection.outlook.com/?url=https%3A%2F%2Flore.kernel.org%2Flkml%2F20200107192555.20606-1-tli%40digitalocean.com%2F&data=02%7C01%7Cchristian.koenig%40amd.com%7Cba2176d2ca834214e6b108d7a8c4bb1d%7C3dd8961fe4884e608e11a82d994e183d%7C0%7C0%7C637163435227030235&sdata=mDhUEi3vmxahjsdrZOr83OEIWNBHefO8lkXST%2FW32CE%3D&reserved=0" class="">https://nam11.safelinks.protection.outlook.com/?url=https%3A%2F%2Flore.kernel.org%2Flkml%2F20200107192555.20606-1-tli%40digitalocean.com%2F&data=02%7C01%7Cchristian.koenig%40amd.com%7Cba2176d2ca834214e6b108d7a8c4bb1d%7C3dd8961fe4884e608e11a82d994e183d%7C0%7C0%7C637163435227030235&sdata=mDhUEi3vmxahjsdrZOr83OEIWNBHefO8lkXST%2FW32CE%3D&reserved=0</a><br class="">---<br class=""> drivers/gpu/drm/radeon/radeon_gart.c | 10 ++++++----<br class=""> 1 file changed, 6 insertions(+), 4 deletions(-)<br class=""><br class="">diff --git a/drivers/gpu/drm/radeon/radeon_gart.c b/drivers/gpu/drm/radeon/radeon_gart.c<br class="">index f178ba321715..a2cc864aa08d 100644<br class="">--- a/drivers/gpu/drm/radeon/radeon_gart.c<br class="">+++ b/drivers/gpu/drm/radeon/radeon_gart.c<br class="">@@ -80,8 +80,9 @@ int radeon_gart_table_ram_alloc(struct radeon_device *rdev)<br class=""> #ifdef CONFIG_X86<br class=""> <span class="Apple-tab-span" style="white-space: pre;"> </span>if (rdev->family == CHIP_RS400 || rdev->family == CHIP_RS480 ||<br class=""> <span class="Apple-tab-span" style="white-space: pre;"> </span><span class="Apple-converted-space"> </span> rdev->family == CHIP_RS690 || rdev->family == CHIP_RS740) {<br class="">-<span class="Apple-tab-span" style="white-space: pre;"> </span><span class="Apple-tab-span" style="white-space: pre;"> </span>set_memory_uc((unsigned long)ptr,<br class="">-<span class="Apple-tab-span" style="white-space: pre;"> </span><span class="Apple-tab-span" style="white-space: pre;"> </span><span class="Apple-tab-span" style="white-space: pre;"> </span><span class="Apple-converted-space"> </span> rdev->gart.table_size >> PAGE_SHIFT);<br class="">+<span class="Apple-tab-span" style="white-space: pre;"> </span><span class="Apple-tab-span" style="white-space: pre;"> </span>if (set_memory_uc((unsigned long)ptr,<br class="">+<span class="Apple-tab-span" style="white-space: pre;"> </span><span class="Apple-tab-span" style="white-space: pre;"> </span><span class="Apple-tab-span" style="white-space: pre;"> </span><span class="Apple-converted-space"> </span> rdev->gart.table_size >> PAGE_SHIFT))<br class="">+<span class="Apple-tab-span" style="white-space: pre;"> </span><span class="Apple-tab-span" style="white-space: pre;"> </span><span class="Apple-tab-span" style="white-space: pre;"> </span>DRM_ERROR("set_memory_uc failed.\n");<br class=""> <span class="Apple-tab-span" style="white-space: pre;"> </span>}<br class=""> #endif<br class=""> <span class="Apple-tab-span" style="white-space: pre;"> </span>rdev->gart.ptr = ptr;<br class="">@@ -106,8 +107,9 @@ void radeon_gart_table_ram_free(struct radeon_device *rdev)<br class=""> #ifdef CONFIG_X86<br class=""> <span class="Apple-tab-span" style="white-space: pre;"> </span>if (rdev->family == CHIP_RS400 || rdev->family == CHIP_RS480 ||<br class=""> <span class="Apple-tab-span" style="white-space: pre;"> </span><span class="Apple-converted-space"> </span> rdev->family == CHIP_RS690 || rdev->family == CHIP_RS740) {<br class="">-<span class="Apple-tab-span" style="white-space: pre;"> </span><span class="Apple-tab-span" style="white-space: pre;"> </span>set_memory_wb((unsigned long)rdev->gart.ptr,<br class="">-<span class="Apple-tab-span" style="white-space: pre;"> </span><span class="Apple-tab-span" style="white-space: pre;"> </span><span class="Apple-tab-span" style="white-space: pre;"> </span><span class="Apple-converted-space"> </span> rdev->gart.table_size >> PAGE_SHIFT);<br class="">+<span class="Apple-tab-span" style="white-space: pre;"> </span><span class="Apple-tab-span" style="white-space: pre;"> </span>if (set_memory_wb((unsigned long)rdev->gart.ptr,<br class="">+<span class="Apple-tab-span" style="white-space: pre;"> </span><span class="Apple-tab-span" style="white-space: pre;"> </span><span class="Apple-tab-span" style="white-space: pre;"> </span><span class="Apple-converted-space"> </span> rdev->gart.table_size >> PAGE_SHIFT))<br class="">+<span class="Apple-tab-span" style="white-space: pre;"> </span><span class="Apple-tab-span" style="white-space: pre;"> </span><span class="Apple-tab-span" style="white-space: pre;"> </span>DRM_ERROR("set_memory_wb failed.\n");<br class=""> <span class="Apple-tab-span" style="white-space: pre;"> </span>}<br class=""> #endif<br class=""> <span class="Apple-tab-span" style="white-space: pre;"> </span>pci_free_consistent(rdev->pdev, rdev->gart.table_size,</blockquote></div></blockquote></div><br class=""></body></html>