[PATCH v3] vringh: IOMEM support

Shunsuke Mie posted 1 patch 2 years, 9 months ago
drivers/vhost/Kconfig  |   6 ++
drivers/vhost/vringh.c | 129 +++++++++++++++++++++++++++++++++++++++++
include/linux/vringh.h |  33 +++++++++++
3 files changed, 168 insertions(+)
[PATCH v3] vringh: IOMEM support
Posted by Shunsuke Mie 2 years, 9 months ago
Introduce a new memory accessor for vringh. It is able to use vringh to
virtio rings located on io-memory region.

Signed-off-by: Shunsuke Mie <mie@igel.co.jp>
---

Changes from v2: https://lore.kernel.org/virtualization/20230202090934.549556-1-mie@igel.co.jp/
- Focus on an adding io memory APIs
Remove vringh API unification and some fixes.
- Rebase on next-20230414

 drivers/vhost/Kconfig  |   6 ++
 drivers/vhost/vringh.c | 129 +++++++++++++++++++++++++++++++++++++++++
 include/linux/vringh.h |  33 +++++++++++
 3 files changed, 168 insertions(+)

diff --git a/drivers/vhost/Kconfig b/drivers/vhost/Kconfig
index b455d9ab6f3d..4b0dbb4a8ab3 100644
--- a/drivers/vhost/Kconfig
+++ b/drivers/vhost/Kconfig
@@ -6,6 +6,12 @@ config VHOST_IOTLB
 	  This option is selected by any driver which needs to support
 	  an IOMMU in software.
 
+config VHOST_RING_IOMEM
+	tristate
+	select VHOST_IOMEM
+	help
+	  This option enables vringh APIs to supports io memory space.
+
 config VHOST_RING
 	tristate
 	select VHOST_IOTLB
diff --git a/drivers/vhost/vringh.c b/drivers/vhost/vringh.c
index 955d938eb663..ce5a88eecc05 100644
--- a/drivers/vhost/vringh.c
+++ b/drivers/vhost/vringh.c
@@ -1604,4 +1604,133 @@ EXPORT_SYMBOL(vringh_need_notify_iotlb);
 
 #endif
 
