diff options
author | Jason Gunthorpe <jgg@mellanox.com> | 2018-09-05 18:21:22 -0400 |
---|---|---|
committer | Jason Gunthorpe <jgg@mellanox.com> | 2018-09-05 18:21:22 -0400 |
commit | 2c910cb75e1fe6de52d95c8e32caedd1629a33a5 (patch) | |
tree | 94a0eea6f8cde689d11e7583ddd0a930b8785ab4 /arch/x86/mm/pageattr.c | |
parent | 627212c9d49ba2759b699450f5d8f45f73e062fa (diff) | |
parent | b53b1c08a23eb1091982daacb2122f90a7094a77 (diff) |
Merge branch 'uverbs_dev_cleanups' into rdma.git for-next
For dependencies, branch based on rdma.git 'for-rc' of
https://git.kernel.org/pub/scm/linux/kernel/git/rdma/rdma.git/
Pull 'uverbs_dev_cleanups' from Leon Romanovsky:
====================
Reuse the char device code interfaces to simplify ib_uverbs_device
creation and destruction. As part of this series, we are sending fix to
cleanup path, which was discovered during internal review,
The fix definitely can go to -rc, but it means that this series will be
dependent on rdma-rc.
====================
* branch 'uverbs_dev_cleanups':
RDMA/uverbs: Use device.groups to initialize device attributes
RDMA/uverbs: Use cdev_device_add() instead of cdev_add()
RDMA/core: Depend on device_add() to add device attributes
RDMA/uverbs: Fix error cleanup path of ib_uverbs_add_one()
Resolved conflict in ib_device_unregister_sysfs()
Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
Diffstat (limited to 'arch/x86/mm/pageattr.c')
-rw-r--r-- | arch/x86/mm/pageattr.c | 25 |
1 files changed, 24 insertions, 1 deletions
diff --git a/arch/x86/mm/pageattr.c b/arch/x86/mm/pageattr.c index 8d6c34fe49be..51a5a69ecac9 100644 --- a/arch/x86/mm/pageattr.c +++ b/arch/x86/mm/pageattr.c | |||
@@ -1420,6 +1420,29 @@ static int __change_page_attr_set_clr(struct cpa_data *cpa, int checkalias) | |||
1420 | return 0; | 1420 | return 0; |
1421 | } | 1421 | } |
1422 | 1422 | ||
1423 | /* | ||
1424 | * Machine check recovery code needs to change cache mode of poisoned | ||
1425 | * pages to UC to avoid speculative access logging another error. But | ||
1426 | * passing the address of the 1:1 mapping to set_memory_uc() is a fine | ||
1427 | * way to encourage a speculative access. So we cheat and flip the top | ||
1428 | * bit of the address. This works fine for the code that updates the | ||
1429 | * page tables. But at the end of the process we need to flush the cache | ||
1430 | * and the non-canonical address causes a #GP fault when used by the | ||
1431 | * CLFLUSH instruction. | ||
1432 | * | ||
1433 | * But in the common case we already have a canonical address. This code | ||
1434 | * will fix the top bit if needed and is a no-op otherwise. | ||
1435 | */ | ||
1436 | static inline unsigned long make_addr_canonical_again(unsigned long addr) | ||
1437 | { | ||
1438 | #ifdef CONFIG_X86_64 | ||
1439 | return (long)(addr << 1) >> 1; | ||
1440 | #else | ||
1441 | return addr; | ||
1442 | #endif | ||
1443 | } | ||
1444 | |||
1445 | |||
1423 | static int change_page_attr_set_clr(unsigned long *addr, int numpages, | 1446 | static int change_page_attr_set_clr(unsigned long *addr, int numpages, |
1424 | pgprot_t mask_set, pgprot_t mask_clr, | 1447 | pgprot_t mask_set, pgprot_t mask_clr, |
1425 | int force_split, int in_flag, | 1448 | int force_split, int in_flag, |
@@ -1465,7 +1488,7 @@ static int change_page_attr_set_clr(unsigned long *addr, int numpages, | |||
1465 | * Save address for cache flush. *addr is modified in the call | 1488 | * Save address for cache flush. *addr is modified in the call |
1466 | * to __change_page_attr_set_clr() below. | 1489 | * to __change_page_attr_set_clr() below. |
1467 | */ | 1490 | */ |
1468 | baddr = *addr; | 1491 | baddr = make_addr_canonical_again(*addr); |
1469 | } | 1492 | } |
1470 | 1493 | ||
1471 | /* Must avoid aliasing mappings in the highmem code */ | 1494 | /* Must avoid aliasing mappings in the highmem code */ |