aboutsummaryrefslogtreecommitdiffstats
path: root/xen/common/event_channel.c
diff options
context:
space:
mode:
Diffstat (limited to 'xen/common/event_channel.c')
-rw-r--r--xen/common/event_channel.c29
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;