Message ID | 20221006071500.15689-4-jgross@suse.com (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | xen/virtio: support grant based virtio on x86 | expand |
On 06.10.22 10:15, Juergen Gross wrote: Hello Juergen > Use an x86-specific virtio_check_mem_acc_cb() for Xen in order to setup > the correct DMA ops. > > Signed-off-by: Juergen Gross <jgross@suse.com> > --- > arch/x86/xen/enlighten_hvm.c | 2 +- > arch/x86/xen/enlighten_pv.c | 2 +- > drivers/xen/grant-dma-ops.c | 10 ++++++++++ > include/xen/xen-ops.h | 1 + > 4 files changed, 13 insertions(+), 2 deletions(-) > > diff --git a/arch/x86/xen/enlighten_hvm.c b/arch/x86/xen/enlighten_hvm.c > index 1c1ac418484b..c1cd28e915a3 100644 > --- a/arch/x86/xen/enlighten_hvm.c > +++ b/arch/x86/xen/enlighten_hvm.c > @@ -212,7 +212,7 @@ static void __init xen_hvm_guest_init(void) > return; > > if (IS_ENABLED(CONFIG_XEN_VIRTIO_FORCE_GRANT)) > - virtio_set_mem_acc_cb(virtio_require_restricted_mem_acc); > + virtio_set_mem_acc_cb(xen_virtio_restricted_mem_acc); > > init_hvm_pv_info(); > > diff --git a/arch/x86/xen/enlighten_pv.c b/arch/x86/xen/enlighten_pv.c > index 9b1a58dda935..45b24c1b646a 100644 > --- a/arch/x86/xen/enlighten_pv.c > +++ b/arch/x86/xen/enlighten_pv.c > @@ -112,7 +112,7 @@ static void __init xen_pv_init_platform(void) > { > /* PV guests can't operate virtio devices without grants. */ > if (IS_ENABLED(CONFIG_XEN_VIRTIO)) > - virtio_set_mem_acc_cb(virtio_require_restricted_mem_acc); > + virtio_set_mem_acc_cb(xen_virtio_restricted_mem_acc); > > populate_extra_pte(fix_to_virt(FIX_PARAVIRT_BOOTMAP)); > > diff --git a/drivers/xen/grant-dma-ops.c b/drivers/xen/grant-dma-ops.c > index a00112235877..60a7acc334ed 100644 > --- a/drivers/xen/grant-dma-ops.c > +++ b/drivers/xen/grant-dma-ops.c > @@ -372,6 +372,16 @@ void xen_grant_setup_dma_ops(struct device *dev) > dev_err(dev, "Cannot set up Xen grant DMA ops, retain platform DMA ops\n"); > } > > +bool xen_virtio_restricted_mem_acc(struct virtio_device *dev) > +{ > + bool ret = xen_virtio_mem_acc(dev); The grant usage is mandatory for PV guests, right? Then xen_virtio_mem_acc() should always return true for PV guests (I mean even if CONFIG_XEN_VIRTIO_FORCE_GRANT is not set). > + > + if (ret) > + xen_grant_setup_dma_ops(dev->dev.parent); > + > + return ret; > +} > + > MODULE_DESCRIPTION("Xen grant DMA-mapping layer"); > MODULE_AUTHOR("Juergen Gross <jgross@suse.com>"); > MODULE_LICENSE("GPL"); > diff --git a/include/xen/xen-ops.h b/include/xen/xen-ops.h > index dae0f350c678..3dd5aa936f1d 100644 > --- a/include/xen/xen-ops.h > +++ b/include/xen/xen-ops.h > @@ -219,6 +219,7 @@ static inline void xen_preemptible_hcall_end(void) { } > void xen_grant_setup_dma_ops(struct device *dev); > bool xen_is_grant_dma_device(struct device *dev); > bool xen_virtio_mem_acc(struct virtio_device *dev); > +bool xen_virtio_restricted_mem_acc(struct virtio_device *dev); > #else > static inline void xen_grant_setup_dma_ops(struct device *dev) > { And probably static inline stub always returning false if CONFIG_XEN_GRANT_DMA_OPS is not set.
On 06.10.22 18:04, Oleksandr Tyshchenko wrote: > > On 06.10.22 10:15, Juergen Gross wrote: > > > Hello Juergen > >> Use an x86-specific virtio_check_mem_acc_cb() for Xen in order to setup >> the correct DMA ops. >> >> Signed-off-by: Juergen Gross <jgross@suse.com> >> --- >> arch/x86/xen/enlighten_hvm.c | 2 +- >> arch/x86/xen/enlighten_pv.c | 2 +- >> drivers/xen/grant-dma-ops.c | 10 ++++++++++ >> include/xen/xen-ops.h | 1 + >> 4 files changed, 13 insertions(+), 2 deletions(-) >> >> diff --git a/arch/x86/xen/enlighten_hvm.c b/arch/x86/xen/enlighten_hvm.c >> index 1c1ac418484b..c1cd28e915a3 100644 >> --- a/arch/x86/xen/enlighten_hvm.c >> +++ b/arch/x86/xen/enlighten_hvm.c >> @@ -212,7 +212,7 @@ static void __init xen_hvm_guest_init(void) >> return; >> >> if (IS_ENABLED(CONFIG_XEN_VIRTIO_FORCE_GRANT)) >> - virtio_set_mem_acc_cb(virtio_require_restricted_mem_acc); >> + virtio_set_mem_acc_cb(xen_virtio_restricted_mem_acc); >> >> init_hvm_pv_info(); >> >> diff --git a/arch/x86/xen/enlighten_pv.c b/arch/x86/xen/enlighten_pv.c >> index 9b1a58dda935..45b24c1b646a 100644 >> --- a/arch/x86/xen/enlighten_pv.c >> +++ b/arch/x86/xen/enlighten_pv.c >> @@ -112,7 +112,7 @@ static void __init xen_pv_init_platform(void) >> { >> /* PV guests can't operate virtio devices without grants. */ >> if (IS_ENABLED(CONFIG_XEN_VIRTIO)) >> - virtio_set_mem_acc_cb(virtio_require_restricted_mem_acc); >> + virtio_set_mem_acc_cb(xen_virtio_restricted_mem_acc); >> >> populate_extra_pte(fix_to_virt(FIX_PARAVIRT_BOOTMAP)); >> >> diff --git a/drivers/xen/grant-dma-ops.c b/drivers/xen/grant-dma-ops.c >> index a00112235877..60a7acc334ed 100644 >> --- a/drivers/xen/grant-dma-ops.c >> +++ b/drivers/xen/grant-dma-ops.c >> @@ -372,6 +372,16 @@ void xen_grant_setup_dma_ops(struct device *dev) >> dev_err(dev, "Cannot set up Xen grant DMA ops, retain platform DMA ops\n"); >> } >> >> +bool xen_virtio_restricted_mem_acc(struct virtio_device *dev) >> +{ >> + bool ret = xen_virtio_mem_acc(dev); > > > The grant usage is mandatory for PV guests, right? > > Then xen_virtio_mem_acc() should always return true for PV guests (I > mean even if CONFIG_XEN_VIRTIO_FORCE_GRANT is not set). Yes. > > > >> + >> + if (ret) >> + xen_grant_setup_dma_ops(dev->dev.parent); >> + >> + return ret; >> +} >> + >> MODULE_DESCRIPTION("Xen grant DMA-mapping layer"); >> MODULE_AUTHOR("Juergen Gross <jgross@suse.com>"); >> MODULE_LICENSE("GPL"); >> diff --git a/include/xen/xen-ops.h b/include/xen/xen-ops.h >> index dae0f350c678..3dd5aa936f1d 100644 >> --- a/include/xen/xen-ops.h >> +++ b/include/xen/xen-ops.h >> @@ -219,6 +219,7 @@ static inline void xen_preemptible_hcall_end(void) { } >> void xen_grant_setup_dma_ops(struct device *dev); >> bool xen_is_grant_dma_device(struct device *dev); >> bool xen_virtio_mem_acc(struct virtio_device *dev); >> +bool xen_virtio_restricted_mem_acc(struct virtio_device *dev); >> #else >> static inline void xen_grant_setup_dma_ops(struct device *dev) >> { > > > And probably static inline stub always returning false if > CONFIG_XEN_GRANT_DMA_OPS is not set. Indeed. Juergen
diff --git a/arch/x86/xen/enlighten_hvm.c b/arch/x86/xen/enlighten_hvm.c index 1c1ac418484b..c1cd28e915a3 100644 --- a/arch/x86/xen/enlighten_hvm.c +++ b/arch/x86/xen/enlighten_hvm.c @@ -212,7 +212,7 @@ static void __init xen_hvm_guest_init(void) return; if (IS_ENABLED(CONFIG_XEN_VIRTIO_FORCE_GRANT)) - virtio_set_mem_acc_cb(virtio_require_restricted_mem_acc); + virtio_set_mem_acc_cb(xen_virtio_restricted_mem_acc); init_hvm_pv_info(); diff --git a/arch/x86/xen/enlighten_pv.c b/arch/x86/xen/enlighten_pv.c index 9b1a58dda935..45b24c1b646a 100644 --- a/arch/x86/xen/enlighten_pv.c +++ b/arch/x86/xen/enlighten_pv.c @@ -112,7 +112,7 @@ static void __init xen_pv_init_platform(void) { /* PV guests can't operate virtio devices without grants. */ if (IS_ENABLED(CONFIG_XEN_VIRTIO)) - virtio_set_mem_acc_cb(virtio_require_restricted_mem_acc); + virtio_set_mem_acc_cb(xen_virtio_restricted_mem_acc); populate_extra_pte(fix_to_virt(FIX_PARAVIRT_BOOTMAP)); diff --git a/drivers/xen/grant-dma-ops.c b/drivers/xen/grant-dma-ops.c index a00112235877..60a7acc334ed 100644 --- a/drivers/xen/grant-dma-ops.c +++ b/drivers/xen/grant-dma-ops.c @@ -372,6 +372,16 @@ void xen_grant_setup_dma_ops(struct device *dev) dev_err(dev, "Cannot set up Xen grant DMA ops, retain platform DMA ops\n"); } +bool xen_virtio_restricted_mem_acc(struct virtio_device *dev) +{ + bool ret = xen_virtio_mem_acc(dev); + + if (ret) + xen_grant_setup_dma_ops(dev->dev.parent); + + return ret; +} + MODULE_DESCRIPTION("Xen grant DMA-mapping layer"); MODULE_AUTHOR("Juergen Gross <jgross@suse.com>"); MODULE_LICENSE("GPL"); diff --git a/include/xen/xen-ops.h b/include/xen/xen-ops.h index dae0f350c678..3dd5aa936f1d 100644 --- a/include/xen/xen-ops.h +++ b/include/xen/xen-ops.h @@ -219,6 +219,7 @@ static inline void xen_preemptible_hcall_end(void) { } void xen_grant_setup_dma_ops(struct device *dev); bool xen_is_grant_dma_device(struct device *dev); bool xen_virtio_mem_acc(struct virtio_device *dev); +bool xen_virtio_restricted_mem_acc(struct virtio_device *dev); #else static inline void xen_grant_setup_dma_ops(struct device *dev) {
Use an x86-specific virtio_check_mem_acc_cb() for Xen in order to setup the correct DMA ops. Signed-off-by: Juergen Gross <jgross@suse.com> --- arch/x86/xen/enlighten_hvm.c | 2 +- arch/x86/xen/enlighten_pv.c | 2 +- drivers/xen/grant-dma-ops.c | 10 ++++++++++ include/xen/xen-ops.h | 1 + 4 files changed, 13 insertions(+), 2 deletions(-)