+#if IS_REACHABLE(CONFIG_VHOST_RING_IOMEM)
+
+static inline int getu16_iomem(const struct vringh *vrh, u16 *val,
+			       const __virtio16 *p)
+{
+	*val = vringh16_to_cpu(vrh, ioread16(p));
+	return 0;
+}
+
+static inline int putu16_iomem(const struct vringh *vrh, __virtio16 *p, u16 val)
+{
+	iowrite16(cpu_to_vringh16(vrh, val), p);
+	return 0;
+}
+
+static inline int copydesc_iomem(const struct vringh *vrh, void *dst,
+				 const void *src, size_t len)
+{
+	memcpy_fromio(dst, src, len);
+	return 0;
+}
+
+static int putused_iomem(const struct vringh *vrh, struct vring_used_elem *dst,
+			 const struct vring_used_elem *src, unsigned int num)
+{
+	memcpy_toio(dst, src, num * sizeof(*dst));
+	return 0;
+}
+
+static inline int xfer_from_iomem(const struct vringh *vrh, void *src,
+				  void *dst, size_t len)
+{
+	memcpy_fromio(dst, src, len);
+	return 0;
+}
+
+static inline int xfer_to_iomem(const struct vringh *vrh, void *dst, void *src,
+				size_t len)
+{
+	memcpy_toio(dst, src, len);
+	return 0;
+}
+
+int vringh_init_iomem(struct vringh *vrh, u64 features, unsigned int num,
+		      bool weak_barriers, struct vring_desc *desc,
+		      struct vring_avail *avail, struct vring_used *used)
+{
+	return vringh_init_kern(vrh, features, num, weak_barriers, desc, avail,
+				used);
+}
+EXPORT_SYMBOL(vringh_init_iomem);
+
+int vringh_getdesc_iomem(struct vringh *vrh, struct vringh_kiov *riov,
+			 struct vringh_kiov *wiov, u16 *head, gfp_t gfp)
+{
+	int err;
+
+	err = __vringh_get_head(vrh, getu16_iomem, &vrh->last_avail_idx);
+	if (err < 0)
+		return err;
+
+	/* Empty... */
+	if (err == vrh->vring.num)
+		return 0;
+
+	*head = err;
+	err = __vringh_iov(vrh, *head, riov, wiov, no_range_check, NULL, gfp,
+			   copydesc_iomem);
+	if (err)
+		return err;
+
+	return 1;
+}
+EXPORT_SYMBOL(vringh_getdesc_iomem);
+
+ssize_t vringh_iov_pull_iomem(struct vringh *vrh, struct vringh_kiov *riov,
+			      void *dst, size_t len)
+{
+	return vringh_iov_xfer(vrh, riov, dst, len, xfer_from_iomem);
+}
+EXPORT_SYMBOL(vringh_iov_pull_iomem);
+
+ssize_t vringh_iov_push_iomem(struct vringh *vrh, struct vringh_kiov *wiov,
+			      const void *src, size_t len)
+{
+	return vringh_iov_xfer(vrh, wiov, (void *)src, len, xfer_to_iomem);
+}
+EXPORT_SYMBOL(vringh_iov_push_iomem);
+
+void vringh_abandon_iomem(struct vringh *vrh, unsigned int num)
+{
+	/* We only update vring_avail_event(vr) when we want to be notified,
+	 * so we haven't changed that yet.
+	 */
+	vrh->last_avail_idx -= num;
+}
+EXPORT_SYMBOL(vringh_abandon_iomem);
+
+int vringh_complete_iomem(struct vringh *vrh, u16 head, u32 len)
+{
+	struct vring_used_elem used;
+
+	used.id = cpu_to_vringh32(vrh, head);
+	used.len = cpu_to_vringh32(vrh, len);
+
+	return __vringh_complete(vrh, &used, 1, putu16_iomem, putused_iomem);
+}
+EXPORT_SYMBOL(vringh_complete_iomem);
+
+bool vringh_notify_enable_iomem(struct vringh *vrh)
+{
+	return __vringh_notify_enable(vrh, getu16_iomem, putu16_iomem);
+}
+EXPORT_SYMBOL(vringh_notify_enable_iomem);
+
+void vringh_notify_disable_iomem(struct vringh *vrh)
+{
+	__vringh_notify_disable(vrh, putu16_iomem);
+}
+EXPORT_SYMBOL(vringh_notify_disable_iomem);
+
+int vringh_need_notify_iomem(struct vringh *vrh)
+{
+	return __vringh_need_notify(vrh, getu16_iomem);
+}
+EXPORT_SYMBOL(vringh_need_notify_iomem);
+
+#endif /* CONFIG_VHOST_RING_IOMEM */
+
 MODULE_LICENSE("GPL");
diff --git a/include/linux/vringh.h b/include/linux/vringh.h
index c3a8117dabe8..c03d045f7f3f 100644
--- a/include/linux/vringh.h
+++ b/include/linux/vringh.h
@@ -330,4 +330,37 @@ int vringh_need_notify_iotlb(struct vringh *vrh);
 
 #endif /* CONFIG_VHOST_IOTLB */
 
+#if IS_REACHABLE(CONFIG_VHOST_RING_IOMEM)
+
+int vringh_init_iomem(struct vringh *vrh, u64 features,
+		      unsigned int num, bool weak_barriers,
+		      struct vring_desc *desc,
+		      struct vring_avail *avail,
+		      struct vring_used *used);
+
+
+int vringh_getdesc_iomem(struct vringh *vrh,
+			 struct vringh_kiov *riov,
+			 struct vringh_kiov *wiov,
+			 u16 *head,
+			 gfp_t gfp);
+
+ssize_t vringh_iov_pull_iomem(struct vringh *vrh,
+			      struct vringh_kiov *riov,
+			      void *dst, size_t len);
+ssize_t vringh_iov_push_iomem(struct vringh *vrh,
+			      struct vringh_kiov *wiov,
+			      const void *src, size_t len);
+
+void vringh_abandon_iomem(struct vringh *vrh, unsigned int num);
+
+int vringh_complete_iomem(struct vringh *vrh, u16 head, u32 len);
+
+bool vringh_notify_enable_iomem(struct vringh *vrh);
+void vringh_notify_disable_iomem(struct vringh *vrh);
+
+int vringh_need_notify_iomem(struct vringh *vrh);
+
+#endif /* CONFIG_VHOST_RING_IOMEM */
+
 #endif /* _LINUX_VRINGH_H */

