diff mbox series

[v1] memory: remove assert to avoid unnecessary coredump

Message ID 20200303031114.21111-1-yi.y.sun@linux.intel.com
State New
Headers show
Series [v1] memory: remove assert to avoid unnecessary coredump | expand

Commit Message

Yi Sun March 3, 2020, 3:11 a.m. UTC
It is too strict to use assert to make qemu coredump if
the notification does not overlap with registered range.
Skip it is fine enough.

During test, we found such a case for vhost net device:
    memory_region_notify_one: entry->iova=0xfee00000, entry_end=0xfeffffff, notifier->start=0xfef00000, notifier->end=0xffffffffffffffff

Skip this notification but not coredump makes everything
work well.

Signed-off-by: Yi Sun <yi.y.sun@linux.intel.com>
---
 memory.c | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)

Comments

Yan Zhao March 3, 2020, 3:36 a.m. UTC | #1
On Tue, Mar 03, 2020 at 11:11:14AM +0800, Yi Sun wrote:
> It is too strict to use assert to make qemu coredump if
> the notification does not overlap with registered range.
> Skip it is fine enough.
> 
> During test, we found such a case for vhost net device:
>     memory_region_notify_one: entry->iova=0xfee00000, entry_end=0xfeffffff, notifier->start=0xfef00000, notifier->end=0xffffffffffffffff
>
so for range from 0xfef00000 to 0xfefffff,  would notification for this
range get lost?

Thanks
Yan

