s390/cio: Squash cp_free() and cp_unpin_free()
authorEric Farman <farman@linux.ibm.com>
Thu, 6 Jun 2019 20:28:23 +0000 (22:28 +0200)
committerCornelia Huck <cohuck@redhat.com>
Mon, 17 Jun 2019 11:28:29 +0000 (13:28 +0200)
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: Eric Farman <farman@linux.ibm.com>
Reviewed-by: Cornelia Huck <cohuck@redhat.com>
Message-Id: <20190606202831.44135-2-farman@linux.ibm.com>
Signed-off-by: Cornelia Huck <cohuck@redhat.com>
drivers/s390/cio/vfio_ccw_cp.c

index f73cfcfdd0329dd17e1ad618d2d4e3db985ae481..47cd7f94f42ff1184879a0596bfec803ec3c60f1 100644 (file)
@@ -412,23 +412,6 @@ static void ccwchain_cda_free(struct ccwchain *chain, int idx)
        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.
  * @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)
        /* Now loop for its TICs. */
        ret = ccwchain_loop_tic(chain, cp);
        if (ret)
-               cp_unpin_free(cp);
+               cp_free(cp);
        /* It is safe to force: if not set but idals used
         * ccwchain_calc_length returns an error.
         */
@@ -819,8 +802,21 @@ int cp_init(struct channel_program *cp, struct device *mdev, union orb *orb)
  */
 void cp_free(struct channel_program *cp)
 {
-       if (cp->initialized)
-               cp_unpin_free(cp);
+       struct ccwchain *chain, *temp;
+       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);
+       }
 }
 
 /**