Skip to content

Commit f2fa0e5

Browse files
jgross1davem330
authored andcommitted
xen/events: link interdomain events to associated xenbus device
In order to support the possibility of per-device event channel settings (e.g. lateeoi spurious event thresholds) add a xenbus device pointer to struct irq_info() and modify the related event channel binding interfaces to take the pointer to the xenbus device as a parameter instead of the domain id of the other side. While at it remove the stale prototype of bind_evtchn_to_irq_lateeoi(). Signed-off-by: Juergen Gross <[email protected]> Reviewed-by: Boris Ostrovsky <[email protected]> Reviewed-by: Wei Liu <[email protected]> Reviewed-by: Paul Durrant <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent a3daf3d commit f2fa0e5

File tree

7 files changed

+41
-33
lines changed

7 files changed

+41
-33
lines changed

drivers/block/xen-blkback/xenbus.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -245,7 +245,7 @@ static int xen_blkif_map(struct xen_blkif_ring *ring, grant_ref_t *gref,
245245
if (req_prod - rsp_prod > size)
246246
goto fail;
247247

248-
err = bind_interdomain_evtchn_to_irqhandler_lateeoi(blkif->domid,
248+
err = bind_interdomain_evtchn_to_irqhandler_lateeoi(blkif->be->dev,
249249
evtchn, xen_blkif_be_int, 0, "blkif-backend", ring);
250250
if (err < 0)
251251
goto fail;

drivers/net/xen-netback/interface.c

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -630,13 +630,13 @@ int xenvif_connect_ctrl(struct xenvif *vif, grant_ref_t ring_ref,
630630
unsigned int evtchn)
631631
{
632632
struct net_device *dev = vif->dev;
633+
struct xenbus_device *xendev = xenvif_to_xenbus_device(vif);
633634
void *addr;
634635
struct xen_netif_ctrl_sring *shared;
635636
RING_IDX rsp_prod, req_prod;
636637
int err;
637638

638-
err = xenbus_map_ring_valloc(xenvif_to_xenbus_device(vif),
639-
&ring_ref, 1, &addr);
639+
err = xenbus_map_ring_valloc(xendev, &ring_ref, 1, &addr);
640640
if (err)
641641
goto err;
642642

@@ -650,7 +650,7 @@ int xenvif_connect_ctrl(struct xenvif *vif, grant_ref_t ring_ref,
650650
if (req_prod - rsp_prod > RING_SIZE(&vif->ctrl))
651651
goto err_unmap;
652652

653-
err = bind_interdomain_evtchn_to_irq_lateeoi(vif->domid, evtchn);
653+
err = bind_interdomain_evtchn_to_irq_lateeoi(xendev, evtchn);
654654
if (err < 0)
655655
goto err_unmap;
656656

@@ -673,8 +673,7 @@ int xenvif_connect_ctrl(struct xenvif *vif, grant_ref_t ring_ref,
673673
vif->ctrl_irq = 0;
674674

675675
err_unmap:
676-
xenbus_unmap_ring_vfree(xenvif_to_xenbus_device(vif),
677-
vif->ctrl.sring);
676+
xenbus_unmap_ring_vfree(xendev, vif->ctrl.sring);
678677
vif->ctrl.sring = NULL;
679678

680679
err:
@@ -719,6 +718,7 @@ int xenvif_connect_data(struct xenvif_queue *queue,
719718
unsigned int tx_evtchn,
720719
unsigned int rx_evtchn)
721720
{
721+
struct xenbus_device *dev = xenvif_to_xenbus_device(queue->vif);
722722
struct task_struct *task;
723723
int err;
724724

@@ -755,7 +755,7 @@ int xenvif_connect_data(struct xenvif_queue *queue,
755755
if (tx_evtchn == rx_evtchn) {
756756
/* feature-split-event-channels == 0 */
757757
err = bind_interdomain_evtchn_to_irqhandler_lateeoi(
758-
queue->vif->domid, tx_evtchn, xenvif_interrupt, 0,
758+
dev, tx_evtchn, xenvif_interrupt, 0,
759759
queue->name, queue);
760760
if (err < 0)
761761
goto err;
@@ -766,7 +766,7 @@ int xenvif_connect_data(struct xenvif_queue *queue,
766766
snprintf(queue->tx_irq_name, sizeof(queue->tx_irq_name),
767767
"%s-tx", queue->name);
768768
err = bind_interdomain_evtchn_to_irqhandler_lateeoi(
769-
queue->vif->domid, tx_evtchn, xenvif_tx_interrupt, 0,
769+
dev, tx_evtchn, xenvif_tx_interrupt, 0,
770770
queue->tx_irq_name, queue);
771771
if (err < 0)
772772
goto err;
@@ -776,7 +776,7 @@ int xenvif_connect_data(struct xenvif_queue *queue,
776776
snprintf(queue->rx_irq_name, sizeof(queue->rx_irq_name),
777777
"%s-rx", queue->name);
778778
err = bind_interdomain_evtchn_to_irqhandler_lateeoi(
779-
queue->vif->domid, rx_evtchn, xenvif_rx_interrupt, 0,
779+
dev, rx_evtchn, xenvif_rx_interrupt, 0,
780780
queue->rx_irq_name, queue);
781781
if (err < 0)
782782
goto err;

drivers/xen/events/events_base.c

Lines changed: 24 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@
6363
#include <xen/interface/physdev.h>
6464
#include <xen/interface/sched.h>
6565
#include <xen/interface/vcpu.h>
66+
#include <xen/xenbus.h>
6667
#include <asm/hw_irq.h>
6768

6869
#include "events_internal.h"
@@ -115,6 +116,7 @@ struct irq_info {
115116
unsigned char flags;
116117
uint16_t domid;
117118
} pirq;
119+
struct xenbus_device *interdomain;
118120
} u;
119121
};
120122

@@ -313,11 +315,16 @@ static int xen_irq_info_common_setup(struct irq_info *info,
313315
}
314316

315317
static int xen_irq_info_evtchn_setup(unsigned irq,
316-
evtchn_port_t evtchn)
318+
evtchn_port_t evtchn,
319+
struct xenbus_device *dev)
317320
{
318321
struct irq_info *info = info_for_irq(irq);
322+
int ret;
319323

320-
return xen_irq_info_common_setup(info, irq, IRQT_EVTCHN, evtchn, 0);
324+
ret = xen_irq_info_common_setup(info, irq, IRQT_EVTCHN, evtchn, 0);
325+
info->u.interdomain = dev;
326+
327+
return ret;
321328
}
322329

323330
static int xen_irq_info_ipi_setup(unsigned cpu,
@@ -1116,7 +1123,8 @@ int xen_pirq_from_irq(unsigned irq)
11161123
}
11171124
EXPORT_SYMBOL_GPL(xen_pirq_from_irq);
11181125

1119-
static int bind_evtchn_to_irq_chip(evtchn_port_t evtchn, struct irq_chip *chip)
1126+
static int bind_evtchn_to_irq_chip(evtchn_port_t evtchn, struct irq_chip *chip,
1127+
struct xenbus_device *dev)
11201128
{
11211129
int irq;
11221130
int ret;
@@ -1136,7 +1144,7 @@ static int bind_evtchn_to_irq_chip(evtchn_port_t evtchn, struct irq_chip *chip)
11361144
irq_set_chip_and_handler_name(irq, chip,
11371145
handle_edge_irq, "event");
11381146

1139-
ret = xen_irq_info_evtchn_setup(irq, evtchn);
1147+
ret = xen_irq_info_evtchn_setup(irq, evtchn, dev);
11401148
if (ret < 0) {
11411149
__unbind_from_irq(irq);
11421150
irq = ret;
@@ -1163,7 +1171,7 @@ static int bind_evtchn_to_irq_chip(evtchn_port_t evtchn, struct irq_chip *chip)
11631171

11641172
int bind_evtchn_to_irq(evtchn_port_t evtchn)
11651173
{
1166-
return bind_evtchn_to_irq_chip(evtchn, &xen_dynamic_chip);
1174+
return bind_evtchn_to_irq_chip(evtchn, &xen_dynamic_chip, NULL);
11671175
}
11681176
EXPORT_SYMBOL_GPL(bind_evtchn_to_irq);
11691177

@@ -1212,27 +1220,27 @@ static int bind_ipi_to_irq(unsigned int ipi, unsigned int cpu)
12121220
return irq;
12131221
}
12141222

1215-
static int bind_interdomain_evtchn_to_irq_chip(unsigned int remote_domain,
1223+
static int bind_interdomain_evtchn_to_irq_chip(struct xenbus_device *dev,
12161224
evtchn_port_t remote_port,
12171225
struct irq_chip *chip)
12181226
{
12191227
struct evtchn_bind_interdomain bind_interdomain;
12201228
int err;
12211229

1222-
bind_interdomain.remote_dom = remote_domain;
1230+
bind_interdomain.remote_dom = dev->otherend_id;
12231231
bind_interdomain.remote_port = remote_port;
12241232

12251233
err = HYPERVISOR_event_channel_op(EVTCHNOP_bind_interdomain,
12261234
&bind_interdomain);
12271235

12281236
return err ? : bind_evtchn_to_irq_chip(bind_interdomain.local_port,
1229-
chip);
1237+
chip, dev);
12301238
}
12311239

1232-
int bind_interdomain_evtchn_to_irq_lateeoi(unsigned int remote_domain,
1240+
int bind_interdomain_evtchn_to_irq_lateeoi(struct xenbus_device *dev,
12331241
evtchn_port_t remote_port)
12341242
{
1235-
return bind_interdomain_evtchn_to_irq_chip(remote_domain, remote_port,
1243+
return bind_interdomain_evtchn_to_irq_chip(dev, remote_port,
12361244
&xen_lateeoi_chip);
12371245
}
12381246
EXPORT_SYMBOL_GPL(bind_interdomain_evtchn_to_irq_lateeoi);
@@ -1345,7 +1353,7 @@ static int bind_evtchn_to_irqhandler_chip(evtchn_port_t evtchn,
13451353
{
13461354
int irq, retval;
13471355

1348-
irq = bind_evtchn_to_irq_chip(evtchn, chip);
1356+
irq = bind_evtchn_to_irq_chip(evtchn, chip, NULL);
13491357
if (irq < 0)
13501358
return irq;
13511359
retval = request_irq(irq, handler, irqflags, devname, dev_id);
@@ -1380,14 +1388,13 @@ int bind_evtchn_to_irqhandler_lateeoi(evtchn_port_t evtchn,
13801388
EXPORT_SYMBOL_GPL(bind_evtchn_to_irqhandler_lateeoi);
13811389

13821390
static int bind_interdomain_evtchn_to_irqhandler_chip(
1383-
unsigned int remote_domain, evtchn_port_t remote_port,
1391+
struct xenbus_device *dev, evtchn_port_t remote_port,
13841392
irq_handler_t handler, unsigned long irqflags,
13851393
const char *devname, void *dev_id, struct irq_chip *chip)
13861394
{
13871395
int irq, retval;
13881396

1389-
irq = bind_interdomain_evtchn_to_irq_chip(remote_domain, remote_port,
1390-
chip);
1397+
irq = bind_interdomain_evtchn_to_irq_chip(dev, remote_port, chip);
13911398
if (irq < 0)
13921399
return irq;
13931400

@@ -1400,14 +1407,14 @@ static int bind_interdomain_evtchn_to_irqhandler_chip(
14001407
return irq;
14011408
}
14021409

1403-
int bind_interdomain_evtchn_to_irqhandler_lateeoi(unsigned int remote_domain,
1410+
int bind_interdomain_evtchn_to_irqhandler_lateeoi(struct xenbus_device *dev,
14041411
evtchn_port_t remote_port,
14051412
irq_handler_t handler,
14061413
unsigned long irqflags,
14071414
const char *devname,
14081415
void *dev_id)
14091416
{
1410-
return bind_interdomain_evtchn_to_irqhandler_chip(remote_domain,
1417+
return bind_interdomain_evtchn_to_irqhandler_chip(dev,
14111418
remote_port, handler, irqflags, devname,
14121419
dev_id, &xen_lateeoi_chip);
14131420
}
@@ -1679,7 +1686,7 @@ void rebind_evtchn_irq(evtchn_port_t evtchn, int irq)
16791686
so there should be a proper type */
16801687
BUG_ON(info->type == IRQT_UNBOUND);
16811688

1682-
(void)xen_irq_info_evtchn_setup(irq, evtchn);
1689+
(void)xen_irq_info_evtchn_setup(irq, evtchn, NULL);
16831690

16841691
mutex_unlock(&irq_mapping_update_lock);
16851692

drivers/xen/pvcalls-back.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -348,7 +348,7 @@ static struct sock_mapping *pvcalls_new_active_socket(
348348
map->bytes = page;
349349

350350
ret = bind_interdomain_evtchn_to_irqhandler_lateeoi(
351-
fedata->dev->otherend_id, evtchn,
351+
fedata->dev, evtchn,
352352
pvcalls_back_conn_event, 0, "pvcalls-backend", map);
353353
if (ret < 0)
354354
goto out;
@@ -948,7 +948,7 @@ static int backend_connect(struct xenbus_device *dev)
948948
goto error;
949949
}
950950

951-
err = bind_interdomain_evtchn_to_irq_lateeoi(dev->otherend_id, evtchn);
951+
err = bind_interdomain_evtchn_to_irq_lateeoi(dev, evtchn);
952952
if (err < 0)
953953
goto error;
954954
fedata->irq = err;

drivers/xen/xen-pciback/xenbus.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ static int xen_pcibk_do_attach(struct xen_pcibk_device *pdev, int gnt_ref,
124124
pdev->sh_info = vaddr;
125125

126126
err = bind_interdomain_evtchn_to_irqhandler_lateeoi(
127-
pdev->xdev->otherend_id, remote_evtchn, xen_pcibk_handle_event,
127+
pdev->xdev, remote_evtchn, xen_pcibk_handle_event,
128128
0, DRV_NAME, pdev);
129129
if (err < 0) {
130130
xenbus_dev_fatal(pdev->xdev, err,

drivers/xen/xen-scsiback.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -799,7 +799,7 @@ static int scsiback_init_sring(struct vscsibk_info *info, grant_ref_t ring_ref,
799799
sring = (struct vscsiif_sring *)area;
800800
BACK_RING_INIT(&info->ring, sring, PAGE_SIZE);
801801

802-
err = bind_interdomain_evtchn_to_irq_lateeoi(info->domid, evtchn);
802+
err = bind_interdomain_evtchn_to_irq_lateeoi(info->dev, evtchn);
803803
if (err < 0)
804804
goto unmap_page;
805805

include/xen/events.h

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,11 @@
1212
#include <asm/xen/hypercall.h>
1313
#include <asm/xen/events.h>
1414

15+
struct xenbus_device;
16+
1517
unsigned xen_evtchn_nr_channels(void);
1618

1719
int bind_evtchn_to_irq(evtchn_port_t evtchn);
18-
int bind_evtchn_to_irq_lateeoi(evtchn_port_t evtchn);
1920
int bind_evtchn_to_irqhandler(evtchn_port_t evtchn,
2021
irq_handler_t handler,
2122
unsigned long irqflags, const char *devname,
@@ -35,9 +36,9 @@ int bind_ipi_to_irqhandler(enum ipi_vector ipi,
3536
unsigned long irqflags,
3637
const char *devname,
3738
void *dev_id);
38-
int bind_interdomain_evtchn_to_irq_lateeoi(unsigned int remote_domain,
39+
int bind_interdomain_evtchn_to_irq_lateeoi(struct xenbus_device *dev,
3940
evtchn_port_t remote_port);
40-
int bind_interdomain_evtchn_to_irqhandler_lateeoi(unsigned int remote_domain,
41+
int bind_interdomain_evtchn_to_irqhandler_lateeoi(struct xenbus_device *dev,
4142
evtchn_port_t remote_port,
4243
irq_handler_t handler,
4344
unsigned long irqflags,

0 commit comments

Comments
 (0)