diff options
Diffstat (limited to 'xen/common')
-rw-r--r-- | xen/common/event_channel.c | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/xen/common/event_channel.c b/xen/common/event_channel.c index 87bca94087..340bf32583 100644 --- a/xen/common/event_channel.c +++ b/xen/common/event_channel.c @@ -955,6 +955,27 @@ out: return rc; } +static long evtchn_set_priority(const struct evtchn_set_priority *set_priority) +{ + struct domain *d = current->domain; + unsigned int port = set_priority->port; + long ret; + + spin_lock(&d->event_lock); + + if ( !port_is_valid(d, port) ) + { + spin_unlock(&d->event_lock); + return -EINVAL; + } + + ret = evtchn_port_set_priority(d, evtchn_from_port(d, port), + set_priority->priority); + + spin_unlock(&d->event_lock); + + return ret; +} long do_event_channel_op(int cmd, XEN_GUEST_HANDLE_PARAM(void) arg) { @@ -1064,6 +1085,14 @@ long do_event_channel_op(int cmd, XEN_GUEST_HANDLE_PARAM(void) arg) break; } + case EVTCHNOP_set_priority: { + struct evtchn_set_priority set_priority; + if ( copy_from_guest(&set_priority, arg, 1) != 0 ) + return -EFAULT; + rc = evtchn_set_priority(&set_priority); + break; + } + default: rc = -ENOSYS; break; |