Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drivers/vfio: Support EEH error injection

The patch adds one more EEH sub-command (VFIO_EEH_PE_INJECT_ERR)
to inject the specified EEH error, which is represented by
(struct vfio_eeh_pe_err), to the indicated PE for testing purpose.

Signed-off-by: Gavin Shan <gwshan@linux.vnet.ibm.com>
Reviewed-by: David Gibson <david@gibson.dropbear.id.au>
Acked-by: Alex Williamson <alex.williamson@redhat.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>

authored by

Gavin Shan and committed by
Michael Ellerman
68cbbc3a ec33d36e

+35 -1
+12
Documentation/vfio.txt
··· 385 385 386 386 .... 387 387 388 + /* Inject EEH error, which is expected to be caused by 32-bits 389 + * config load. 390 + */ 391 + pe_op.op = VFIO_EEH_PE_INJECT_ERR; 392 + pe_op.err.type = EEH_ERR_TYPE_32; 393 + pe_op.err.func = EEH_ERR_FUNC_LD_CFG_ADDR; 394 + pe_op.err.addr = 0ul; 395 + pe_op.err.mask = 0ul; 396 + ioctl(container, VFIO_EEH_PE_OP, &pe_op); 397 + 398 + .... 399 + 388 400 /* When 0xFF's returned from reading PCI config space or IO BARs 389 401 * of the PCI device. Check the PE's state to see if that has been 390 402 * frozen.
+10
drivers/vfio/vfio_spapr_eeh.c
··· 85 85 case VFIO_EEH_PE_CONFIGURE: 86 86 ret = eeh_pe_configure(pe); 87 87 break; 88 + case VFIO_EEH_PE_INJECT_ERR: 89 + minsz = offsetofend(struct vfio_eeh_pe_op, err.mask); 90 + if (op.argsz < minsz) 91 + return -EINVAL; 92 + if (copy_from_user(&op, (void __user *)arg, minsz)) 93 + return -EFAULT; 94 + 95 + ret = eeh_pe_inject_err(pe, op.err.type, op.err.func, 96 + op.err.addr, op.err.mask); 97 + break; 88 98 default: 89 99 ret = -EINVAL; 90 100 }
+13 -1
include/uapi/linux/vfio.h
··· 470 470 * - unfreeze IO/DMA for frozen PE; 471 471 * - read PE state; 472 472 * - reset PE; 473 - * - configure PE. 473 + * - configure PE; 474 + * - inject EEH error. 474 475 */ 476 + struct vfio_eeh_pe_err { 477 + __u32 type; 478 + __u32 func; 479 + __u64 addr; 480 + __u64 mask; 481 + }; 482 + 475 483 struct vfio_eeh_pe_op { 476 484 __u32 argsz; 477 485 __u32 flags; 478 486 __u32 op; 487 + union { 488 + struct vfio_eeh_pe_err err; 489 + }; 479 490 }; 480 491 481 492 #define VFIO_EEH_PE_DISABLE 0 /* Disable EEH functionality */ ··· 503 492 #define VFIO_EEH_PE_RESET_HOT 6 /* Assert hot reset */ 504 493 #define VFIO_EEH_PE_RESET_FUNDAMENTAL 7 /* Assert fundamental reset */ 505 494 #define VFIO_EEH_PE_CONFIGURE 8 /* PE configuration */ 495 + #define VFIO_EEH_PE_INJECT_ERR 9 /* Inject EEH error */ 506 496 507 497 #define VFIO_EEH_PE_OP _IO(VFIO_TYPE, VFIO_BASE + 21) 508 498