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

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
...@@ -105,7 +105,10 @@ static int pfn_array_alloc_pin(struct pfn_array *pa, struct device *mdev, ...@@ -105,7 +105,10 @@ static int pfn_array_alloc_pin(struct pfn_array *pa, struct device *mdev,
{ {
int ret = 0; int ret = 0;
if (!len || pa->pa_nr) if (!len)
return 0;
if (pa->pa_nr)
return -EINVAL; return -EINVAL;
pa->pa_iova = iova; pa->pa_iova = iova;
...@@ -501,6 +504,16 @@ static int ccwchain_fetch_direct(struct ccwchain *chain, ...@@ -501,6 +504,16 @@ static int ccwchain_fetch_direct(struct ccwchain *chain,
ccw = chain->ch_ccw + idx; 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. * Pin data page(s) in memory.
* The number of pages actually is the count of the idaws which will be * 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, ...@@ -541,6 +554,9 @@ static int ccwchain_fetch_idal(struct ccwchain *chain,
ccw = chain->ch_ccw + idx; ccw = chain->ch_ccw + idx;
if (!ccw->count)
return 0;
/* Calculate size of idaws. */ /* Calculate size of idaws. */
ret = copy_from_iova(cp->mdev, &idaw_iova, ccw->cda, sizeof(idaw_iova)); ret = copy_from_iova(cp->mdev, &idaw_iova, ccw->cda, sizeof(idaw_iova));
if (ret) if (ret)
...@@ -569,10 +585,6 @@ static int ccwchain_fetch_idal(struct ccwchain *chain, ...@@ -569,10 +585,6 @@ static int ccwchain_fetch_idal(struct ccwchain *chain,
for (i = 0; i < idaw_nr; i++) { for (i = 0; i < idaw_nr; i++) {
idaw_iova = *(idaws + 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, ret = pfn_array_alloc_pin(pat->pat_pa + i, cp->mdev,
idaw_iova, 1); idaw_iova, 1);
......
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