Commit 383378d1 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'for-linus-4.10-rc2-tag' of git://git.kernel.org/pub/scm/linux/kernel/git/xen/tip

Pull xen fixes and cleanups from Juergen Gross:

 - small fixes for xenbus driver

 - one fix for xen dom0 boot on huge system

 - small cleanups

* tag 'for-linus-4.10-rc2-tag' of git://git.kernel.org/pub/scm/linux/kernel/git/xen/tip:
  Xen: ARM: Zero reserved fields of xatp before making hypervisor call
  xen: events: Replace BUG() with BUG_ON()
  xen: remove stale xs_input_avail() from header
  xen: return xenstore command failures via response instead of rc
  xen: xenbus driver must not accept invalid transaction ids
  xen/evtchn: use rb_entry()
  xen/setup: Don't relocate p2m over existing one
parents 9e3596b0 0b47a6bd
...@@ -713,10 +713,9 @@ static void __init xen_reserve_xen_mfnlist(void) ...@@ -713,10 +713,9 @@ static void __init xen_reserve_xen_mfnlist(void)
size = PFN_PHYS(xen_start_info->nr_p2m_frames); size = PFN_PHYS(xen_start_info->nr_p2m_frames);
} }
if (!xen_is_e820_reserved(start, size)) { memblock_reserve(start, size);
memblock_reserve(start, size); if (!xen_is_e820_reserved(start, size))
return; return;
}
#ifdef CONFIG_X86_32 #ifdef CONFIG_X86_32
/* /*
...@@ -727,6 +726,7 @@ static void __init xen_reserve_xen_mfnlist(void) ...@@ -727,6 +726,7 @@ static void __init xen_reserve_xen_mfnlist(void)
BUG(); BUG();
#else #else
xen_relocate_p2m(); xen_relocate_p2m();
memblock_free(start, size);
#endif #endif
} }
......
...@@ -58,9 +58,13 @@ static int xen_map_device_mmio(const struct resource *resources, ...@@ -58,9 +58,13 @@ static int xen_map_device_mmio(const struct resource *resources,
xen_pfn_t *gpfns; xen_pfn_t *gpfns;
xen_ulong_t *idxs; xen_ulong_t *idxs;
int *errs; int *errs;
struct xen_add_to_physmap_range xatp;
for (i = 0; i < count; i++) { for (i = 0; i < count; i++) {
struct xen_add_to_physmap_range xatp = {
.domid = DOMID_SELF,
.space = XENMAPSPACE_dev_mmio
};
r = &resources[i]; r = &resources[i];
nr = DIV_ROUND_UP(resource_size(r), XEN_PAGE_SIZE); nr = DIV_ROUND_UP(resource_size(r), XEN_PAGE_SIZE);
if ((resource_type(r) != IORESOURCE_MEM) || (nr == 0)) if ((resource_type(r) != IORESOURCE_MEM) || (nr == 0))
...@@ -87,9 +91,7 @@ static int xen_map_device_mmio(const struct resource *resources, ...@@ -87,9 +91,7 @@ static int xen_map_device_mmio(const struct resource *resources,
idxs[j] = XEN_PFN_DOWN(r->start) + j; idxs[j] = XEN_PFN_DOWN(r->start) + j;
} }
xatp.domid = DOMID_SELF;
xatp.size = nr; xatp.size = nr;
xatp.space = XENMAPSPACE_dev_mmio;
set_xen_guest_handle(xatp.gpfns, gpfns); set_xen_guest_handle(xatp.gpfns, gpfns);
set_xen_guest_handle(xatp.idxs, idxs); set_xen_guest_handle(xatp.idxs, idxs);
......
...@@ -369,8 +369,7 @@ static void evtchn_fifo_resume(void) ...@@ -369,8 +369,7 @@ static void evtchn_fifo_resume(void)
} }
ret = init_control_block(cpu, control_block); ret = init_control_block(cpu, control_block);
if (ret < 0) BUG_ON(ret < 0);
BUG();
} }
/* /*
......
...@@ -125,7 +125,7 @@ static int add_evtchn(struct per_user_data *u, struct user_evtchn *evtchn) ...@@ -125,7 +125,7 @@ static int add_evtchn(struct per_user_data *u, struct user_evtchn *evtchn)
while (*new) { while (*new) {
struct user_evtchn *this; struct user_evtchn *this;
this = container_of(*new, struct user_evtchn, node); this = rb_entry(*new, struct user_evtchn, node);
parent = *new; parent = *new;
if (this->port < evtchn->port) if (this->port < evtchn->port)
...@@ -157,7 +157,7 @@ static struct user_evtchn *find_evtchn(struct per_user_data *u, unsigned port) ...@@ -157,7 +157,7 @@ static struct user_evtchn *find_evtchn(struct per_user_data *u, unsigned port)
while (node) { while (node) {
struct user_evtchn *evtchn; struct user_evtchn *evtchn;
evtchn = container_of(node, struct user_evtchn, node); evtchn = rb_entry(node, struct user_evtchn, node);
if (evtchn->port < port) if (evtchn->port < port)
node = node->rb_left; node = node->rb_left;
......
...@@ -42,7 +42,6 @@ int xb_write(const void *data, unsigned len); ...@@ -42,7 +42,6 @@ int xb_write(const void *data, unsigned len);
int xb_read(void *data, unsigned len); int xb_read(void *data, unsigned len);
int xb_data_to_read(void); int xb_data_to_read(void);
int xb_wait_for_data_to_read(void); int xb_wait_for_data_to_read(void);
int xs_input_avail(void);
extern struct xenstore_domain_interface *xen_store_interface; extern struct xenstore_domain_interface *xen_store_interface;
extern int xen_store_evtchn; extern int xen_store_evtchn;
extern enum xenstore_init xen_store_domain_type; extern enum xenstore_init xen_store_domain_type;
......
...@@ -302,6 +302,29 @@ static void watch_fired(struct xenbus_watch *watch, ...@@ -302,6 +302,29 @@ static void watch_fired(struct xenbus_watch *watch,
mutex_unlock(&adap->dev_data->reply_mutex); mutex_unlock(&adap->dev_data->reply_mutex);
} }
static int xenbus_command_reply(struct xenbus_file_priv *u,
unsigned int msg_type, const char *reply)
{
struct {
struct xsd_sockmsg hdr;
const char body[16];
} msg;
int rc;
msg.hdr = u->u.msg;
msg.hdr.type = msg_type;
msg.hdr.len = strlen(reply) + 1;
if (msg.hdr.len > sizeof(msg.body))
return -E2BIG;
mutex_lock(&u->reply_mutex);
rc = queue_reply(&u->read_buffers, &msg, sizeof(msg.hdr) + msg.hdr.len);
wake_up(&u->read_waitq);
mutex_unlock(&u->reply_mutex);
return rc;
}
static int xenbus_write_transaction(unsigned msg_type, static int xenbus_write_transaction(unsigned msg_type,
struct xenbus_file_priv *u) struct xenbus_file_priv *u)
{ {
...@@ -316,12 +339,12 @@ static int xenbus_write_transaction(unsigned msg_type, ...@@ -316,12 +339,12 @@ static int xenbus_write_transaction(unsigned msg_type,
rc = -ENOMEM; rc = -ENOMEM;
goto out; goto out;
} }
} else if (msg_type == XS_TRANSACTION_END) { } else if (u->u.msg.tx_id != 0) {
list_for_each_entry(trans, &u->transactions, list) list_for_each_entry(trans, &u->transactions, list)
if (trans->handle.id == u->u.msg.tx_id) if (trans->handle.id == u->u.msg.tx_id)
break; break;
if (&trans->list == &u->transactions) if (&trans->list == &u->transactions)
return -ESRCH; return xenbus_command_reply(u, XS_ERROR, "ENOENT");
} }
reply = xenbus_dev_request_and_reply(&u->u.msg); reply = xenbus_dev_request_and_reply(&u->u.msg);
...@@ -372,12 +395,12 @@ static int xenbus_write_watch(unsigned msg_type, struct xenbus_file_priv *u) ...@@ -372,12 +395,12 @@ static int xenbus_write_watch(unsigned msg_type, struct xenbus_file_priv *u)
path = u->u.buffer + sizeof(u->u.msg); path = u->u.buffer + sizeof(u->u.msg);
token = memchr(path, 0, u->u.msg.len); token = memchr(path, 0, u->u.msg.len);
if (token == NULL) { if (token == NULL) {
rc = -EILSEQ; rc = xenbus_command_reply(u, XS_ERROR, "EINVAL");
goto out; goto out;
} }
token++; token++;
if (memchr(token, 0, u->u.msg.len - (token - path)) == NULL) { if (memchr(token, 0, u->u.msg.len - (token - path)) == NULL) {
rc = -EILSEQ; rc = xenbus_command_reply(u, XS_ERROR, "EINVAL");
goto out; goto out;
} }
...@@ -411,23 +434,7 @@ static int xenbus_write_watch(unsigned msg_type, struct xenbus_file_priv *u) ...@@ -411,23 +434,7 @@ static int xenbus_write_watch(unsigned msg_type, struct xenbus_file_priv *u)
} }
/* Success. Synthesize a reply to say all is OK. */ /* Success. Synthesize a reply to say all is OK. */
{ rc = xenbus_command_reply(u, msg_type, "OK");
struct {
struct xsd_sockmsg hdr;
char body[3];
} __packed reply = {
{
.type = msg_type,
.len = sizeof(reply.body)
},
"OK"
};
mutex_lock(&u->reply_mutex);
rc = queue_reply(&u->read_buffers, &reply, sizeof(reply));
wake_up(&u->read_waitq);
mutex_unlock(&u->reply_mutex);
}
out: out:
return rc; return rc;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment