aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86/mm
diff options
context:
space:
mode:
authorJuergen Gross <jgross@suse.com>2014-11-03 08:01:57 -0500
committerThomas Gleixner <tglx@linutronix.de>2014-11-16 05:04:25 -0500
commitc06814d8419a74528500f85faf5fc01f67f8e7e6 (patch)
tree04d1a57732fba19043c81ce92375d0f0bc8b9f63 /arch/x86/mm
parent102e19e1955d85f31475416b1ee22980c6462cf8 (diff)
x86: Use new cache mode type in setting page attributes
Instead of directly using the cache mode bits in the pte switch to using the cache mode type in the functions for modifying page attributes. Based-on-patch-by: Stefan Bader <stefan.bader@canonical.com> Signed-off-by: Juergen Gross <jgross@suse.com> Reviewed-by: Thomas Gleixner <tglx@linutronix.de> Cc: stefan.bader@canonical.com Cc: xen-devel@lists.xensource.com Cc: konrad.wilk@oracle.com Cc: ville.syrjala@linux.intel.com Cc: david.vrabel@citrix.com Cc: jbeulich@suse.com Cc: toshi.kani@hp.com Cc: plagnioj@jcrosoft.com Cc: tomi.valkeinen@ti.com Cc: bhelgaas@google.com Link: http://lkml.kernel.org/r/1415019724-4317-12-git-send-email-jgross@suse.com Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Diffstat (limited to 'arch/x86/mm')
-rw-r--r--arch/x86/mm/pageattr.c52
1 files changed, 28 insertions, 24 deletions
diff --git a/arch/x86/mm/pageattr.c b/arch/x86/mm/pageattr.c
index 87c0d361c6d4..9f7e1b445e66 100644
--- a/arch/x86/mm/pageattr.c
+++ b/arch/x86/mm/pageattr.c
@@ -1304,12 +1304,6 @@ static int __change_page_attr_set_clr(struct cpa_data *cpa, int checkalias)
1304 return 0; 1304 return 0;
1305} 1305}
1306 1306
1307static inline int cache_attr(pgprot_t attr)
1308{
1309 return pgprot_val(attr) &
1310 (_PAGE_PAT | _PAGE_PWT | _PAGE_PCD);
1311}
1312
1313static int change_page_attr_set_clr(unsigned long *addr, int numpages, 1307static int change_page_attr_set_clr(unsigned long *addr, int numpages,
1314 pgprot_t mask_set, pgprot_t mask_clr, 1308 pgprot_t mask_set, pgprot_t mask_clr,
1315 int force_split, int in_flag, 1309 int force_split, int in_flag,
@@ -1390,7 +1384,7 @@ static int change_page_attr_set_clr(unsigned long *addr, int numpages,
1390 * No need to flush, when we did not set any of the caching 1384 * No need to flush, when we did not set any of the caching
1391 * attributes: 1385 * attributes:
1392 */ 1386 */
1393 cache = cache_attr(mask_set); 1387 cache = !!pgprot2cachemode(mask_set);
1394 1388
1395 /* 1389 /*
1396 * On success we use CLFLUSH, when the CPU supports it to 1390 * On success we use CLFLUSH, when the CPU supports it to
@@ -1445,7 +1439,8 @@ int _set_memory_uc(unsigned long addr, int numpages)
1445 * for now UC MINUS. see comments in ioremap_nocache() 1439 * for now UC MINUS. see comments in ioremap_nocache()
1446 */ 1440 */
1447 return change_page_attr_set(&addr, numpages, 1441 return change_page_attr_set(&addr, numpages,
1448 __pgprot(_PAGE_CACHE_UC_MINUS), 0); 1442 cachemode2pgprot(_PAGE_CACHE_MODE_UC_MINUS),
1443 0);
1449} 1444}
1450 1445
1451int set_memory_uc(unsigned long addr, int numpages) 1446int set_memory_uc(unsigned long addr, int numpages)
@@ -1474,7 +1469,7 @@ out_err:
1474EXPORT_SYMBOL(set_memory_uc); 1469EXPORT_SYMBOL(set_memory_uc);
1475 1470
1476static int _set_memory_array(unsigned long *addr, int addrinarray, 1471static int _set_memory_array(unsigned long *addr, int addrinarray,
1477 unsigned long new_type) 1472 enum page_cache_mode new_type)
1478{ 1473{
1479 int i, j; 1474 int i, j;
1480 int ret; 1475 int ret;
@@ -1484,17 +1479,19 @@ static int _set_memory_array(unsigned long *addr, int addrinarray,
1484 */ 1479 */
1485 for (i = 0; i < addrinarray; i++) { 1480 for (i = 0; i < addrinarray; i++) {
1486 ret = reserve_memtype(__pa(addr[i]), __pa(addr[i]) + PAGE_SIZE, 1481 ret = reserve_memtype(__pa(addr[i]), __pa(addr[i]) + PAGE_SIZE,
1487 new_type, NULL); 1482 cachemode2protval(new_type), NULL);
1488 if (ret) 1483 if (ret)
1489 goto out_free; 1484 goto out_free;
1490 } 1485 }
1491 1486
1492 ret = change_page_attr_set(addr, addrinarray, 1487 ret = change_page_attr_set(addr, addrinarray,
1493 __pgprot(_PAGE_CACHE_UC_MINUS), 1); 1488 cachemode2pgprot(_PAGE_CACHE_MODE_UC_MINUS),
1489 1);
1494 1490
1495 if (!ret && new_type == _PAGE_CACHE_WC) 1491 if (!ret && new_type == _PAGE_CACHE_MODE_WC)
1496 ret = change_page_attr_set_clr(addr, addrinarray, 1492 ret = change_page_attr_set_clr(addr, addrinarray,
1497 __pgprot(_PAGE_CACHE_WC), 1493 cachemode2pgprot(
1494 _PAGE_CACHE_MODE_WC),
1498 __pgprot(_PAGE_CACHE_MASK), 1495 __pgprot(_PAGE_CACHE_MASK),
1499 0, CPA_ARRAY, NULL); 1496 0, CPA_ARRAY, NULL);
1500 if (ret) 1497 if (ret)
@@ -1511,13 +1508,13 @@ out_free:
1511 1508
1512int set_memory_array_uc(unsigned long *addr, int addrinarray) 1509int set_memory_array_uc(unsigned long *addr, int addrinarray)
1513{ 1510{
1514 return _set_memory_array(addr, addrinarray, _PAGE_CACHE_UC_MINUS); 1511 return _set_memory_array(addr, addrinarray, _PAGE_CACHE_MODE_UC_MINUS);
1515} 1512}
1516EXPORT_SYMBOL(set_memory_array_uc); 1513EXPORT_SYMBOL(set_memory_array_uc);
1517 1514
1518int set_memory_array_wc(unsigned long *addr, int addrinarray) 1515int set_memory_array_wc(unsigned long *addr, int addrinarray)
1519{ 1516{
1520 return _set_memory_array(addr, addrinarray, _PAGE_CACHE_WC); 1517 return _set_memory_array(addr, addrinarray, _PAGE_CACHE_MODE_WC);
1521} 1518}
1522EXPORT_SYMBOL(set_memory_array_wc); 1519EXPORT_SYMBOL(set_memory_array_wc);
1523 1520
@@ -1527,10 +1524,12 @@ int _set_memory_wc(unsigned long addr, int numpages)
1527 unsigned long addr_copy = addr; 1524 unsigned long addr_copy = addr;
1528 1525
1529 ret = change_page_attr_set(&addr, numpages, 1526 ret = change_page_attr_set(&addr, numpages,
1530 __pgprot(_PAGE_CACHE_UC_MINUS), 0); 1527 cachemode2pgprot(_PAGE_CACHE_MODE_UC_MINUS),
1528 0);
1531 if (!ret) { 1529 if (!ret) {
1532 ret = change_page_attr_set_clr(&addr_copy, numpages, 1530 ret = change_page_attr_set_clr(&addr_copy, numpages,
1533 __pgprot(_PAGE_CACHE_WC), 1531 cachemode2pgprot(
1532 _PAGE_CACHE_MODE_WC),
1534 __pgprot(_PAGE_CACHE_MASK), 1533 __pgprot(_PAGE_CACHE_MASK),
1535 0, 0, NULL); 1534 0, 0, NULL);
1536 } 1535 }
@@ -1564,6 +1563,7 @@ EXPORT_SYMBOL(set_memory_wc);
1564 1563
1565int _set_memory_wb(unsigned long addr, int numpages) 1564int _set_memory_wb(unsigned long addr, int numpages)
1566{ 1565{
1566 /* WB cache mode is hard wired to all cache attribute bits being 0 */
1567 return change_page_attr_clear(&addr, numpages, 1567 return change_page_attr_clear(&addr, numpages,
1568 __pgprot(_PAGE_CACHE_MASK), 0); 1568 __pgprot(_PAGE_CACHE_MASK), 0);
1569} 1569}
@@ -1586,6 +1586,7 @@ int set_memory_array_wb(unsigned long *addr, int addrinarray)
1586 int i; 1586 int i;
1587 int ret; 1587 int ret;
1588 1588
1589 /* WB cache mode is hard wired to all cache attribute bits being 0 */
1589 ret = change_page_attr_clear(addr, addrinarray, 1590 ret = change_page_attr_clear(addr, addrinarray,
1590 __pgprot(_PAGE_CACHE_MASK), 1); 1591 __pgprot(_PAGE_CACHE_MASK), 1);
1591 if (ret) 1592 if (ret)
@@ -1648,7 +1649,7 @@ int set_pages_uc(struct page *page, int numpages)
1648EXPORT_SYMBOL(set_pages_uc); 1649EXPORT_SYMBOL(set_pages_uc);
1649 1650
1650static int _set_pages_array(struct page **pages, int addrinarray, 1651static int _set_pages_array(struct page **pages, int addrinarray,
1651 unsigned long new_type) 1652 enum page_cache_mode new_type)
1652{ 1653{
1653 unsigned long start; 1654 unsigned long start;
1654 unsigned long end; 1655 unsigned long end;
@@ -1661,15 +1662,17 @@ static int _set_pages_array(struct page **pages, int addrinarray,
1661 continue; 1662 continue;
1662 start = page_to_pfn(pages[i]) << PAGE_SHIFT; 1663 start = page_to_pfn(pages[i]) << PAGE_SHIFT;
1663 end = start + PAGE_SIZE; 1664 end = start + PAGE_SIZE;
1664 if (reserve_memtype(start, end, new_type, NULL)) 1665 if (reserve_memtype(start, end, cachemode2protval(new_type),
1666 NULL))
1665 goto err_out; 1667 goto err_out;
1666 } 1668 }
1667 1669
1668 ret = cpa_set_pages_array(pages, addrinarray, 1670 ret = cpa_set_pages_array(pages, addrinarray,
1669 __pgprot(_PAGE_CACHE_UC_MINUS)); 1671 cachemode2pgprot(_PAGE_CACHE_MODE_UC_MINUS));
1670 if (!ret && new_type == _PAGE_CACHE_WC) 1672 if (!ret && new_type == _PAGE_CACHE_MODE_WC)
1671 ret = change_page_attr_set_clr(NULL, addrinarray, 1673 ret = change_page_attr_set_clr(NULL, addrinarray,
1672 __pgprot(_PAGE_CACHE_WC), 1674 cachemode2pgprot(
1675 _PAGE_CACHE_MODE_WC),
1673 __pgprot(_PAGE_CACHE_MASK), 1676 __pgprot(_PAGE_CACHE_MASK),
1674 0, CPA_PAGES_ARRAY, pages); 1677 0, CPA_PAGES_ARRAY, pages);
1675 if (ret) 1678 if (ret)
@@ -1689,13 +1692,13 @@ err_out:
1689 1692
1690int set_pages_array_uc(struct page **pages, int addrinarray) 1693int set_pages_array_uc(struct page **pages, int addrinarray)
1691{ 1694{
1692 return _set_pages_array(pages, addrinarray, _PAGE_CACHE_UC_MINUS); 1695 return _set_pages_array(pages, addrinarray, _PAGE_CACHE_MODE_UC_MINUS);
1693} 1696}
1694EXPORT_SYMBOL(set_pages_array_uc); 1697EXPORT_SYMBOL(set_pages_array_uc);
1695 1698
1696int set_pages_array_wc(struct page **pages, int addrinarray) 1699int set_pages_array_wc(struct page **pages, int addrinarray)
1697{ 1700{
1698 return _set_pages_array(pages, addrinarray, _PAGE_CACHE_WC); 1701 return _set_pages_array(pages, addrinarray, _PAGE_CACHE_MODE_WC);
1699} 1702}
1700EXPORT_SYMBOL(set_pages_array_wc); 1703EXPORT_SYMBOL(set_pages_array_wc);
1701 1704
@@ -1714,6 +1717,7 @@ int set_pages_array_wb(struct page **pages, int addrinarray)
1714 unsigned long end; 1717 unsigned long end;
1715 int i; 1718 int i;
1716 1719
1720 /* WB cache mode is hard wired to all cache attribute bits being 0 */
1717 retval = cpa_clear_pages_array(pages, addrinarray, 1721 retval = cpa_clear_pages_array(pages, addrinarray,
1718 __pgprot(_PAGE_CACHE_MASK)); 1722 __pgprot(_PAGE_CACHE_MASK));
1719 if (retval) 1723 if (retval)