Hi Ian,

OK, I have followed your suggestions and created a new patch

this new patch does fix the issue fully for the negative numbers

I didnt run the patch on 64bit OS since xenserver has 32bit Dom0

but i think it is safe to add

here is the patch in case you or anyone want to have look at and if you
have comments on before i send it
*** xen-ringwatch.old   2015-01-09 17:05:55.000000000 -0500
--- xen-ringwatch.new   2015-01-09 17:06:14.000000000 -0500
***************
*** 238,244 ****
              match = cls._pattern.search(line)
              if not match:
                  raise Exception, "Malformed %s input: %s" % \
!                     (cls.__name__, repr(s))

              i = iter(match.groups())
              for k in i:
--- 238,244 ----
              match = cls._pattern.search(line)
              if not match:
                  raise Exception, "Malformed %s input: %s" % \
!                     (cls.__name__, repr(line))

              i = iter(match.groups())
              for k in i:
***************
*** 251,263 ****

      class Req(Queue):

!         _pattern = Pattern("req (prod) (\d+) (cons) (\d+) (event) (\d+)")

          def __init__(self, prod, cons, event, **d):
              RingState.Queue.__init__(self, **d)
              self.prod  = int(prod)
              self.cons  = int(cons)
              self.event = int(event)

          def __repr__(self):
              return "%s(prod=%d, cons=%d, event=%d)" % \
--- 251,270 ----

      class Req(Queue):

!         _pattern = Pattern("req (prod) (\d+) (cons) ([-]*\d+) (event)
(\d+)")

          def __init__(self, prod, cons, event, **d):
              RingState.Queue.__init__(self, **d)
              self.prod  = int(prod)
              self.cons  = int(cons)
              self.event = int(event)
+
+             if self.cons < 0:
+                  self.cons = 4294967296 + self.cons
+             if self.prod < 0:
+                  self.prod = 4294967296 + self.prod
+             if self.event < 0:
+                  self.event = 4294967296 + self.event

          def __repr__(self):
              return "%s(prod=%d, cons=%d, event=%d)" % \
***************
*** 274,287 ****

      class Rsp(Queue):

!         _pattern = Pattern("rsp (prod) (\d+) (pvt) (\d+) (event) (\d+)")

          def __init__(self, prod, pvt, event, **d):
              RingState.Queue.__init__(self, **d)
              self.prod  = int(prod)
              self.pvt   = int(pvt)
              self.event = int(event)
!
          def __repr__(self):
              return "%s(prod=%d, pvt=%d, event=%d)" % \
                  (type(self).__name__, self.prod, self.pvt, self.event)
--- 281,301 ----

      class Rsp(Queue):

!         _pattern = Pattern("rsp (prod) (\d+) (pvt) ([-]*\d+) (event)
(\d+)")

          def __init__(self, prod, pvt, event, **d):
              RingState.Queue.__init__(self, **d)
              self.prod  = int(prod)
              self.pvt   = int(pvt)
              self.event = int(event)
!
!             if self.pvt < 0:
!                  self.pvt = 4294967296 + self.pvt
!             if self.prod < 0:
!                  self.prod = 4294967296 + self.prod
!             if self.event < 0:
!                  self.event = 4294967296 + self.event
!
          def __repr__(self):
              return "%s(prod=%d, pvt=%d, event=%d)" % \
                  (type(self).__name__, self.prod, self.pvt, self.event)


Thanks


On Fri, Jan 9, 2015 at 5:10 AM, Ian Campbell <ian.campb...@citrix.com>
wrote:

> On Thu, 2015-01-08 at 14:07 -0500, moftah moftah wrote:
> > Hi All,
> > We are using Xenserver 6.2
>
> FYI xenserver is developed as a separate project over at
> www.xenserver.org, so in general you should be reporting
> issue/requesting help over on their forums and lists etc.
>
> However, since xen-ringwatch is shipped by upstream Xen we can at least
> try and help with that bit here.
>
> [...]
> > so after searching around we changed the file xen-ringwatch in order
> > to see the real issue the changes are
>
> Those look sensible, please could you send with a changelog message and
> a Signed-off-by as described in
> http://wiki.xen.org/wiki/Submitting_Xen_Patches . The S-o-b in
> particular is required in order to be able to accept a code
> contribution.
>
> > --- /usr/sbin/xen-ringwatch     2013-07-22 13:52:19.000000000 +0200
> > +++ /usr/sbin/xen-ringwatch     2013-07-22 13:52:30.000000000 +0200
> > @@ -238,7 +238,7 @@
> >              match = cls._pattern.search(line)
> >              if not match:
> >                  raise Exception, "Malformed %s input: %s" % \
> > -                    (cls.__name__, repr(s))
> > +                    (cls.__name__, repr(line))
> >
> >              i = iter(match.groups())
> >              for k in i:
> >
> > now the issue we see is like this
> > Exception: Malformed Req input: 'req prod 3412900880 cons -882066416
> event 3412900881'
>
> I bet the negative number is confusing things (ah, which you also said
> further down).
>
> Really the kernel ought to be printing these as unsigned (for which
> you'll need to speak to the xenserver.org folks, I think)
>
> But the python code could also deal with them more gracefully when it
> sees them. You'd need to start by allowing the regex used for the match
> to accept an optional leading "-" on the numbers.
>
> You probably also want to cast the result to the unsigned value during
> the subsequent parsing, my Python-fu isn't sufficient to know off hand
> how one would do that.
>
> Ian.
>
>
>
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
http://lists.xen.org/xen-devel

Reply via email to