linux_dsm_epyc7002/drivers/s390/cio
Eric Farman 48bd0eee8e s390/cio: Fix vfio-ccw handling of recursive TICs
The routine ccwchain_calc_length() is tasked with looking at a
channel program, seeing how many CCWs are chained together by
the presence of the Chain-Command flag, and returning a count
to the caller.

Previously, it also considered a Transfer-in-Channel CCW as being
an appropriate mechanism for chaining.  The problem at the time
was that the TIC CCW will almost certainly not go to the next CCW
in memory (because the CC flag would be sufficient), and so
advancing to the next 8 bytes will cause us to read potentially
invalid memory.  So that comparison was removed, and the target
of the TIC is processed as a new chain.

This is fine when a TIC goes to a new chain (consider a NOP+TIC to
a channel program that is being redriven), but there is another
scenario where this falls apart.  A TIC can be used to "rewind"
a channel program, for example to find a particular record on a
disk with various orientation CCWs.  In this case, we DO want to
consider the memory after the TIC since the TIC will be skipped
once the requested criteria is met.  This is due to the Status
Modifier presented by the device, though software doesn't need to
operate on it beyond understanding the behavior change of how the
channel program is executed.

So to handle this, we will re-introduce the check for a TIC CCW
but limit it by examining the target of the TIC.  If the TIC
doesn't go back into the current chain, then current behavior
applies; we should stop counting CCWs and let the target of the
TIC be handled as a new chain.  But, if the TIC DOES go back into
the current chain, then we need to keep looking at the memory after
the TIC for when the channel breaks out of the TIC loop.  We can't
use tic_target_chain_exists() because the chain in question hasn't
been built yet, so we will redefine that comparison with some small
functions to make it more readable and to permit refactoring later.

Fixes: 405d566f98 ("vfio-ccw: Don't assume there are more ccws after a TIC")
Signed-off-by: Eric Farman <farman@linux.ibm.com>
Message-Id: <20190222183941.29596-2-farman@linux.ibm.com>
Reviewed-by: Halil Pasic <pasic@linux.ibm.com>
Reviewed-by: Farhan Ali <alifm@linux.ibm.com>
Signed-off-by: Cornelia Huck <cohuck@redhat.com>
2019-02-26 18:30:11 +01:00
..
airq.c License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
blacklist.c License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
blacklist.h s390: add a few more SPDX identifiers 2017-12-05 07:51:09 +01:00
ccwgroup.c s390/ccwgroup: add get_ccwgroupdev_by_busid() 2018-10-08 09:09:59 +02:00
ccwreq.c License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
chp.c s390/cio: ensure that a chpid is registered only once 2018-07-17 07:27:51 +02:00
chp.h s390/chsc: query utility strings via fmt3 channel path descriptor 2018-03-26 16:13:16 +02:00
chsc_sch.c compat: Move compat_timespec/ timeval to compat_time.h 2018-04-19 13:29:54 +02:00
chsc_sch.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
chsc.c s390/chsc: fix packed-not-aligned warnings 2018-07-17 07:27:56 +02:00
chsc.h s390/chsc: fix packed-not-aligned warnings 2018-07-17 07:27:56 +02:00
cio_debug.h Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux 2017-11-13 11:47:01 -08:00
cio.c s390/css: reduce stsch calls 2018-07-17 07:27:55 +02:00
cio.h s390/css: reduce stsch calls 2018-07-17 07:27:55 +02:00
cmf.c mm: remove include/linux/bootmem.h 2018-10-31 08:54:16 -07:00
crw.c License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
css.c s390/css: reduce stsch calls 2018-07-17 07:27:55 +02:00
css.h s390/css: reduce stsch calls 2018-07-17 07:27:55 +02:00
device_fsm.c s390/cio: clear timer when terminating driver I/O 2018-02-22 10:09:27 +01:00
device_id.c License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
device_ops.c s390/cio: add helper to query utility strings per given ccw device 2018-05-23 08:06:56 +02:00
device_pgid.c License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
device_status.c License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
device.c s390/cio: fix unbind of io_subchannel_driver 2018-03-26 16:13:06 +02:00
device.h s390/cio: Convert timers to use timer_setup() 2017-11-14 11:01:36 +01:00
eadm_sch.c s390: cio: add SPDX identifiers to the remaining files 2017-11-24 14:28:41 +01:00
eadm_sch.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
fcx.c License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
idset.c License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
idset.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
io_sch.h s390/cio: fix return code after missing interrupt 2018-02-22 10:09:25 +01:00
ioasm.c s390: assume diag308 set always works 2018-04-10 07:38:59 +02:00
ioasm.h s390: assume diag308 set always works 2018-04-10 07:38:59 +02:00
isc.c s390: cio: add SPDX identifiers to the remaining files 2017-11-24 14:28:41 +01:00
itcw.c s390/cio: fix kernel-doc usage 2018-02-05 07:34:52 +01:00
Makefile vfio: ccw: add tracepoints for interesting error paths 2018-05-29 09:27:42 +02:00
orb.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
qdio_debug.c s390/drivers: fix proc/debugfs file permissions 2018-12-13 10:42:24 +01:00
qdio_debug.h Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux 2017-11-13 11:47:01 -08:00
qdio_main.c s390/qdio: clean up AOB handling 2018-09-20 13:20:29 +02:00
qdio_setup.c s390/qdio: make SBAL address array type-safe 2019-02-07 11:57:07 +01:00
qdio_thinint.c treewide: kzalloc() -> kcalloc() 2018-06-12 16:19:22 -07:00
qdio.h s390: qdio: Convert timers to use timer_setup() 2017-11-14 11:01:33 +01:00
scm.c s390: cio: add SPDX identifiers to the remaining files 2017-11-24 14:28:41 +01:00
trace.c License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
trace.h s390 cio: Rewrite trace point class s390_class_schib 2018-07-23 13:49:56 +02:00
vfio_ccw_cp.c s390/cio: Fix vfio-ccw handling of recursive TICs 2019-02-26 18:30:11 +01:00
vfio_ccw_cp.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
vfio_ccw_drv.c vfio: ccw: Register mediated device once all structures are initialized 2018-11-13 11:45:17 +01:00
vfio_ccw_fsm.c vfio: ccw: Merge BUSY and BOXED states 2018-12-12 14:53:03 +01:00
vfio_ccw_ops.c s390/cio: Convert ccw_io_region to pointer 2018-09-27 16:32:50 +02:00
vfio_ccw_private.h vfio: ccw: Merge BUSY and BOXED states 2018-12-12 14:53:03 +01:00
vfio_ccw_trace.h vfio: ccw: add tracepoints for interesting error paths 2018-05-29 09:27:42 +02:00