Commit 86c01959 authored by Linus Torvalds's avatar Linus Torvalds
Browse files

Merge tag 'for-linus-6.15a-rc6-tag' of git://git.kernel.org/pub/scm/linux/kernel/git/xen/tip

Pull xen fixes from Juergen Gross:

 - A fix for the xenbus driver allowing to use a PVH Dom0 with
   Xenstore running in another domain

 - A fix for the xenbus driver addressing a rare race condition
   resulting in NULL dereferences and other problems

 - A fix for the xen-swiotlb driver fixing a problem seen on Arm
   platforms

* tag 'for-linus-6.15a-rc6-tag' of git://git.kernel.org/pub/scm/linux/kernel/git/xen/tip:
  xenbus: Use kref to track req lifetime
  xenbus: Allow PVH dom0 a non-local xenstore
  xen: swiotlb: Use swiotlb bouncing if kmalloc allocation demands it
parents acbf2352 1f0304df
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -217,6 +217,7 @@ static dma_addr_t xen_swiotlb_map_page(struct device *dev, struct page *page,
	 * buffering it.
	 */
	if (dma_capable(dev, dev_addr, size, true) &&
	    !dma_kmalloc_needs_bounce(dev, size, dir) &&
	    !range_straddles_page_boundary(phys, size) &&
		!xen_arch_need_swiotlb(dev, phys, dev_addr) &&
		!is_swiotlb_force_bounce(dev))
+2 −0
Original line number Diff line number Diff line
@@ -77,6 +77,7 @@ enum xb_req_state {
struct xb_req_data {
	struct list_head list;
	wait_queue_head_t wq;
	struct kref kref;
	struct xsd_sockmsg msg;
	uint32_t caller_req_id;
	enum xsd_sockmsg_type type;
@@ -103,6 +104,7 @@ int xb_init_comms(void);
void xb_deinit_comms(void);
int xs_watch_msg(struct xs_watch_event *event);
void xs_request_exit(struct xb_req_data *req);
void xs_free_req(struct kref *kref);

int xenbus_match(struct device *_dev, const struct device_driver *_drv);
int xenbus_dev_probe(struct device *_dev);
+4 −5
Original line number Diff line number Diff line
@@ -309,8 +309,8 @@ static int process_msg(void)
			virt_wmb();
			req->state = xb_req_state_got_reply;
			req->cb(req);
		} else
			kfree(req);
		}
		kref_put(&req->kref, xs_free_req);
	}

	mutex_unlock(&xs_response_mutex);
@@ -386,14 +386,13 @@ static int process_writes(void)
	state.req->msg.type = XS_ERROR;
	state.req->err = err;
	list_del(&state.req->list);
	if (state.req->state == xb_req_state_aborted)
		kfree(state.req);
	else {
	if (state.req->state != xb_req_state_aborted) {
		/* write err, then update state */
		virt_wmb();
		state.req->state = xb_req_state_got_reply;
		wake_up(&state.req->wq);
	}
	kref_put(&state.req->kref, xs_free_req);

	mutex_unlock(&xb_write_mutex);

+1 −1
Original line number Diff line number Diff line
@@ -406,7 +406,7 @@ void xenbus_dev_queue_reply(struct xb_req_data *req)
	mutex_unlock(&u->reply_mutex);

	kfree(req->body);
	kfree(req);
	kref_put(&req->kref, xs_free_req);

	kref_put(&u->kref, xenbus_file_free);

+8 −6
Original line number Diff line number Diff line
@@ -966,9 +966,15 @@ static int __init xenbus_init(void)
	if (xen_pv_domain())
		xen_store_domain_type = XS_PV;
	if (xen_hvm_domain())
	{
		xen_store_domain_type = XS_HVM;
	if (xen_hvm_domain() && xen_initial_domain())
		err = hvm_get_parameter(HVM_PARAM_STORE_EVTCHN, &v);
		if (err)
			goto out_error;
		xen_store_evtchn = (int)v;
		if (!v && xen_initial_domain())
			xen_store_domain_type = XS_LOCAL;
	}
	if (xen_pv_domain() && !xen_start_info->store_evtchn)
		xen_store_domain_type = XS_LOCAL;
	if (xen_pv_domain() && xen_start_info->store_evtchn)
@@ -987,10 +993,6 @@ static int __init xenbus_init(void)
		xen_store_interface = gfn_to_virt(xen_store_gfn);
		break;
	case XS_HVM:
		err = hvm_get_parameter(HVM_PARAM_STORE_EVTCHN, &v);
		if (err)
			goto out_error;
		xen_store_evtchn = (int)v;
		err = hvm_get_parameter(HVM_PARAM_STORE_PFN, &v);
		if (err)
			goto out_error;
Loading