Commit 812271b9 authored by Eric Farman's avatar Eric Farman Committed by Cornelia Huck

s390/cio: Squash cp_free() and cp_unpin_free()

The routine cp_free() does nothing but call cp_unpin_free(), and while
most places call cp_free() there is one caller of cp_unpin_free() used
when the cp is guaranteed to have not been marked initialized.

This seems like a dubious way to make a distinction, so let's combine
these routines and make cp_free() do all the work.
Signed-off-by: default avatarEric Farman <farman@linux.ibm.com>
Reviewed-by: default avatarCornelia Huck <cohuck@redhat.com>
Message-Id: <20190606202831.44135-2-farman@linux.ibm.com>
Signed-off-by: default avatarCornelia Huck <cohuck@redhat.com>
parent 39c00378
...@@ -412,23 +412,6 @@ static void ccwchain_cda_free(struct ccwchain *chain, int idx) ...@@ -412,23 +412,6 @@ static void ccwchain_cda_free(struct ccwchain *chain, int idx)
kfree((void *)(u64)ccw->cda); kfree((void *)(u64)ccw->cda);
} }
/* Unpin the pages then free the memory resources. */
static void cp_unpin_free(struct channel_program *cp)
{
struct ccwchain *chain, *temp;
int i;
cp->initialized = false;
list_for_each_entry_safe(chain, temp, &cp->ccwchain_list, next) {
for (i = 0; i < chain->ch_len; i++) {
pfn_array_table_unpin_free(chain->ch_pat + i,
cp->mdev);
ccwchain_cda_free(chain, i);
}
ccwchain_free(chain);
}
}
/** /**
* ccwchain_calc_length - calculate the length of the ccw chain. * ccwchain_calc_length - calculate the length of the ccw chain.
* @iova: guest physical address of the target ccw chain * @iova: guest physical address of the target ccw chain
...@@ -796,7 +779,7 @@ int cp_init(struct channel_program *cp, struct device *mdev, union orb *orb) ...@@ -796,7 +779,7 @@ int cp_init(struct channel_program *cp, struct device *mdev, union orb *orb)
/* Now loop for its TICs. */ /* Now loop for its TICs. */
ret = ccwchain_loop_tic(chain, cp); ret = ccwchain_loop_tic(chain, cp);
if (ret) if (ret)
cp_unpin_free(cp); cp_free(cp);
/* It is safe to force: if not set but idals used /* It is safe to force: if not set but idals used
* ccwchain_calc_length returns an error. * ccwchain_calc_length returns an error.
*/ */
...@@ -819,8 +802,21 @@ int cp_init(struct channel_program *cp, struct device *mdev, union orb *orb) ...@@ -819,8 +802,21 @@ int cp_init(struct channel_program *cp, struct device *mdev, union orb *orb)
*/ */
void cp_free(struct channel_program *cp) void cp_free(struct channel_program *cp)
{ {
if (cp->initialized) struct ccwchain *chain, *temp;
cp_unpin_free(cp); int i;
if (!cp->initialized)
return;
cp->initialized = false;
list_for_each_entry_safe(chain, temp, &cp->ccwchain_list, next) {
for (i = 0; i < chain->ch_len; i++) {
pfn_array_table_unpin_free(chain->ch_pat + i,
cp->mdev);
ccwchain_cda_free(chain, i);
}
ccwchain_free(chain);
}
} }
/** /**
......
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