base-commit: d3f2cd24819158bb70701c3549e586f9df9cee67
prerequisite-patch-id: 760abbe8c981c52ccc421b8139e8999ab71619aa
prerequisite-patch-id: 99d8679ab4569545c8af401e84142c66312e953e
prerequisite-patch-id: aca81516aba75b58c8422d37c2dc7db2f61ffe92
prerequisite-patch-id: 3d76136200c4e55ba2c41681325f242859dd6dbd
prerequisite-patch-id: 47a994feb68d95412d81b0fd1fa27bc7ba05ae18
prerequisite-patch-id: a2f7fc3f35358f70b6dad4c919ce293b10295c4f
prerequisite-patch-id: 70e2ee32b945be96a0388f0ff564651ac9335220
prerequisite-patch-id: 2023690f9c47017b56d7f036332a5ca3ece6bde8
prerequisite-patch-id: 211e113fec6c450d13fbdb437ecfad67dec0a157
prerequisite-patch-id: f2bcd3168933886e4cd4c39e47446d1bd7cb2691
prerequisite-patch-id: 37b131560808733a0b8878e85a3d2a46d6ab02ca
prerequisite-patch-id: 79b0219a715cb5ace227d55666d62fdb2dcc6ffe
prerequisite-patch-id: 30f1740cd48a19aa1c3c93e625c740cae2845478
prerequisite-patch-id: 31989e4a521f2fc6f68c4ccdb6960035e87666a7
prerequisite-patch-id: 3948bb3e0c045e2ffff06a714d17bab16c94775d
prerequisite-patch-id: cf28e0115b9111bcb77aa9c710d98b2be93c7e89
prerequisite-patch-id: ebf2349c0ae1296663854eee2da0b43fe8972f9b
prerequisite-patch-id: fc570921d885a2a6000800b4022321e63f1650a5
prerequisite-patch-id: 1fd5219fef17c2bf2d76000207b25aae58c368f3
prerequisite-patch-id: 34e5f078202762fe69df471e97b51b1341cbdfa9
prerequisite-patch-id: 7fa5151b9e0488b48c2b9d1219152cfb047d6586
prerequisite-patch-id: 33cca272767af04ae9abe7af2f6cbb9972cc0b77
prerequisite-patch-id: bb1a6befc899dd97bcd946c2d76ce73675a1fa45
prerequisite-patch-id: 10be04dd92fa451d13676e91d9094b63cd7fbcf8
prerequisite-patch-id: 87b86eb4ce9501bba9c04ec81094ac9202392431
prerequisite-patch-id: a5ced28762bf6bd6419dae0e4413d02ccafd72c2
prerequisite-patch-id: 2db4c9603e00d69bb0184dabcc319e7f74f30305
prerequisite-patch-id: 41933f9d53e5e9e02efd6157b68ee7d92b10cfa2
prerequisite-patch-id: df3295b4cdde3a45eaf4c40047179698a4224d05
prerequisite-patch-id: 9e2fca9ab0ba2b935daa96f1745ff4c909792231
prerequisite-patch-id: 8948378099ba4d61e10a87e617d69ed2fc4104ae
prerequisite-patch-id: 5e7466f3f0d74880d1a574a1bd91b12091dcf3f5
prerequisite-patch-id: 902899e1cd53b7fcc7971f630aed103830fc3e3d
prerequisite-patch-id: 42126b180500f9ff123db78748972c6ece18ac57
prerequisite-patch-id: 5236a03ef574074f3c1009a52612051862b31eff
prerequisite-patch-id: adae1aa80df65bd02a9e3f4db490cf801c1c6119
prerequisite-patch-id: 22806fcabb973ee5f04ee6212db6161aab5bcbfc
prerequisite-patch-id: 6eb14cfdc2cf31e90556f6afe7361427a332e8dc
-- 
2.25.1
Re: [PATCH v3] vringh: IOMEM support
Posted by Simon Horman 2 years, 9 months ago
On Tue, Apr 25, 2023 at 07:22:50PM +0900, Shunsuke Mie wrote:
> Introduce a new memory accessor for vringh. It is able to use vringh to
> virtio rings located on io-memory region.
> 
> Signed-off-by: Shunsuke Mie <mie@igel.co.jp>

