mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 02:01:24 +01:00
x86/gnttab: do not implement GNTTABOP_cache_flush
The current underlying implementation of GNTTABOP_cache_flush on x86 won't
work as expected. The provided {clean,invalidate}_dcache_va_range()
helpers only do a local pCPU cache flush, so the cache of previous pCPUs
where the vCPU might have run are not flushed.
However instead of attempting to fix this, make the GNTTABOP_cache_flush
operation only available to ARM. There are no known users on x86, the
implementation is broken, and other architectures don't have grant-table
support yet.
With that operation not implemented on x86, the related
{clean,invalidate}_dcache_va_range() helpers can also be removed.
Fixes: f62dc81c2d ("x86: introduce more cache maintenance operations")
Fixes: 18e8d22fe7 ("introduce GNTTABOP_cache_flush")
Signed-off-by: Roger Pau Monné <roger.pau@citrix.com>
Reviewed-by: Jan Beulich <jbeulich@suse.com>
Reviewed-By: Oleksii Kurochko<oleksii.kurochko@gmail.com>
Acked-by: Julien Grall <jgrall@amazon.com>
This commit is contained in:
1 parent
4acab25a93
commit
5642a6055c
5 files changed
+13
-19
No files matched your search
@@ -28,6 +28,9 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)
|
||||
- Ability to enable stack protector
|
||||
|
||||
### Removed
|
||||
- On x86:
|
||||
- GNTTABOP_cache_flush: it's unused on x86 and the implementation is
|
||||
broken.
|
||||
|
||||
## [4.20.0](https://xenbits.xenproject.org/gitweb/?p=xen.git;a=shortlog;h=RELEASE-4.20.0) - 2025-03-05
|
||||
|
||||
|
||||
@@ -17,6 +17,7 @@ config ARM
|
||||
select HAS_ALTERNATIVE if HAS_VMAP
|
||||
select HAS_DEVICE_TREE
|
||||
select HAS_DOM0LESS
|
||||
select HAS_GRANT_CACHE_FLUSH if GRANT_TABLE
|
||||
select HAS_STACK_PROTECTOR
|
||||
select HAS_UBSAN
|
||||
|
||||
|
||||
@@ -184,25 +184,6 @@ void flush_area_mask(const cpumask_t *mask, const void *va,
|
||||
}
|
||||
|
||||
static inline void flush_page_to_ram(unsigned long mfn, bool sync_icache) {}
|
||||
static inline int invalidate_dcache_va_range(const void *p,
|
||||
unsigned long size)
|
||||
{ return -EOPNOTSUPP; }
|
||||
static inline int clean_and_invalidate_dcache_va_range(const void *p,
|
||||
unsigned long size)
|
||||
{
|
||||
unsigned int order = get_order_from_bytes(size);
|
||||
/* sub-page granularity support needs to be added if necessary */
|
||||
flush_area_local(p, FLUSH_CACHE|FLUSH_ORDER(order));
|
||||
return 0;
|
||||
}
|
||||
static inline int clean_dcache_va_range(const void *p, unsigned long size)
|
||||
{
|
||||
unsigned int order = get_order_from_bytes(size);
|
||||
|
||||
/* sub-page granularity support needs to be added if necessary */
|
||||
flush_area_local(p, FLUSH_CACHE_WRITEBACK | FLUSH_ORDER(order));
|
||||
return 0;
|
||||
}
|
||||
|
||||
unsigned int guest_flush_tlb_flags(const struct domain *d);
|
||||
void guest_flush_tlb_mask(const struct domain *d, const cpumask_t *mask);
|
||||
|
||||
@@ -35,6 +35,9 @@ config GRANT_TABLE
|
||||
|
||||
If unsure, say Y.
|
||||
|
||||
config HAS_GRANT_CACHE_FLUSH
|
||||
bool
|
||||
|
||||
config EVTCHN_FIFO
|
||||
bool "Event Channel Fifo support" if EXPERT
|
||||
default y
|
||||
|
||||
@@ -940,6 +940,7 @@ static void reduce_status_for_pin(struct domain *rd,
|
||||
gnttab_clear_flags(rd, clear_flags, status);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_HAS_GRANT_CACHE_FLUSH
|
||||
static struct active_grant_entry *grant_map_exists(const struct domain *ld,
|
||||
struct grant_table *rgt,
|
||||
mfn_t mfn,
|
||||
@@ -975,6 +976,7 @@ static struct active_grant_entry *grant_map_exists(const struct domain *ld,
|
||||
|
||||
return ERR_PTR(-EINVAL);
|
||||
}
|
||||
#endif /* CONFIG_HAS_GRANT_CACHE_FLUSH */
|
||||
|
||||
union maptrack_node {
|
||||
struct {
|
||||
@@ -3520,6 +3522,7 @@ gnttab_swap_grant_ref(XEN_GUEST_HANDLE_PARAM(gnttab_swap_grant_ref_t) uop,
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_HAS_GRANT_CACHE_FLUSH
|
||||
static int _cache_flush(const gnttab_cache_flush_t *cflush, grant_ref_t *cur_ref)
|
||||
{
|
||||
struct domain *d, *owner;
|
||||
@@ -3631,6 +3634,7 @@ gnttab_cache_flush(XEN_GUEST_HANDLE_PARAM(gnttab_cache_flush_t) uop,
|
||||
|
||||
return 0;
|
||||
}
|
||||
#endif /* CONFIG_HAS_GRANT_CACHE_FLUSH */
|
||||
|
||||
long do_grant_table_op(
|
||||
unsigned int cmd, XEN_GUEST_HANDLE_PARAM(void) uop, unsigned int count)
|
||||
@@ -3773,6 +3777,7 @@ long do_grant_table_op(
|
||||
break;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_HAS_GRANT_CACHE_FLUSH
|
||||
case GNTTABOP_cache_flush:
|
||||
{
|
||||
XEN_GUEST_HANDLE_PARAM(gnttab_cache_flush_t) cflush =
|
||||
@@ -3789,6 +3794,7 @@ long do_grant_table_op(
|
||||
}
|
||||
break;
|
||||
}
|
||||
#endif /* CONFIG_HAS_GRANT_CACHE_FLUSH */
|
||||
|
||||
default:
|
||||
rc = -ENOSYS;
|
||||
|
||||