@@ -123,12 +123,12 @@ static irqreturn_t evtchnl_interrupt_evt(int irq, void *dev_id)
123
123
static void evtchnl_free (struct xen_drm_front_info * front_info ,
124
124
struct xen_drm_front_evtchnl * evtchnl )
125
125
{
126
- unsigned long page = 0 ;
126
+ void * page = NULL ;
127
127
128
128
if (evtchnl -> type == EVTCHNL_TYPE_REQ )
129
- page = ( unsigned long ) evtchnl -> u .req .ring .sring ;
129
+ page = evtchnl -> u .req .ring .sring ;
130
130
else if (evtchnl -> type == EVTCHNL_TYPE_EVT )
131
- page = ( unsigned long ) evtchnl -> u .evt .page ;
131
+ page = evtchnl -> u .evt .page ;
132
132
if (!page )
133
133
return ;
134
134
@@ -147,8 +147,7 @@ static void evtchnl_free(struct xen_drm_front_info *front_info,
147
147
xenbus_free_evtchn (front_info -> xb_dev , evtchnl -> port );
148
148
149
149
/* end access and free the page */
150
- if (evtchnl -> gref != INVALID_GRANT_REF )
151
- gnttab_end_foreign_access (evtchnl -> gref , page );
150
+ xenbus_teardown_ring (& page , 1 , & evtchnl -> gref );
152
151
153
152
memset (evtchnl , 0 , sizeof (* evtchnl ));
154
153
}
@@ -158,8 +157,7 @@ static int evtchnl_alloc(struct xen_drm_front_info *front_info, int index,
158
157
enum xen_drm_front_evtchnl_type type )
159
158
{
160
159
struct xenbus_device * xb_dev = front_info -> xb_dev ;
161
- unsigned long page ;
162
- grant_ref_t gref ;
160
+ void * page ;
163
161
irq_handler_t handler ;
164
162
int ret ;
165
163
@@ -168,44 +166,25 @@ static int evtchnl_alloc(struct xen_drm_front_info *front_info, int index,
168
166
evtchnl -> index = index ;
169
167
evtchnl -> front_info = front_info ;
170
168
evtchnl -> state = EVTCHNL_STATE_DISCONNECTED ;
171
- evtchnl -> gref = INVALID_GRANT_REF ;
172
169
173
- page = get_zeroed_page ( GFP_NOIO | __GFP_HIGH );
174
- if (! page ) {
175
- ret = - ENOMEM ;
170
+ ret = xenbus_setup_ring ( xb_dev , GFP_NOIO | __GFP_HIGH , & page ,
171
+ 1 , & evtchnl -> gref );
172
+ if ( ret )
176
173
goto fail ;
177
- }
178
174
179
175
if (type == EVTCHNL_TYPE_REQ ) {
180
176
struct xen_displif_sring * sring ;
181
177
182
178
init_completion (& evtchnl -> u .req .completion );
183
179
mutex_init (& evtchnl -> u .req .req_io_lock );
184
- sring = (struct xen_displif_sring * )page ;
185
- SHARED_RING_INIT (sring );
186
- FRONT_RING_INIT (& evtchnl -> u .req .ring , sring , XEN_PAGE_SIZE );
187
-
188
- ret = xenbus_grant_ring (xb_dev , sring , 1 , & gref );
189
- if (ret < 0 ) {
190
- evtchnl -> u .req .ring .sring = NULL ;
191
- free_page (page );
192
- goto fail ;
193
- }
180
+ sring = page ;
181
+ XEN_FRONT_RING_INIT (& evtchnl -> u .req .ring , sring , XEN_PAGE_SIZE );
194
182
195
183
handler = evtchnl_interrupt_ctrl ;
196
184
} else {
197
- ret = gnttab_grant_foreign_access (xb_dev -> otherend_id ,
198
- virt_to_gfn ((void * )page ), 0 );
199
- if (ret < 0 ) {
200
- free_page (page );
201
- goto fail ;
202
- }
203
-
204
- evtchnl -> u .evt .page = (struct xendispl_event_page * )page ;
205
- gref = ret ;
185
+ evtchnl -> u .evt .page = page ;
206
186
handler = evtchnl_interrupt_evt ;
207
187
}
208
- evtchnl -> gref = gref ;
209
188
210
189
ret = xenbus_alloc_evtchn (xb_dev , & evtchnl -> port );
211
190
if (ret < 0 )
0 commit comments