...

Hi Mie-san,

thanks for your patch.
One small nit from me below.

> diff --git a/include/linux/vringh.h b/include/linux/vringh.h
> index c3a8117dabe8..c03d045f7f3f 100644
> --- a/include/linux/vringh.h
> +++ b/include/linux/vringh.h
> @@ -330,4 +330,37 @@ int vringh_need_notify_iotlb(struct vringh *vrh);
>  
>  #endif /* CONFIG_VHOST_IOTLB */
>  
> +#if IS_REACHABLE(CONFIG_VHOST_RING_IOMEM)
> +
> +int vringh_init_iomem(struct vringh *vrh, u64 features,
> +		      unsigned int num, bool weak_barriers,
> +		      struct vring_desc *desc,
> +		      struct vring_avail *avail,
> +		      struct vring_used *used);
> +
> +

nit: one blank line is enough.

> +int vringh_getdesc_iomem(struct vringh *vrh,
> +			 struct vringh_kiov *riov,
> +			 struct vringh_kiov *wiov,
> +			 u16 *head,
> +			 gfp_t gfp);

...
Re: [PATCH v3] vringh: IOMEM support
Posted by Shunsuke Mie 2 years, 9 months ago
Hi Simon-san,

2023年4月27日(木) 4:21 Simon Horman <simon.horman@corigine.com>:
>
> On Tue, Apr 25, 2023 at 07:22:50PM +0900, Shunsuke Mie wrote:
> > Introduce a new memory accessor for vringh. It is able to use vringh to
> > virtio rings located on io-memory region.
> >
> > Signed-off-by: Shunsuke Mie <mie@igel.co.jp>
>
> ...
>
> Hi Mie-san,
>
> thanks for your patch.
> One small nit from me below.
>
> > diff --git a/include/linux/vringh.h b/include/linux/vringh.h
> > index c3a8117dabe8..c03d045f7f3f 100644
> > --- a/include/linux/vringh.h
> > +++ b/include/linux/vringh.h
> > @@ -330,4 +330,37 @@ int vringh_need_notify_iotlb(struct vringh *vrh);
> >
> >  #endif /* CONFIG_VHOST_IOTLB */
> >
> > +#if IS_REACHABLE(CONFIG_VHOST_RING_IOMEM)
> > +
> > +int vringh_init_iomem(struct vringh *vrh, u64 features,
> > +                   unsigned int num, bool weak_barriers,
> > +                   struct vring_desc *desc,
> > +                   struct vring_avail *avail,
> > +                   struct vring_used *used);
> > +
> > +
>
> nit: one blank line is enough.
It should not have included this patch. Thanks.
> > +int vringh_getdesc_iomem(struct vringh *vrh,
> > +                      struct vringh_kiov *riov,
> > +                      struct vringh_kiov *wiov,
> > +                      u16 *head,
> > +                      gfp_t gfp);
>
> ...
Re: [PATCH v3] vringh: IOMEM support
Posted by Jason Wang 2 years, 9 months ago
On Tue, Apr 25, 2023 at 6:23 PM Shunsuke Mie <mie@igel.co.jp> wrote:
>
> Introduce a new memory accessor for vringh. It is able to use vringh to
> virtio rings located on io-memory region.

Is there a user for this? It would be better if you can describe the
use cases for this. Maybe you can post the user or at least a link to
the git as a reference.

