Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7f581d03 authored by Martin Schwidefsky's avatar Martin Schwidefsky
Browse files

Merge tag 'vfio-ccw-20171016' of...

Merge tag 'vfio-ccw-20171016' of git://git.kernel.org/pub/scm/linux/kernel/git/kvms390/vfio-ccw into features

Pull vfio-ccw update from Cornelia Huck:
"Some improvements in data handling for vfio-ccw."
parents fe3af625 4cebc5d6
Loading
Loading
Loading
Loading
+17 −5
Original line number Diff line number Diff line
@@ -105,7 +105,10 @@ static int pfn_array_alloc_pin(struct pfn_array *pa, struct device *mdev,
{
	int ret = 0;

	if (!len || pa->pa_nr)
	if (!len)
		return 0;

	if (pa->pa_nr)
		return -EINVAL;

	pa->pa_iova = iova;
@@ -501,6 +504,16 @@ static int ccwchain_fetch_direct(struct ccwchain *chain,

	ccw = chain->ch_ccw + idx;

	if (!ccw->count) {
		/*
		 * We just want the translation result of any direct ccw
		 * to be an IDA ccw, so let's add the IDA flag for it.
		 * Although the flag will be ignored by firmware.
		 */
		ccw->flags |= CCW_FLAG_IDA;
		return 0;
	}

	/*
	 * Pin data page(s) in memory.
	 * The number of pages actually is the count of the idaws which will be
@@ -541,6 +554,9 @@ static int ccwchain_fetch_idal(struct ccwchain *chain,

	ccw = chain->ch_ccw + idx;

	if (!ccw->count)
		return 0;

	/* Calculate size of idaws. */
	ret = copy_from_iova(cp->mdev, &idaw_iova, ccw->cda, sizeof(idaw_iova));
	if (ret)
@@ -569,10 +585,6 @@ static int ccwchain_fetch_idal(struct ccwchain *chain,

	for (i = 0; i < idaw_nr; i++) {
		idaw_iova = *(idaws + i);
		if (IS_ERR_VALUE(idaw_iova)) {
			ret = -EFAULT;
			goto out_free_idaws;
		}

		ret = pfn_array_alloc_pin(pat->pat_pa + i, cp->mdev,
					  idaw_iova, 1);