> Skip this notification but not coredump makes everything
> work well.
> 
> Signed-off-by: Yi Sun <yi.y.sun@linux.intel.com>
> ---
>  memory.c | 5 ++---
>  1 file changed, 2 insertions(+), 3 deletions(-)
> 
> diff --git a/memory.c b/memory.c
> index 06484c2bff..62ad0f3377 100644
> --- a/memory.c
> +++ b/memory.c
> @@ -1921,12 +1921,11 @@ void memory_region_notify_one(IOMMUNotifier *notifier,
>       * Skip the notification if the notification does not overlap
>       * with registered range.
>       */
> -    if (notifier->start > entry_end || notifier->end < entry->iova) {
> +    if (notifier->start > entry_end || notifier->end < entry->iova ||
> +        entry->iova < notifier->start || entry_end > notifier->end) {
>          return;
>      }
>  
> -    assert(entry->iova >= notifier->start && entry_end <= notifier->end);
> -
>      if (entry->perm & IOMMU_RW) {
>          request_flags = IOMMU_NOTIFIER_MAP;
>      } else {
> -- 
> 2.15.1
>
Yi Sun March 3, 2020, 5:22 a.m. UTC | #2
On 20-03-02 22:36:39, Yan Zhao wrote:
> On Tue, Mar 03, 2020 at 11:11:14AM +0800, Yi Sun wrote:
> > It is too strict to use assert to make qemu coredump if
> > the notification does not overlap with registered range.
> > Skip it is fine enough.
> > 
> > During test, we found such a case for vhost net device:
> >     memory_region_notify_one: entry->iova=0xfee00000, entry_end=0xfeffffff, notifier->start=0xfef00000, notifier->end=0xffffffffffffffff
> >
> so for range from 0xfef00000 to 0xfefffff,  would notification for this
> range get lost?
> 
Yes, that is an issue although there is no any problem found during test
with this fix.

I think we should notify the intersection between entry and notifier. How
do you think?

> Thanks
> Yan
> 
> > Skip this notification but not coredump makes everything
> > work well.
> > 
> > Signed-off-by: Yi Sun <yi.y.sun@linux.intel.com>
> > ---
> >  memory.c | 5 ++---
> >  1 file changed, 2 insertions(+), 3 deletions(-)
> > 
> > diff --git a/memory.c b/memory.c
> > index 06484c2bff..62ad0f3377 100644
> > --- a/memory.c
> > +++ b/memory.c
> > @@ -1921,12 +1921,11 @@ void memory_region_notify_one(IOMMUNotifier *notifier,
> >       * Skip the notification if the notification does not overlap
> >       * with registered range.
> >       */
> > -    if (notifier->start > entry_end || notifier->end < entry->iova) {
> > +    if (notifier->start > entry_end || notifier->end < entry->iova ||
> > +        entry->iova < notifier->start || entry_end > notifier->end) {
> >          return;
> >      }
> >  
> > -    assert(entry->iova >= notifier->start && entry_end <= notifier->end);
> > -
> >      if (entry->perm & IOMMU_RW) {
> >          request_flags = IOMMU_NOTIFIER_MAP;
> >      } else {
> > -- 
> > 2.15.1
> >
Yan Zhao March 3, 2020, 5:30 a.m. UTC | #3
On Tue, Mar 03, 2020 at 01:22:26PM +0800, Yi Sun wrote:
> On 20-03-02 22:36:39, Yan Zhao wrote:
> > On Tue, Mar 03, 2020 at 11:11:14AM +0800, Yi Sun wrote:
> > > It is too strict to use assert to make qemu coredump if
> > > the notification does not overlap with registered range.
> > > Skip it is fine enough.
> > > 
> > > During test, we found such a case for vhost net device:
> > >     memory_region_notify_one: entry->iova=0xfee00000, entry_end=0xfeffffff, notifier->start=0xfef00000, notifier->end=0xffffffffffffffff
> > >
> > so for range from 0xfef00000 to 0xfefffff,  would notification for this
> > range get lost?
> > 
> Yes, that is an issue although there is no any problem found during test
> with this fix.
> 
> I think we should notify the intersection between entry and notifier. How
> do you think?
> 
no. please refer to the link below.
https://lists.gnu.org/archive/html/qemu-devel/2019-06/msg04218.html

Thanks
Yan

> > Thanks
> > Yan
> > 
> > > Skip this notification but not coredump makes everything
> > > work well.
> > > 
> > > Signed-off-by: Yi Sun <yi.y.sun@linux.intel.com>
> > > ---
> > >  memory.c | 5 ++---
> > >  1 file changed, 2 insertions(+), 3 deletions(-)
> > > 
> > > diff --git a/memory.c b/memory.c
> > > index 06484c2bff..62ad0f3377 100644
> > > --- a/memory.c
> > > +++ b/memory.c
> > > @@ -1921,12 +1921,11 @@ void memory_region_notify_one(IOMMUNotifier *notifier,
> > >       * Skip the notification if the notification does not overlap
> > >       * with registered range.
> > >       */
> > > -    if (notifier->start > entry_end || notifier->end < entry->iova) {
> > > +    if (notifier->start > entry_end || notifier->end < entry->iova ||
> > > +        entry->iova < notifier->start || entry_end > notifier->end) {
> > >          return;
> > >      }
> > >  
> > > -    assert(entry->iova >= notifier->start && entry_end <= notifier->end);
> > > -
> > >      if (entry->perm & IOMMU_RW) {
> > >          request_flags = IOMMU_NOTIFIER_MAP;
> > >      } else {
> > > -- 
> > > 2.15.1
> > >
diff mbox series

Patch

diff --git a/memory.c b/memory.c
index 06484c2bff..62ad0f3377 100644
--- a/memory.c
+++ b/memory.c
@@ -1921,12 +1921,11 @@  void memory_region_notify_one(IOMMUNotifier *notifier,
      * Skip the notification if the notification does not overlap
      * with registered range.
      */
-    if (notifier->start > entry_end || notifier->end < entry->iova) {
+    if (notifier->start > entry_end || notifier->end < entry->iova ||
+        entry->iova < notifier->start || entry_end > notifier->end) {
         return;
     }
 
-    assert(entry->iova >= notifier->start && entry_end <= notifier->end);
-
     if (entry->perm & IOMMU_RW) {
         request_flags = IOMMU_NOTIFIER_MAP;
     } else {