>
> Signed-off-by: Shunsuke Mie <mie@igel.co.jp>
> ---
>
> Changes from v2: https://lore.kernel.org/virtualization/20230202090934.549556-1-mie@igel.co.jp/
> - Focus on an adding io memory APIs
> Remove vringh API unification and some fixes.
> - Rebase on next-20230414
>
>  drivers/vhost/Kconfig  |   6 ++
>  drivers/vhost/vringh.c | 129 +++++++++++++++++++++++++++++++++++++++++
>  include/linux/vringh.h |  33 +++++++++++
>  3 files changed, 168 insertions(+)
>
> diff --git a/drivers/vhost/Kconfig b/drivers/vhost/Kconfig
> index b455d9ab6f3d..4b0dbb4a8ab3 100644
> --- a/drivers/vhost/Kconfig
> +++ b/drivers/vhost/Kconfig
> @@ -6,6 +6,12 @@ config VHOST_IOTLB
>           This option is selected by any driver which needs to support
>           an IOMMU in software.
>
> +config VHOST_RING_IOMEM
> +       tristate
> +       select VHOST_IOMEM
> +       help
> +         This option enables vringh APIs to supports io memory space.

There's no specific Kconfig for all the existing accessors. Any reason
I/O memory is special or do you care about the size of the module?

> +
>  config VHOST_RING
>         tristate
>         select VHOST_IOTLB
> diff --git a/drivers/vhost/vringh.c b/drivers/vhost/vringh.c
> index 955d938eb663..ce5a88eecc05 100644
> --- a/drivers/vhost/vringh.c
> +++ b/drivers/vhost/vringh.c
> @@ -1604,4 +1604,133 @@ EXPORT_SYMBOL(vringh_need_notify_iotlb);
>
>  #endif
>

[...]

>
> base-commit: d3f2cd24819158bb70701c3549e586f9df9cee67
> prerequisite-patch-id: 760abbe8c981c52ccc421b8139e8999ab71619aa
> prerequisite-patch-id: 99d8679ab4569545c8af401e84142c66312e953e
> prerequisite-patch-id: aca81516aba75b58c8422d37c2dc7db2f61ffe92
> prerequisite-patch-id: 3d76136200c4e55ba2c41681325f242859dd6dbd
> prerequisite-patch-id: 47a994feb68d95412d81b0fd1fa27bc7ba05ae18
> prerequisite-patch-id: a2f7fc3f35358f70b6dad4c919ce293b10295c4f
> prerequisite-patch-id: 70e2ee32b945be96a0388f0ff564651ac9335220
> prerequisite-patch-id: 2023690f9c47017b56d7f036332a5ca3ece6bde8
> prerequisite-patch-id: 211e113fec6c450d13fbdb437ecfad67dec0a157
> prerequisite-patch-id: f2bcd3168933886e4cd4c39e47446d1bd7cb2691
> prerequisite-patch-id: 37b131560808733a0b8878e85a3d2a46d6ab02ca
> prerequisite-patch-id: 79b0219a715cb5ace227d55666d62fdb2dcc6ffe
> prerequisite-patch-id: 30f1740cd48a19aa1c3c93e625c740cae2845478
> prerequisite-patch-id: 31989e4a521f2fc6f68c4ccdb6960035e87666a7
> prerequisite-patch-id: 3948bb3e0c045e2ffff06a714d17bab16c94775d
> prerequisite-patch-id: cf28e0115b9111bcb77aa9c710d98b2be93c7e89
> prerequisite-patch-id: ebf2349c0ae1296663854eee2da0b43fe8972f9b
> prerequisite-patch-id: fc570921d885a2a6000800b4022321e63f1650a5
> prerequisite-patch-id: 1fd5219fef17c2bf2d76000207b25aae58c368f3
> prerequisite-patch-id: 34e5f078202762fe69df471e97b51b1341cbdfa9
> prerequisite-patch-id: 7fa5151b9e0488b48c2b9d1219152cfb047d6586
> prerequisite-patch-id: 33cca272767af04ae9abe7af2f6cbb9972cc0b77
> prerequisite-patch-id: bb1a6befc899dd97bcd946c2d76ce73675a1fa45
> prerequisite-patch-id: 10be04dd92fa451d13676e91d9094b63cd7fbcf8
> prerequisite-patch-id: 87b86eb4ce9501bba9c04ec81094ac9202392431
> prerequisite-patch-id: a5ced28762bf6bd6419dae0e4413d02ccafd72c2
> prerequisite-patch-id: 2db4c9603e00d69bb0184dabcc319e7f74f30305
> prerequisite-patch-id: 41933f9d53e5e9e02efd6157b68ee7d92b10cfa2
> prerequisite-patch-id: df3295b4cdde3a45eaf4c40047179698a4224d05
> prerequisite-patch-id: 9e2fca9ab0ba2b935daa96f1745ff4c909792231
> prerequisite-patch-id: 8948378099ba4d61e10a87e617d69ed2fc4104ae
> prerequisite-patch-id: 5e7466f3f0d74880d1a574a1bd91b12091dcf3f5
> prerequisite-patch-id: 902899e1cd53b7fcc7971f630aed103830fc3e3d
> prerequisite-patch-id: 42126b180500f9ff123db78748972c6ece18ac57
> prerequisite-patch-id: 5236a03ef574074f3c1009a52612051862b31eff
> prerequisite-patch-id: adae1aa80df65bd02a9e3f4db490cf801c1c6119
> prerequisite-patch-id: 22806fcabb973ee5f04ee6212db6161aab5bcbfc
> prerequisite-patch-id: 6eb14cfdc2cf31e90556f6afe7361427a332e8dc

