s390/cio: Use generalized CCW handler in cp_init()
authorEric Farman <farman@linux.ibm.com>
Thu, 6 Jun 2019 20:28:26 +0000 (22:28 +0200)
committerCornelia Huck <cohuck@redhat.com>
Mon, 17 Jun 2019 11:29:33 +0000 (13:29 +0200)
It is now pretty apparent that ccwchain_handle_ccw()
(nee ccwchain_handle_tic()) does everything that cp_init()
wants to do.

Let's remove that duplicated code from cp_init() and let
ccwchain_handle_ccw() handle it itself.

Signed-off-by: Eric Farman <farman@linux.ibm.com>
Reviewed-by: Cornelia Huck <cohuck@redhat.com>
Message-Id: <20190606202831.44135-5-farman@linux.ibm.com>
Signed-off-by: Cornelia Huck <cohuck@redhat.com>
drivers/s390/cio/vfio_ccw_cp.c

index 52735cdb0270c1b223f7dcf0a8df674c97756e3f..5b98bea433b79ac2b33c7f8434c86b87e0b6c3cf 100644 (file)
@@ -744,9 +744,7 @@ static int ccwchain_fetch_one(struct ccwchain *chain,
  */
 int cp_init(struct channel_program *cp, struct device *mdev, union orb *orb)
 {
-       u64 iova = orb->cmd.cpa;
-       struct ccwchain *chain;
-       int len, ret;
+       int ret;
 
        /*
         * XXX:
@@ -759,28 +757,11 @@ int cp_init(struct channel_program *cp, struct device *mdev, union orb *orb)
        memcpy(&cp->orb, orb, sizeof(*orb));
        cp->mdev = mdev;
 
-       /* Get chain length. */
-       len = ccwchain_calc_length(iova, cp);
-       if (len < 0)
-               return len;
-
-       /* Alloc mem for the head chain. */
-       chain = ccwchain_alloc(cp, len);
-       if (!chain)
-               return -ENOMEM;
-       chain->ch_iova = iova;
-
-       /* Copy the head chain from guest. */
-       ret = copy_ccw_from_iova(cp, chain->ch_ccw, iova, len);
-       if (ret) {
-               ccwchain_free(chain);
-               return ret;
-       }
-
-       /* Now loop for its TICs. */
-       ret = ccwchain_loop_tic(chain, cp);
+       /* Build a ccwchain for the first CCW segment */
+       ret = ccwchain_handle_ccw(orb->cmd.cpa, cp);
        if (ret)
                cp_free(cp);
+
        /* It is safe to force: if not set but idals used
         * ccwchain_calc_length returns an error.
         */