Commit 008a011d authored by Eric Farman's avatar Eric Farman Committed by Alex Williamson

vfio/ccw: remove private->sch

These places all rely on the ability to jump from a private
struct back to the subchannel struct. Rather than keeping a
copy in our back pocket, let's use the relationship provided
by the vfio_device embedded within the private.
Signed-off-by: default avatarEric Farman <farman@linux.ibm.com>
Reviewed-by: default avatarMatthew Rosato <mjrosato@linux.ibm.com>
Link: https://lore.kernel.org/r/20221104142007.1314999-3-farman@linux.ibm.comSigned-off-by: default avatarAlex Williamson <alex.williamson@redhat.com>
parent 9e6f07cd
...@@ -16,6 +16,7 @@ static ssize_t vfio_ccw_schib_region_read(struct vfio_ccw_private *private, ...@@ -16,6 +16,7 @@ static ssize_t vfio_ccw_schib_region_read(struct vfio_ccw_private *private,
char __user *buf, size_t count, char __user *buf, size_t count,
loff_t *ppos) loff_t *ppos)
{ {
struct subchannel *sch = to_subchannel(private->vdev.dev->parent);
unsigned int i = VFIO_CCW_OFFSET_TO_INDEX(*ppos) - VFIO_CCW_NUM_REGIONS; unsigned int i = VFIO_CCW_OFFSET_TO_INDEX(*ppos) - VFIO_CCW_NUM_REGIONS;
loff_t pos = *ppos & VFIO_CCW_OFFSET_MASK; loff_t pos = *ppos & VFIO_CCW_OFFSET_MASK;
struct ccw_schib_region *region; struct ccw_schib_region *region;
...@@ -27,12 +28,12 @@ static ssize_t vfio_ccw_schib_region_read(struct vfio_ccw_private *private, ...@@ -27,12 +28,12 @@ static ssize_t vfio_ccw_schib_region_read(struct vfio_ccw_private *private,
mutex_lock(&private->io_mutex); mutex_lock(&private->io_mutex);
region = private->region[i].data; region = private->region[i].data;
if (cio_update_schib(private->sch)) { if (cio_update_schib(sch)) {
ret = -ENODEV; ret = -ENODEV;
goto out; goto out;
} }
memcpy(region, &private->sch->schib, sizeof(*region)); memcpy(region, &sch->schib, sizeof(*region));
if (copy_to_user(buf, (void *)region + pos, count)) { if (copy_to_user(buf, (void *)region + pos, count)) {
ret = -EFAULT; ret = -EFAULT;
......
...@@ -160,7 +160,6 @@ static struct vfio_ccw_private *vfio_ccw_alloc_private(struct subchannel *sch) ...@@ -160,7 +160,6 @@ static struct vfio_ccw_private *vfio_ccw_alloc_private(struct subchannel *sch)
if (!private) if (!private)
return ERR_PTR(-ENOMEM); return ERR_PTR(-ENOMEM);
private->sch = sch;
mutex_init(&private->io_mutex); mutex_init(&private->io_mutex);
private->state = VFIO_CCW_STATE_STANDBY; private->state = VFIO_CCW_STATE_STANDBY;
INIT_LIST_HEAD(&private->crw); INIT_LIST_HEAD(&private->crw);
...@@ -395,7 +394,7 @@ static int vfio_ccw_chp_event(struct subchannel *sch, ...@@ -395,7 +394,7 @@ static int vfio_ccw_chp_event(struct subchannel *sch,
if (!private || !mask) if (!private || !mask)
return 0; return 0;
trace_vfio_ccw_chp_event(private->sch->schid, mask, event); trace_vfio_ccw_chp_event(sch->schid, mask, event);
VFIO_CCW_MSG_EVENT(2, "sch %x.%x.%04x: mask=0x%x event=%d\n", VFIO_CCW_MSG_EVENT(2, "sch %x.%x.%04x: mask=0x%x event=%d\n",
sch->schid.cssid, sch->schid.cssid,
sch->schid.ssid, sch->schid.sch_no, sch->schid.ssid, sch->schid.sch_no,
......
...@@ -18,15 +18,13 @@ ...@@ -18,15 +18,13 @@
static int fsm_io_helper(struct vfio_ccw_private *private) static int fsm_io_helper(struct vfio_ccw_private *private)
{ {
struct subchannel *sch; struct subchannel *sch = to_subchannel(private->vdev.dev->parent);
union orb *orb; union orb *orb;
int ccode; int ccode;
__u8 lpm; __u8 lpm;
unsigned long flags; unsigned long flags;
int ret; int ret;
sch = private->sch;
spin_lock_irqsave(sch->lock, flags); spin_lock_irqsave(sch->lock, flags);
orb = cp_get_orb(&private->cp, (u32)(addr_t)sch, sch->lpm); orb = cp_get_orb(&private->cp, (u32)(addr_t)sch, sch->lpm);
...@@ -80,13 +78,11 @@ static int fsm_io_helper(struct vfio_ccw_private *private) ...@@ -80,13 +78,11 @@ static int fsm_io_helper(struct vfio_ccw_private *private)
static int fsm_do_halt(struct vfio_ccw_private *private) static int fsm_do_halt(struct vfio_ccw_private *private)
{ {
struct subchannel *sch; struct subchannel *sch = to_subchannel(private->vdev.dev->parent);
unsigned long flags; unsigned long flags;
int ccode; int ccode;
int ret; int ret;
sch = private->sch;
spin_lock_irqsave(sch->lock, flags); spin_lock_irqsave(sch->lock, flags);
VFIO_CCW_TRACE_EVENT(2, "haltIO"); VFIO_CCW_TRACE_EVENT(2, "haltIO");
...@@ -121,13 +117,11 @@ static int fsm_do_halt(struct vfio_ccw_private *private) ...@@ -121,13 +117,11 @@ static int fsm_do_halt(struct vfio_ccw_private *private)
static int fsm_do_clear(struct vfio_ccw_private *private) static int fsm_do_clear(struct vfio_ccw_private *private)
{ {
struct subchannel *sch; struct subchannel *sch = to_subchannel(private->vdev.dev->parent);
unsigned long flags; unsigned long flags;
int ccode; int ccode;
int ret; int ret;
sch = private->sch;
spin_lock_irqsave(sch->lock, flags); spin_lock_irqsave(sch->lock, flags);
VFIO_CCW_TRACE_EVENT(2, "clearIO"); VFIO_CCW_TRACE_EVENT(2, "clearIO");
...@@ -160,7 +154,7 @@ static int fsm_do_clear(struct vfio_ccw_private *private) ...@@ -160,7 +154,7 @@ static int fsm_do_clear(struct vfio_ccw_private *private)
static void fsm_notoper(struct vfio_ccw_private *private, static void fsm_notoper(struct vfio_ccw_private *private,
enum vfio_ccw_event event) enum vfio_ccw_event event)
{ {
struct subchannel *sch = private->sch; struct subchannel *sch = to_subchannel(private->vdev.dev->parent);
VFIO_CCW_MSG_EVENT(2, "sch %x.%x.%04x: notoper event %x state %x\n", VFIO_CCW_MSG_EVENT(2, "sch %x.%x.%04x: notoper event %x state %x\n",
sch->schid.cssid, sch->schid.cssid,
...@@ -228,7 +222,7 @@ static void fsm_async_retry(struct vfio_ccw_private *private, ...@@ -228,7 +222,7 @@ static void fsm_async_retry(struct vfio_ccw_private *private,
static void fsm_disabled_irq(struct vfio_ccw_private *private, static void fsm_disabled_irq(struct vfio_ccw_private *private,
enum vfio_ccw_event event) enum vfio_ccw_event event)
{ {
struct subchannel *sch = private->sch; struct subchannel *sch = to_subchannel(private->vdev.dev->parent);
/* /*
* An interrupt in a disabled state means a previous disable was not * An interrupt in a disabled state means a previous disable was not
...@@ -238,7 +232,9 @@ static void fsm_disabled_irq(struct vfio_ccw_private *private, ...@@ -238,7 +232,9 @@ static void fsm_disabled_irq(struct vfio_ccw_private *private,
} }
inline struct subchannel_id get_schid(struct vfio_ccw_private *p) inline struct subchannel_id get_schid(struct vfio_ccw_private *p)
{ {
return p->sch->schid; struct subchannel *sch = to_subchannel(p->vdev.dev->parent);
return sch->schid;
} }
/* /*
...@@ -360,10 +356,11 @@ static void fsm_async_request(struct vfio_ccw_private *private, ...@@ -360,10 +356,11 @@ static void fsm_async_request(struct vfio_ccw_private *private,
static void fsm_irq(struct vfio_ccw_private *private, static void fsm_irq(struct vfio_ccw_private *private,
enum vfio_ccw_event event) enum vfio_ccw_event event)
{ {
struct subchannel *sch = to_subchannel(private->vdev.dev->parent);
struct irb *irb = this_cpu_ptr(&cio_irb); struct irb *irb = this_cpu_ptr(&cio_irb);
VFIO_CCW_TRACE_EVENT(6, "IRQ"); VFIO_CCW_TRACE_EVENT(6, "IRQ");
VFIO_CCW_TRACE_EVENT(6, dev_name(&private->sch->dev)); VFIO_CCW_TRACE_EVENT(6, dev_name(&sch->dev));
memcpy(&private->irb, irb, sizeof(*irb)); memcpy(&private->irb, irb, sizeof(*irb));
...@@ -376,7 +373,7 @@ static void fsm_irq(struct vfio_ccw_private *private, ...@@ -376,7 +373,7 @@ static void fsm_irq(struct vfio_ccw_private *private,
static void fsm_open(struct vfio_ccw_private *private, static void fsm_open(struct vfio_ccw_private *private,
enum vfio_ccw_event event) enum vfio_ccw_event event)
{ {
struct subchannel *sch = private->sch; struct subchannel *sch = to_subchannel(private->vdev.dev->parent);
int ret; int ret;
spin_lock_irq(sch->lock); spin_lock_irq(sch->lock);
...@@ -397,7 +394,7 @@ static void fsm_open(struct vfio_ccw_private *private, ...@@ -397,7 +394,7 @@ static void fsm_open(struct vfio_ccw_private *private,
static void fsm_close(struct vfio_ccw_private *private, static void fsm_close(struct vfio_ccw_private *private,
enum vfio_ccw_event event) enum vfio_ccw_event event)
{ {
struct subchannel *sch = private->sch; struct subchannel *sch = to_subchannel(private->vdev.dev->parent);
int ret; int ret;
spin_lock_irq(sch->lock); spin_lock_irq(sch->lock);
......
...@@ -68,9 +68,9 @@ static int vfio_ccw_mdev_probe(struct mdev_device *mdev) ...@@ -68,9 +68,9 @@ static int vfio_ccw_mdev_probe(struct mdev_device *mdev)
return ret; return ret;
VFIO_CCW_MSG_EVENT(2, "sch %x.%x.%04x: create\n", VFIO_CCW_MSG_EVENT(2, "sch %x.%x.%04x: create\n",
private->sch->schid.cssid, sch->schid.cssid,
private->sch->schid.ssid, sch->schid.ssid,
private->sch->schid.sch_no); sch->schid.sch_no);
ret = vfio_register_emulated_iommu_dev(&private->vdev); ret = vfio_register_emulated_iommu_dev(&private->vdev);
if (ret) if (ret)
...@@ -107,9 +107,9 @@ static void vfio_ccw_mdev_remove(struct mdev_device *mdev) ...@@ -107,9 +107,9 @@ static void vfio_ccw_mdev_remove(struct mdev_device *mdev)
struct vfio_ccw_private *private = dev_get_drvdata(&parent->dev); struct vfio_ccw_private *private = dev_get_drvdata(&parent->dev);
VFIO_CCW_MSG_EVENT(2, "sch %x.%x.%04x: remove\n", VFIO_CCW_MSG_EVENT(2, "sch %x.%x.%04x: remove\n",
private->sch->schid.cssid, sch->schid.cssid,
private->sch->schid.ssid, sch->schid.ssid,
private->sch->schid.sch_no); sch->schid.sch_no);
vfio_unregister_group_dev(&private->vdev); vfio_unregister_group_dev(&private->vdev);
......
...@@ -85,7 +85,6 @@ struct vfio_ccw_parent { ...@@ -85,7 +85,6 @@ struct vfio_ccw_parent {
/** /**
* struct vfio_ccw_private * struct vfio_ccw_private
* @vdev: Embedded VFIO device * @vdev: Embedded VFIO device
* @sch: pointer to the subchannel
* @state: internal state of the device * @state: internal state of the device
* @completion: synchronization helper of the I/O completion * @completion: synchronization helper of the I/O completion
* @io_region: MMIO region to input/output I/O arguments/results * @io_region: MMIO region to input/output I/O arguments/results
...@@ -107,7 +106,6 @@ struct vfio_ccw_parent { ...@@ -107,7 +106,6 @@ struct vfio_ccw_parent {
*/ */
struct vfio_ccw_private { struct vfio_ccw_private {
struct vfio_device vdev; struct vfio_device vdev;
struct subchannel *sch;
int state; int state;
struct completion *completion; struct completion *completion;
struct ccw_io_region *io_region; struct ccw_io_region *io_region;
...@@ -172,7 +170,10 @@ extern fsm_func_t *vfio_ccw_jumptable[NR_VFIO_CCW_STATES][NR_VFIO_CCW_EVENTS]; ...@@ -172,7 +170,10 @@ extern fsm_func_t *vfio_ccw_jumptable[NR_VFIO_CCW_STATES][NR_VFIO_CCW_EVENTS];
static inline void vfio_ccw_fsm_event(struct vfio_ccw_private *private, static inline void vfio_ccw_fsm_event(struct vfio_ccw_private *private,
enum vfio_ccw_event event) enum vfio_ccw_event event)
{ {
trace_vfio_ccw_fsm_event(private->sch->schid, private->state, event); struct subchannel *sch = to_subchannel(private->vdev.dev->parent);
if (sch)
trace_vfio_ccw_fsm_event(sch->schid, private->state, event);
vfio_ccw_jumptable[private->state][event](private, event); vfio_ccw_jumptable[private->state][event](private, event);
} }
......
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