These seem meaningless?

Thanks

> --
> 2.25.1
>
Re: [PATCH v3] vringh: IOMEM support
Posted by Shunsuke Mie 2 years, 9 months ago
2023年4月26日(水) 15:10 Jason Wang <jasowang@redhat.com>:
>
> On Tue, Apr 25, 2023 at 6:23 PM Shunsuke Mie <mie@igel.co.jp> wrote:
> >
> > Introduce a new memory accessor for vringh. It is able to use vringh to
> > virtio rings located on io-memory region.
>
> Is there a user for this? It would be better if you can describe the
> use cases for this. Maybe you can post the user or at least a link to
> the git as a reference.
This is for the following patch.
https://lore.kernel.org/virtualization/20230427175244.GA261197@bhelgaas/T/#m30a258509caca2413a21f9a9ce0f5fd31d3bd006
I'd like to add a description of how this feature will be used in the
next version.
> >
> > Signed-off-by: Shunsuke Mie <mie@igel.co.jp>
> > ---
> >
> > Changes from v2: https://lore.kernel.org/virtualization/20230202090934.549556-1-mie@igel.co.jp/
> > - Focus on an adding io memory APIs
> > Remove vringh API unification and some fixes.
> > - Rebase on next-20230414
> >
> >  drivers/vhost/Kconfig  |   6 ++
> >  drivers/vhost/vringh.c | 129 +++++++++++++++++++++++++++++++++++++++++
> >  include/linux/vringh.h |  33 +++++++++++
> >  3 files changed, 168 insertions(+)
> >
> > diff --git a/drivers/vhost/Kconfig b/drivers/vhost/Kconfig
> > index b455d9ab6f3d..4b0dbb4a8ab3 100644
> > --- a/drivers/vhost/Kconfig
> > +++ b/drivers/vhost/Kconfig
> > @@ -6,6 +6,12 @@ config VHOST_IOTLB
> >           This option is selected by any driver which needs to support
> >           an IOMMU in software.
> >
> > +config VHOST_RING_IOMEM
> > +       tristate
> > +       select VHOST_IOMEM
> > +       help
> > +         This option enables vringh APIs to supports io memory space.
>
> There's no specific Kconfig for all the existing accessors. Any reason
> I/O memory is special or do you care about the size of the module?
I followed the IOTLB that is used for vhost and vringh. However, this code has
little effect on the code size and dependencies if included, so I
would like to remove
the Kconfig.
> > +
> >  config VHOST_RING
> >         tristate
> >         select VHOST_IOTLB
> > diff --git a/drivers/vhost/vringh.c b/drivers/vhost/vringh.c
> > index 955d938eb663..ce5a88eecc05 100644
> > --- a/drivers/vhost/vringh.c
> > +++ b/drivers/vhost/vringh.c
> > @@ -1604,4 +1604,133 @@ EXPORT_SYMBOL(vringh_need_notify_iotlb);
> >
> >  #endif
> >
>
> [...]
>
> >
> > base-commit: d3f2cd24819158bb70701c3549e586f9df9cee67
> > prerequisite-patch-id: 760abbe8c981c52ccc421b8139e8999ab71619aa
> > prerequisite-patch-id: 99d8679ab4569545c8af401e84142c66312e953e
> > prerequisite-patch-id: aca81516aba75b58c8422d37c2dc7db2f61ffe92
> > prerequisite-patch-id: 3d76136200c4e55ba2c41681325f242859dd6dbd
> > prerequisite-patch-id: 47a994feb68d95412d81b0fd1fa27bc7ba05ae18
> > prerequisite-patch-id: a2f7fc3f35358f70b6dad4c919ce293b10295c4f
> > prerequisite-patch-id: 70e2ee32b945be96a0388f0ff564651ac9335220
> > prerequisite-patch-id: 2023690f9c47017b56d7f036332a5ca3ece6bde8
> > prerequisite-patch-id: 211e113fec6c450d13fbdb437ecfad67dec0a157
> > prerequisite-patch-id: f2bcd3168933886e4cd4c39e47446d1bd7cb2691
> > prerequisite-patch-id: 37b131560808733a0b8878e85a3d2a46d6ab02ca
> > prerequisite-patch-id: 79b0219a715cb5ace227d55666d62fdb2dcc6ffe
> > prerequisite-patch-id: 30f1740cd48a19aa1c3c93e625c740cae2845478
> > prerequisite-patch-id: 31989e4a521f2fc6f68c4ccdb6960035e87666a7
> > prerequisite-patch-id: 3948bb3e0c045e2ffff06a714d17bab16c94775d
> > prerequisite-patch-id: cf28e0115b9111bcb77aa9c710d98b2be93c7e89
> > prerequisite-patch-id: ebf2349c0ae1296663854eee2da0b43fe8972f9b
> > prerequisite-patch-id: fc570921d885a2a6000800b4022321e63f1650a5
> > prerequisite-patch-id: 1fd5219fef17c2bf2d76000207b25aae58c368f3
> > prerequisite-patch-id: 34e5f078202762fe69df471e97b51b1341cbdfa9
> > prerequisite-patch-id: 7fa5151b9e0488b48c2b9d1219152cfb047d6586
> > prerequisite-patch-id: 33cca272767af04ae9abe7af2f6cbb9972cc0b77
> > prerequisite-patch-id: bb1a6befc899dd97bcd946c2d76ce73675a1fa45
> > prerequisite-patch-id: 10be04dd92fa451d13676e91d9094b63cd7fbcf8
> > prerequisite-patch-id: 87b86eb4ce9501bba9c04ec81094ac9202392431
> > prerequisite-patch-id: a5ced28762bf6bd6419dae0e4413d02ccafd72c2
> > prerequisite-patch-id: 2db4c9603e00d69bb0184dabcc319e7f74f30305
> > prerequisite-patch-id: 41933f9d53e5e9e02efd6157b68ee7d92b10cfa2
> > prerequisite-patch-id: df3295b4cdde3a45eaf4c40047179698a4224d05
> > prerequisite-patch-id: 9e2fca9ab0ba2b935daa96f1745ff4c909792231
> > prerequisite-patch-id: 8948378099ba4d61e10a87e617d69ed2fc4104ae
> > prerequisite-patch-id: 5e7466f3f0d74880d1a574a1bd91b12091dcf3f5
> > prerequisite-patch-id: 902899e1cd53b7fcc7971f630aed103830fc3e3d
> > prerequisite-patch-id: 42126b180500f9ff123db78748972c6ece18ac57
> > prerequisite-patch-id: 5236a03ef574074f3c1009a52612051862b31eff
> > prerequisite-patch-id: adae1aa80df65bd02a9e3f4db490cf801c1c6119
> > prerequisite-patch-id: 22806fcabb973ee5f04ee6212db6161aab5bcbfc
> > prerequisite-patch-id: 6eb14cfdc2cf31e90556f6afe7361427a332e8dc
>
> These seem meaningless?
I'm sorry, that didn't make sense. I'll remove it.
> Thanks
>
> > --
> > 2.25.1
> >
>
Best regards,
Shunsuke