[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH] libxl: create control/sysrq xenstore node



Wei Liu <wei.liu2@xxxxxxxxxx> writes:

> On Tue, Sep 04, 2018 at 01:39:29PM +0200, Vitaly Kuznetsov wrote:
>> 'xl sysrq' command doesn't work with modern Linux guests with the following
>> message in guest's log:
>> 
>>  xen:manage: sysrq_handler: Error -13 writing sysrq in control/sysrq
>> 
>> xenstore trace confirms:
>> 
>>  IN 0x24bd9a0 20180904 04:36:32 WRITE (control/sysrq )
>>  OUT 0x24bd9a0 20180904 04:36:32 ERROR (EACCES )
>> 
>> The problem seems to be in the fact that we don't pre-create control/sysrq
>> xenstore node and libxl_send_sysrq() doing libxl__xs_printf() creates it as
>> read-only. As we want to allow guests to clean 'control/sysrq' after the
>> requested action is performed, we need to make this node writable.
>> 
>> Signed-off-by: Vitaly Kuznetsov <vkuznets@xxxxxxxxxx>
>
> Hmm... this node isn't documented.
>

But libxl already writes it, see libxl_send_sysrq().

> Can you point me to the code in Linux?
>

Sure,

drivers/xen/manage.c:

static void sysrq_handler(struct xenbus_watch *watch, const char *path,
                          const char *token)
{
        char sysrq_key = '\0';
        struct xenbus_transaction xbt;
        int err;

 again:
        err = xenbus_transaction_start(&xbt);
        if (err)
                return;
        err = xenbus_scanf(xbt, "control", "sysrq", "%c", &sysrq_key);
        if (err < 0) {
                /*
                 * The Xenstore watch fires directly after registering it and
                 * after a suspend/resume cycle. So ENOENT is no error but
                 * might happen in those cases.
                 */
                if (err != -ENOENT)
                        pr_err("Error %d reading sysrq code in control/sysrq\n",
                               err);
                xenbus_transaction_end(xbt, 1);
                return;
        }

        if (sysrq_key != '\0') {
                err = xenbus_printf(xbt, "control", "sysrq", "%c", '\0');
                if (err) {
                        pr_err("%s: Error %d writing sysrq in control/sysrq\n",
                               __func__, err);
                        xenbus_transaction_end(xbt, 1);
                        return;
                }
        }

        err = xenbus_transaction_end(xbt, 0);
        if (err == -EAGAIN)
                goto again;

        if (sysrq_key != '\0')
                handle_sysrq(sysrq_key);
}

static struct xenbus_watch sysrq_watch = {
        .node = "control/sysrq",
        .callback = sysrq_handler
};


-- 
  Vitaly

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.