Skip to content

Commit

Permalink
vfio-ccw: Rearrange IDAL allocation in direct CCW
Browse files Browse the repository at this point in the history
This is purely deck furniture, to help understand the merge of the
direct and indirect handlers.

Signed-off-by: Eric Farman <farman@linux.ibm.com>
Reviewed-by: Cornelia Huck <cohuck@redhat.com>
Message-Id: <20190606202831.44135-9-farman@linux.ibm.com>
Signed-off-by: Cornelia Huck <cohuck@redhat.com>
  • Loading branch information
Eric Farman authored and Cornelia Huck committed Jun 17, 2019
1 parent e7eaf91 commit e8573b3
Showing 1 changed file with 15 additions and 10 deletions.
25 changes: 15 additions & 10 deletions drivers/s390/cio/vfio_ccw_cp.c
Original file line number Diff line number Diff line change
Expand Up @@ -537,13 +537,21 @@ static int ccwchain_fetch_direct(struct ccwchain *chain,
unsigned long *idaws;
int ret;
int bytes = 1;
int idaw_nr = 1;
int idaw_nr;

ccw = chain->ch_ccw + idx;

if (ccw->count) {
if (ccw->count)
bytes = ccw->count;
idaw_nr = idal_nr_words((void *)(u64)ccw->cda, ccw->count);

/* Calculate size of IDAL */
idaw_nr = idal_nr_words((void *)(u64)ccw->cda, bytes);

/* Allocate an IDAL from host storage */
idaws = kcalloc(idaw_nr, sizeof(*idaws), GFP_DMA | GFP_KERNEL);
if (!idaws) {
ret = -ENOMEM;
goto out_init;
}

/*
Expand All @@ -554,7 +562,7 @@ static int ccwchain_fetch_direct(struct ccwchain *chain,
pa = chain->ch_pa + idx;
ret = pfn_array_alloc(pa, ccw->cda, bytes);
if (ret < 0)
goto out_unpin;
goto out_free_idaws;

if (ccw_does_data_transfer(ccw)) {
ret = pfn_array_pin(pa, cp->mdev);
Expand All @@ -564,21 +572,18 @@ static int ccwchain_fetch_direct(struct ccwchain *chain,
pa->pa_nr = 0;
}

/* Translate this direct ccw to a idal ccw. */
idaws = kcalloc(idaw_nr, sizeof(*idaws), GFP_DMA | GFP_KERNEL);
if (!idaws) {
ret = -ENOMEM;
goto out_unpin;
}
ccw->cda = (__u32) virt_to_phys(idaws);
ccw->flags |= CCW_FLAG_IDA;

/* Populate the IDAL with pinned/translated addresses from pfn */
pfn_array_idal_create_words(pa, idaws);

return 0;

out_unpin:
pfn_array_unpin_free(pa, cp->mdev);
out_free_idaws:
kfree(idaws);
out_init:
ccw->cda = 0;
return ret;
Expand Down

0 comments on commit e8573b3

Please sign in to comment.