@@ -174,7 +174,7 @@ static int **evtchn_to_irq;
174
174
#ifdef CONFIG_X86
175
175
static unsigned long * pirq_eoi_map ;
176
176
#endif
177
- static bool (* pirq_needs_eoi )(unsigned irq );
177
+ static bool (* pirq_needs_eoi )(struct irq_info * info );
178
178
179
179
#define EVTCHN_ROW (e ) (e / (PAGE_SIZE/sizeof(**evtchn_to_irq)))
180
180
#define EVTCHN_COL (e ) (e % (PAGE_SIZE/sizeof(**evtchn_to_irq)))
@@ -190,7 +190,6 @@ static struct irq_chip xen_lateeoi_chip;
190
190
static struct irq_chip xen_percpu_chip ;
191
191
static struct irq_chip xen_pirq_chip ;
192
192
static void enable_dynirq (struct irq_data * data );
193
- static void disable_dynirq (struct irq_data * data );
194
193
195
194
static DEFINE_PER_CPU (unsigned int , irq_epoch ) ;
196
195
@@ -454,10 +453,8 @@ static unsigned int virq_from_irq(struct irq_info *info)
454
453
return info -> u .virq ;
455
454
}
456
455
457
- static unsigned pirq_from_irq (unsigned irq )
456
+ static unsigned int pirq_from_irq (struct irq_info * info )
458
457
{
459
- struct irq_info * info = info_for_irq (irq );
460
-
461
458
BUG_ON (info == NULL );
462
459
BUG_ON (info -> type != IRQT_PIRQ );
463
460
@@ -500,15 +497,14 @@ static void do_unmask(struct irq_info *info, u8 reason)
500
497
}
501
498
502
499
#ifdef CONFIG_X86
503
- static bool pirq_check_eoi_map (unsigned irq )
500
+ static bool pirq_check_eoi_map (struct irq_info * info )
504
501
{
505
- return test_bit (pirq_from_irq (irq ), pirq_eoi_map );
502
+ return test_bit (pirq_from_irq (info ), pirq_eoi_map );
506
503
}
507
504
#endif
508
505
509
- static bool pirq_needs_eoi_flag (unsigned irq )
506
+ static bool pirq_needs_eoi_flag (struct irq_info * info )
510
507
{
511
- struct irq_info * info = info_for_irq (irq );
512
508
BUG_ON (info -> type != IRQT_PIRQ );
513
509
514
510
return info -> u .pirq .flags & PIRQ_NEEDS_EOI ;
@@ -802,14 +798,11 @@ static void event_handler_exit(struct irq_info *info)
802
798
clear_evtchn (info -> evtchn );
803
799
}
804
800
805
- static void pirq_query_unmask (int irq )
801
+ static void pirq_query_unmask (struct irq_info * info )
806
802
{
807
803
struct physdev_irq_status_query irq_status ;
808
- struct irq_info * info = info_for_irq (irq );
809
804
810
- BUG_ON (info -> type != IRQT_PIRQ );
811
-
812
- irq_status .irq = pirq_from_irq (irq );
805
+ irq_status .irq = pirq_from_irq (info );
813
806
if (HYPERVISOR_physdev_op (PHYSDEVOP_irq_status_query , & irq_status ))
814
807
irq_status .flags = 0 ;
815
808
@@ -818,56 +811,76 @@ static void pirq_query_unmask(int irq)
818
811
info -> u .pirq .flags |= PIRQ_NEEDS_EOI ;
819
812
}
820
813
821
- static void eoi_pirq (struct irq_data * data )
814
+ static void do_eoi_pirq (struct irq_info * info )
822
815
{
823
- struct irq_info * info = info_for_irq (data -> irq );
824
- evtchn_port_t evtchn = info ? info -> evtchn : 0 ;
825
- struct physdev_eoi eoi = { .irq = pirq_from_irq (data -> irq ) };
816
+ struct physdev_eoi eoi = { .irq = pirq_from_irq (info ) };
826
817
int rc = 0 ;
827
818
828
- if (!VALID_EVTCHN (evtchn ))
819
+ if (!VALID_EVTCHN (info -> evtchn ))
829
820
return ;
830
821
831
822
event_handler_exit (info );
832
823
833
- if (pirq_needs_eoi (data -> irq )) {
824
+ if (pirq_needs_eoi (info )) {
834
825
rc = HYPERVISOR_physdev_op (PHYSDEVOP_eoi , & eoi );
835
826
WARN_ON (rc );
836
827
}
837
828
}
838
829
830
+ static void eoi_pirq (struct irq_data * data )
831
+ {
832
+ struct irq_info * info = info_for_irq (data -> irq );
833
+
834
+ do_eoi_pirq (info );
835
+ }
836
+
837
+ static void do_disable_dynirq (struct irq_info * info )
838
+ {
839
+ if (VALID_EVTCHN (info -> evtchn ))
840
+ do_mask (info , EVT_MASK_REASON_EXPLICIT );
841
+ }
842
+
843
+ static void disable_dynirq (struct irq_data * data )
844
+ {
845
+ struct irq_info * info = info_for_irq (data -> irq );
846
+
847
+ if (info )
848
+ do_disable_dynirq (info );
849
+ }
850
+
839
851
static void mask_ack_pirq (struct irq_data * data )
840
852
{
841
- disable_dynirq (data );
842
- eoi_pirq (data );
853
+ struct irq_info * info = info_for_irq (data -> irq );
854
+
855
+ if (info ) {
856
+ do_disable_dynirq (info );
857
+ do_eoi_pirq (info );
858
+ }
843
859
}
844
860
845
- static unsigned int __startup_pirq (unsigned int irq )
861
+ static unsigned int __startup_pirq (struct irq_info * info )
846
862
{
847
863
struct evtchn_bind_pirq bind_pirq ;
848
- struct irq_info * info = info_for_irq (irq );
849
- evtchn_port_t evtchn = evtchn_from_irq (irq );
864
+ evtchn_port_t evtchn = info -> evtchn ;
850
865
int rc ;
851
866
852
- BUG_ON (info -> type != IRQT_PIRQ );
853
-
854
867
if (VALID_EVTCHN (evtchn ))
855
868
goto out ;
856
869
857
- bind_pirq .pirq = pirq_from_irq (irq );
870
+ bind_pirq .pirq = pirq_from_irq (info );
858
871
/* NB. We are happy to share unless we are probing. */
859
872
bind_pirq .flags = info -> u .pirq .flags & PIRQ_SHAREABLE ?
860
873
BIND_PIRQ__WILL_SHARE : 0 ;
861
874
rc = HYPERVISOR_event_channel_op (EVTCHNOP_bind_pirq , & bind_pirq );
862
875
if (rc != 0 ) {
863
- pr_warn ("Failed to obtain physical IRQ %d\n" , irq );
876
+ pr_warn ("Failed to obtain physical IRQ %d\n" , info -> irq );
864
877
return 0 ;
865
878
}
866
879
evtchn = bind_pirq .port ;
867
880
868
- pirq_query_unmask (irq );
881
+ pirq_query_unmask (info );
869
882
870
- rc = set_evtchn_to_irq (evtchn , irq );
883
+ rc = set_evtchn_to_irq (evtchn , info -> irq );
871
884
if (rc )
872
885
goto err ;
873
886
@@ -881,26 +894,28 @@ static unsigned int __startup_pirq(unsigned int irq)
881
894
out :
882
895
do_unmask (info , EVT_MASK_REASON_EXPLICIT );
883
896
884
- eoi_pirq ( irq_get_irq_data ( irq ) );
897
+ do_eoi_pirq ( info );
885
898
886
899
return 0 ;
887
900
888
901
err :
889
- pr_err ("irq%d: Failed to set port to irq mapping (%d)\n" , irq , rc );
902
+ pr_err ("irq%d: Failed to set port to irq mapping (%d)\n" , info -> irq ,
903
+ rc );
890
904
xen_evtchn_close (evtchn );
891
905
return 0 ;
892
906
}
893
907
894
908
static unsigned int startup_pirq (struct irq_data * data )
895
909
{
896
- return __startup_pirq (data -> irq );
910
+ struct irq_info * info = info_for_irq (data -> irq );
911
+
912
+ return __startup_pirq (info );
897
913
}
898
914
899
915
static void shutdown_pirq (struct irq_data * data )
900
916
{
901
- unsigned int irq = data -> irq ;
902
- struct irq_info * info = info_for_irq (irq );
903
- evtchn_port_t evtchn = evtchn_from_irq (irq );
917
+ struct irq_info * info = info_for_irq (data -> irq );
918
+ evtchn_port_t evtchn = info -> evtchn ;
904
919
905
920
BUG_ON (info -> type != IRQT_PIRQ );
906
921
@@ -1035,7 +1050,7 @@ int xen_bind_pirq_gsi_to_irq(unsigned gsi,
1035
1050
goto out ;
1036
1051
}
1037
1052
1038
- pirq_query_unmask (info -> irq );
1053
+ pirq_query_unmask (info );
1039
1054
/* We try to use the handler with the appropriate semantic for the
1040
1055
* type of interrupt: if the interrupt is an edge triggered
1041
1056
* interrupt we use handle_edge_irq.
@@ -1162,7 +1177,9 @@ int xen_destroy_irq(int irq)
1162
1177
1163
1178
int xen_pirq_from_irq (unsigned irq )
1164
1179
{
1165
- return pirq_from_irq (irq );
1180
+ struct irq_info * info = info_for_irq (irq );
1181
+
1182
+ return pirq_from_irq (info );
1166
1183
}
1167
1184
EXPORT_SYMBOL_GPL (xen_pirq_from_irq );
1168
1185
@@ -1824,28 +1841,30 @@ static void enable_dynirq(struct irq_data *data)
1824
1841
do_unmask (info , EVT_MASK_REASON_EXPLICIT );
1825
1842
}
1826
1843
1827
- static void disable_dynirq (struct irq_data * data )
1844
+ static void do_ack_dynirq (struct irq_info * info )
1828
1845
{
1829
- struct irq_info * info = info_for_irq (data -> irq );
1830
- evtchn_port_t evtchn = info ? info -> evtchn : 0 ;
1846
+ evtchn_port_t evtchn = info -> evtchn ;
1831
1847
1832
1848
if (VALID_EVTCHN (evtchn ))
1833
- do_mask (info , EVT_MASK_REASON_EXPLICIT );
1849
+ event_handler_exit (info );
1834
1850
}
1835
1851
1836
1852
static void ack_dynirq (struct irq_data * data )
1837
1853
{
1838
1854
struct irq_info * info = info_for_irq (data -> irq );
1839
- evtchn_port_t evtchn = info ? info -> evtchn : 0 ;
1840
1855
1841
- if (VALID_EVTCHN ( evtchn ) )
1842
- event_handler_exit (info );
1856
+ if (info )
1857
+ do_ack_dynirq (info );
1843
1858
}
1844
1859
1845
1860
static void mask_ack_dynirq (struct irq_data * data )
1846
1861
{
1847
- disable_dynirq (data );
1848
- ack_dynirq (data );
1862
+ struct irq_info * info = info_for_irq (data -> irq );
1863
+
1864
+ if (info ) {
1865
+ do_disable_dynirq (info );
1866
+ do_ack_dynirq (info );
1867
+ }
1849
1868
}
1850
1869
1851
1870
static void lateeoi_ack_dynirq (struct irq_data * data )
@@ -1924,7 +1943,7 @@ static void restore_pirqs(void)
1924
1943
1925
1944
printk (KERN_DEBUG "xen: --> irq=%d, pirq=%d\n" , irq , map_irq .pirq );
1926
1945
1927
- __startup_pirq (irq );
1946
+ __startup_pirq (info );
1928
1947
}
1929
1948
}
1930
1949
0 commit comments