Martin Dommermuth
2008-Jul-25 11:27 UTC
[Xen-devel] Problem passing arguments from main.py to a new scheduler
Hi there,
as part of my diploma thesis I am currently extending Xen with
a new scheduler with some real time features.
As I didn''t have any prior knowledge of Python I am having a hard
time understanding the path a call to xm takes through Xen.
It starts in my function in main.py where I check whether the
correct options are set.
-----------------main.py
def xm_sched_rtbe(args):
"""Get/Set options for RTBE Scheduler."""
print "called xm_sched_rtbe() argv:"
print args
correctSyntax = False
try:
(opts, params) = getopt.getopt(args, "o:m:d:t:e:p:s:q:i:b:")
print opts
print params
except getopt.GetoptError, opterr:
print opts
print params
err(opterr)
usage(''sched-rtbe'')
if serverType == SERVER_XEN_API:
err("ServerType SERVER_XEN_API not supported by RTBE.")
result = 1
op = None
mtf = None
domain = None
tp = None
event = None
prio = None
start = None
quantum = None
interval = None
mtf_id = None
for o, a in opts:
if o in ["-o"]:
op = a
elif o in ["-m"]:
mtf = int(a)
elif o in ["-d"]:
domain = int(a)
elif o in ["-t"]:
tp = int(a)
elif o in ["-e"]:
event = int(a)
elif o in ["-p"]:
prio = int(a)
elif o in ["-s"]:
start = int(a)
elif o in ["-q"]:
quantum = int(a)
elif o in ["-i"]:
interval = int(a)
elif o in ["-b"]:
mtf_id = int(a);
if op == "mtf":
op = RTBE_MTF
if mtf is None:
err("Operation ''mtf'' needs -m set")
else:
correctSyntax = True
elif op == "bind":
op = RTBE_BIND_TP
if domain is None or tp is None or prio is None:
err("Operation ''bind'' needs -d, -t and -p
set")
else:
correctSyntax = True
elif op == "event":
op = RTBE_BIND_EVENT
if domain is None or event is None or quantum is None or interval is
None:
err("Operation ''event'' needs -d, -q and -i
set")
else:
correctSyntax = True
elif op == "add":
op = RTBE_ADD
if tp is None or start is None or quantum is None:
err("Operation ''add'' needs -t, -q and -s
set")
else:
correctSyntax = True
elif op == "del":
op = RTBE_DEL
if mtf_id is None:
err("Operation ''del'' needs -b set")
else:
domain = 0
correctSyntax = True
elif op == "print":
op = RTBE_PRINT
correctSyntax = True
else:
err("Operation must be set: -o
{mtf|bind|event|add|del|print}")
result = 0
if correctSyntax == True:
result =
server.xend.domain.sched_rtbe_set(op,domain,mtf,tp,event,prio,start,quantum,interval,mtf_id)
print "called server.xend.domain.sched_rtbe_set. result: %s" %
result
if result != 0:
err(str(result))
-----------------end
My call to server.xend.domain.sched_rtbe_set() seems to never make
it into XendDomain.py, which looks like this:
-----------------XendDomain.py
def
domain_sched_rtbe_set(self,op,domain,mtf,tp,event,prio,start,qantum,interval,mtf_id):
"""Set rtbe scheduler parameters for a
domain."""
print "called domain_sched_rtbe_set()"
#assert type(op) == int
if op is None:
return None
try:
if op == RTBE_MTF:
print "calling xc.sched_rtbe_mtf_set()"
# we use Dom0 for commands which don''t need a domain,
because
# of the signature of adjust from struct scheduler:
# int (*adjust) (struct domain *, struct xen_domctl_scheduler_op
*)
dominfo = self.domain_lookup_nr(0)
rc = xc.sched_rtbe_mtf_set(op,dominfo.getDomid(), mtf)
return rc
elif op == RTBE_BIND_TP:
dominfo = self.domain_lookup_nr(domain)
rc = xc.sched_rtbe_bind_tp(op, dominfo.getDomid(), tp, prio)
elif op == RTBE_BIND_EVENT:
dominfo = self.domain_lookup_nr(domain)
rc = xc.sched_rtbe_bind_event(op, dominfo.getDomid(), event,
quantum, interval)
elif op == RTBE_ADD:
dominfo = self.domain_lookup_nr(0)
rc = xc.sched_rtbe_add(op, dominfo.getDomid(), tp,start,quantum)
elif op == RTBE_DEL:
dominfo = self.domain_lookup_nr(0)
rc = xc.sched_rtbe_del(op, dominfo.getDomid(),mtf_id )
elif op == RTBE_PRINT:
dominfo = self.domain_lookup_nr(0)
rc = xc.sched_rtbe_print(op, dominfo.getDomid())
except Exception, ex:
log.exception(ex)
raise XendError(str(ex))
-----------------------------------
The print statement is never executed. All I get is:
Error: (22, ''Invalid argument'') and then usage() is called.
Now to the part I do not get: In SrvDomain.py I defined:
def op_domain_sched_rtbe_set(self, _, req):
fn = FormFn(self.xd.domain_sched_rtbe_set,
[[''op'', ''int''],
[''domain'', ''int''],
[''mtf'', ''int''],
[''tp'', ''int''],
[''event'', ''int''],
[''prio'', ''int''],
[''start'', ''int''],
[''quantum'', ''int''],
[''interval'', ''int''],
[''mtf_id'', ''int'']])
val = fn(req.args)
return val
Is this right? Are there any other places at which I have to define
the function?
This stuff with FormFn is a bit too Python-Voodoo for me :)
Thanks!
MartinD:
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel