Yanzhang Li
2012-Dec-05 06:21 UTC
Suggestion: Improve hypercall Interface to get real return value
Hello everyone,
I am a user of Xen and I have encountered a problem when trying to get the
return value from hypercall in TOOLS. I found that when programs in TOOLS called
hypercall and failed, it would get return value -1 instead of the real return
value given by Hypervisor.
The reason is that the hypercall interface of TOOLS uses ioctl to call
hypercall, and ioctl will only return -1 when failure occurs. The related code
is in xen-4.2.0/tools/libxc/xc_linux_osdep.c:
static int linux_privcmd_hypercall(xc_interface *xch, xc_osdep_handle h,
privcmd_hypercall_t *hypercall)
{
int fd = (int)h;
return ioctl(fd, IOCTL_PRIVCMD_HYPERCALL, hypercall);
}
While I don't think this is a good idea, because some tools may wish to use
real return value. For example, in xen-4.2.0/tools/memshr/interface.c, the
function memshr_vbd_issue_ro_request will switch variable ret which comes from
return value of hypercall do_memory_op:
switch(ret)
{
case XENMEM_SHARING_OP_S_HANDLE_INVALID:
……
break;
case XENMEM_SHARING_OP_C_HANDLE_INVALID:
……
break;
default:
break;
}
So I think if we could modify the interface a little bit to return the real
error number, it would be beneficial to many TOOLS developers including myself.
My suggested modification is simple:
static int linux_privcmd_hypercall(xc_interface *xch, xc_osdep_handle h,
privcmd_hypercall_t *hypercall)
{
int fd = (int)h;
int ret = ioctl(fd, IOCTL_PRIVCMD_HYPERCALL, hypercall);
if (ret < 0)
return -errno;
return ret;
}
Do you think this would be a good modification?
Also, I am curious why the original design didn't do that. Is it a bug or is
it designed that way intentionally?
Any suggestions and comments will be highly appreciated.
Thanks!
Best Regards,
Yanzhang Li
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
http://lists.xen.org/xen-devel
George Dunlap
2012-Dec-05 11:05 UTC
Re: Suggestion: Improve hypercall Interface to get real return value
On Wed, Dec 5, 2012 at 6:21 AM, Yanzhang Li <liyz@pku.edu.cn> wrote:> > > Do you think this would be a good modification? > Also, I am curious why the original design didn''t do that. Is it a bug or > is it designed that way intentionally? > Any suggestions and comments will be highly appreciated. >The reason we just return -1 is because that is the standard practice for Unix system libraries: to return -1 but set the error value in "errno". I couldn''t tell you why Unix does this, but there''s an advantage to following standard interfaces, because it reduces the surprise factor, and reduces the amount of information programmers need to keep in their head. -George _______________________________________________ Xen-devel mailing list Xen-devel@lists.xen.org http://lists.xen.org/xen-devel
Mats Petersson
2012-Dec-05 11:54 UTC
Re: Suggestion: Improve hypercall Interface to get real return value
On 05/12/12 11:05, George Dunlap wrote:> On Wed, Dec 5, 2012 at 6:21 AM, Yanzhang Li <liyz@pku.edu.cn > <mailto:liyz@pku.edu.cn>> wrote: > > > > Do you think this would be a good modification? > Also, I am curious why the original design didn''t do that. Is it a > bug or is it designed that way intentionally? > Any suggestions and comments will be highly appreciated. > > > The reason we just return -1 is because that is the standard practice > for Unix system libraries: to return -1 but set the error value in > "errno". I couldn''t tell you why Unix does this, but there''s an > advantage to following standard interfaces, because it reduces the > surprise factor, and reduces the amount of information programmers > need to keep in their head.I think returning -1 instead of "the error" allows for simpler code when you do something like this: int func() { FILE *f = fopen(...); if(!f) return -1; while(...) { if (fread(f, ...) < 0) { fclose(f); return -1; } ... if (...) if (fwrite(f, ...) < 0) { fclose(f); return -1; } } fclose(f); return 0; } Now, we don''t need extra code to "remember the errno from the failing function". [And I''m assuming here that fclose isn''t "interfering" with the errno - if you REALLY need to know for sure what the errno was at fread or fwrite, you still need to "remember errno". (Note that some functions do not return -1 for failure in the above code, but for example NULL, and some function would not be able to return -errno, as that may well be a "valid" return value - so keeping the interface as alike as possible is a good idea) -- Mats> > -George
Yanzhang Li
2012-Dec-08 06:44 UTC
Re: Suggestion: Improve hypercall Interface to get real return value
Dear George, Thank you very much for your comments. That really helps a lot. Best Regards, Yanzhang Li ----- Original Message ----- From: "George Dunlap" <dunlapg@umich.edu> To: "Yanzhang Li" <liyz@pku.edu.cn> Cc: xen-devel@lists.xen.org Sent: un5efine5 7:05:32 PM Subject: Re: [Xen-devel] Suggestion: Improve hypercall Interface to get real return value On Wed, Dec 5, 2012 at 6:21 AM, Yanzhang Li < liyz@pku.edu.cn > wrote: Do you think this would be a good modification? Also, I am curious why the original design didn't do that. Is it a bug or is it designed that way intentionally? Any suggestions and comments will be highly appreciated. The reason we just return -1 is because that is the standard practice for Unix system libraries: to return -1 but set the error value in "errno". I couldn't tell you why Unix does this, but there's an advantage to following standard interfaces, because it reduces the surprise factor, and reduces the amount of information programmers need to keep in their head. -George _______________________________________________ Xen-devel mailing list Xen-devel@lists.xen.org http://lists.xen.org/xen-devel