Skip to content

Commit d613060

Browse files
committed
Merge tag 'for-linus-5.19-rc1-tag' of git://git.kernel.org/pub/scm/linux/kernel/git/xen/tip
Pull xen updates from Juergen Gross: - decouple the PV interface from kernel internals in the Xen scsifront/scsiback pv drivers - harden the Xen scsifront PV driver against a malicious backend driver - simplify Xen PV frontend driver ring page setup - support Xen setups with multiple domains created at boot time to tolerate Xenstore coming up late - two small cleanup patches * tag 'for-linus-5.19-rc1-tag' of git://git.kernel.org/pub/scm/linux/kernel/git/xen/tip: (29 commits) xen: add support for initializing xenstore later as HVM domain xen: sync xs_wire.h header with upstream xen x86: xen: remove STACK_FRAME_NON_STANDARD from xen_cpuid xen-blk{back,front}: Update contact points for buffer_squeeze_duration_ms and feature_persistent xen/xenbus: eliminate xenbus_grant_ring() xen/sndfront: use xenbus_setup_ring() and xenbus_teardown_ring() xen/usbfront: use xenbus_setup_ring() and xenbus_teardown_ring() xen/scsifront: use xenbus_setup_ring() and xenbus_teardown_ring() xen/pcifront: use xenbus_setup_ring() and xenbus_teardown_ring() xen/drmfront: use xenbus_setup_ring() and xenbus_teardown_ring() xen/tpmfront: use xenbus_setup_ring() and xenbus_teardown_ring() xen/netfront: use xenbus_setup_ring() and xenbus_teardown_ring() xen/blkfront: use xenbus_setup_ring() and xenbus_teardown_ring() xen/xenbus: add xenbus_setup_ring() service function xen: update ring.h xen/shbuf: switch xen-front-pgdir-shbuf to use INVALID_GRANT_REF xen/dmabuf: switch gntdev-dmabuf to use INVALID_GRANT_REF xen/sound: switch xen_snd_front to use INVALID_GRANT_REF xen/drm: switch xen_drm_front to use INVALID_GRANT_REF xen/usb: switch xen-hcd to use INVALID_GRANT_REF ...
2 parents 8443516 + 5b33539 commit d613060

25 files changed

+734
-476
lines changed

Documentation/ABI/testing/sysfs-driver-xen-blkback

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ Description:
2929
What: /sys/module/xen_blkback/parameters/buffer_squeeze_duration_ms
3030
Date: December 2019
3131
KernelVersion: 5.6
32-
Contact: SeongJae Park <[email protected]>
32+
Contact: Maximilian Heyne <[email protected]>
3333
Description:
3434
When memory pressure is reported to blkback this option
3535
controls the duration in milliseconds that blkback will not
@@ -39,7 +39,7 @@ Description:
3939
What: /sys/module/xen_blkback/parameters/feature_persistent
4040
Date: September 2020
4141
KernelVersion: 5.10
42-
Contact: SeongJae Park <[email protected]>
42+
Contact: Maximilian Heyne <[email protected]>
4343
Description:
4444
Whether to enable the persistent grants feature or not. Note
4545
that this option only takes effect on newly created backends.

Documentation/ABI/testing/sysfs-driver-xen-blkfront

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ Description:
1212
What: /sys/module/xen_blkfront/parameters/feature_persistent
1313
Date: September 2020
1414
KernelVersion: 5.10
15-
Contact: SeongJae Park <[email protected]>
15+
Contact: Maximilian Heyne <[email protected]>
1616
Description:
1717
Whether to enable the persistent grants feature or not. Note
1818
that this option only takes effect on newly created frontends.

arch/x86/xen/enlighten_pv.c

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@
3030
#include <linux/pci.h>
3131
#include <linux/gfp.h>
3232
#include <linux/edd.h>
33-
#include <linux/objtool.h>
3433

3534
#include <xen/xen.h>
3635
#include <xen/events.h>
@@ -165,7 +164,6 @@ static void xen_cpuid(unsigned int *ax, unsigned int *bx,
165164

166165
*bx &= maskebx;
167166
}
168-
STACK_FRAME_NON_STANDARD(xen_cpuid); /* XEN_EMULATE_PREFIX */
169167

170168
static bool __init xen_check_mwait(void)
171169
{

drivers/block/xen-blkfront.c

Lines changed: 17 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -229,8 +229,6 @@ static unsigned int nr_minors;
229229
static unsigned long *minors;
230230
static DEFINE_SPINLOCK(minor_lock);
231231

232-
#define GRANT_INVALID_REF 0
233-
234232
#define PARTS_PER_DISK 16
235233
#define PARTS_PER_EXT_DISK 256
236234

@@ -321,7 +319,7 @@ static int fill_grant_buffer(struct blkfront_ring_info *rinfo, int num)
321319
gnt_list_entry->page = granted_page;
322320
}
323321

324-
gnt_list_entry->gref = GRANT_INVALID_REF;
322+
gnt_list_entry->gref = INVALID_GRANT_REF;
325323
list_add(&gnt_list_entry->node, &rinfo->grants);
326324
i++;
327325
}
@@ -350,7 +348,7 @@ static struct grant *get_free_grant(struct blkfront_ring_info *rinfo)
350348
node);
351349
list_del(&gnt_list_entry->node);
352350

353-
if (gnt_list_entry->gref != GRANT_INVALID_REF)
351+
if (gnt_list_entry->gref != INVALID_GRANT_REF)
354352
rinfo->persistent_gnts_c--;
355353

356354
return gnt_list_entry;
@@ -372,7 +370,7 @@ static struct grant *get_grant(grant_ref_t *gref_head,
372370
struct grant *gnt_list_entry = get_free_grant(rinfo);
373371
struct blkfront_info *info = rinfo->dev_info;
374372

375-
if (gnt_list_entry->gref != GRANT_INVALID_REF)
373+
if (gnt_list_entry->gref != INVALID_GRANT_REF)
376374
return gnt_list_entry;
377375

378376
/* Assign a gref to this page */
@@ -396,7 +394,7 @@ static struct grant *get_indirect_grant(grant_ref_t *gref_head,
396394
struct grant *gnt_list_entry = get_free_grant(rinfo);
397395
struct blkfront_info *info = rinfo->dev_info;
398396

399-
if (gnt_list_entry->gref != GRANT_INVALID_REF)
397+
if (gnt_list_entry->gref != INVALID_GRANT_REF)
400398
return gnt_list_entry;
401399

402400
/* Assign a gref to this page */
@@ -1221,7 +1219,7 @@ static void blkif_free_ring(struct blkfront_ring_info *rinfo)
12211219
list_for_each_entry_safe(persistent_gnt, n,
12221220
&rinfo->grants, node) {
12231221
list_del(&persistent_gnt->node);
1224-
if (persistent_gnt->gref != GRANT_INVALID_REF) {
1222+
if (persistent_gnt->gref != INVALID_GRANT_REF) {
12251223
gnttab_end_foreign_access(persistent_gnt->gref,
12261224
0UL);
12271225
rinfo->persistent_gnts_c--;
@@ -1282,15 +1280,8 @@ static void blkif_free_ring(struct blkfront_ring_info *rinfo)
12821280
flush_work(&rinfo->work);
12831281

12841282
/* Free resources associated with old device channel. */
1285-
for (i = 0; i < info->nr_ring_pages; i++) {
1286-
if (rinfo->ring_ref[i] != GRANT_INVALID_REF) {
1287-
gnttab_end_foreign_access(rinfo->ring_ref[i], 0);
1288-
rinfo->ring_ref[i] = GRANT_INVALID_REF;
1289-
}
1290-
}
1291-
free_pages_exact(rinfo->ring.sring,
1292-
info->nr_ring_pages * XEN_PAGE_SIZE);
1293-
rinfo->ring.sring = NULL;
1283+
xenbus_teardown_ring((void **)&rinfo->ring.sring, info->nr_ring_pages,
1284+
rinfo->ring_ref);
12941285

12951286
if (rinfo->irq)
12961287
unbind_from_irqhandler(rinfo->irq, rinfo);
@@ -1475,7 +1466,7 @@ static int blkif_completion(unsigned long *id,
14751466
* to the tail of the list, so it will not be picked
14761467
* again unless we run out of persistent grants.
14771468
*/
1478-
s->grants_used[i]->gref = GRANT_INVALID_REF;
1469+
s->grants_used[i]->gref = INVALID_GRANT_REF;
14791470
list_add_tail(&s->grants_used[i]->node, &rinfo->grants);
14801471
}
14811472
}
@@ -1500,7 +1491,7 @@ static int blkif_completion(unsigned long *id,
15001491
indirect_page = s->indirect_grants[i]->page;
15011492
list_add(&indirect_page->lru, &rinfo->indirect_pages);
15021493
}
1503-
s->indirect_grants[i]->gref = GRANT_INVALID_REF;
1494+
s->indirect_grants[i]->gref = INVALID_GRANT_REF;
15041495
list_add_tail(&s->indirect_grants[i]->node, &rinfo->grants);
15051496
}
15061497
}
@@ -1681,30 +1672,16 @@ static int setup_blkring(struct xenbus_device *dev,
16811672
struct blkfront_ring_info *rinfo)
16821673
{
16831674
struct blkif_sring *sring;
1684-
int err, i;
1675+
int err;
16851676
struct blkfront_info *info = rinfo->dev_info;
16861677
unsigned long ring_size = info->nr_ring_pages * XEN_PAGE_SIZE;
1687-
grant_ref_t gref[XENBUS_MAX_RING_GRANTS];
1688-
1689-
for (i = 0; i < info->nr_ring_pages; i++)
1690-
rinfo->ring_ref[i] = GRANT_INVALID_REF;
16911678

1692-
sring = alloc_pages_exact(ring_size, GFP_NOIO);
1693-
if (!sring) {
1694-
xenbus_dev_fatal(dev, -ENOMEM, "allocating shared ring");
1695-
return -ENOMEM;
1696-
}
1697-
SHARED_RING_INIT(sring);
1698-
FRONT_RING_INIT(&rinfo->ring, sring, ring_size);
1699-
1700-
err = xenbus_grant_ring(dev, rinfo->ring.sring, info->nr_ring_pages, gref);
1701-
if (err < 0) {
1702-
free_pages_exact(sring, ring_size);
1703-
rinfo->ring.sring = NULL;
1679+
err = xenbus_setup_ring(dev, GFP_NOIO, (void **)&sring,
1680+
info->nr_ring_pages, rinfo->ring_ref);
1681+
if (err)
17041682
goto fail;
1705-
}
1706-
for (i = 0; i < info->nr_ring_pages; i++)
1707-
rinfo->ring_ref[i] = gref[i];
1683+
1684+
XEN_FRONT_RING_INIT(&rinfo->ring, sring, ring_size);
17081685

17091686
err = xenbus_alloc_evtchn(dev, &rinfo->evtchn);
17101687
if (err)
@@ -2544,13 +2521,13 @@ static void purge_persistent_grants(struct blkfront_info *info)
25442521

25452522
list_for_each_entry_safe(gnt_list_entry, tmp, &rinfo->grants,
25462523
node) {
2547-
if (gnt_list_entry->gref == GRANT_INVALID_REF ||
2524+
if (gnt_list_entry->gref == INVALID_GRANT_REF ||
25482525
!gnttab_try_end_foreign_access(gnt_list_entry->gref))
25492526
continue;
25502527

25512528
list_del(&gnt_list_entry->node);
25522529
rinfo->persistent_gnts_c--;
2553-
gnt_list_entry->gref = GRANT_INVALID_REF;
2530+
gnt_list_entry->gref = INVALID_GRANT_REF;
25542531
list_add_tail(&gnt_list_entry->node, &grants);
25552532
}
25562533

drivers/char/tpm/xen-tpmfront.c

Lines changed: 3 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -253,20 +253,12 @@ static int setup_ring(struct xenbus_device *dev, struct tpm_private *priv)
253253
struct xenbus_transaction xbt;
254254
const char *message = NULL;
255255
int rv;
256-
grant_ref_t gref;
257256

258-
priv->shr = (void *)__get_free_page(GFP_KERNEL|__GFP_ZERO);
259-
if (!priv->shr) {
260-
xenbus_dev_fatal(dev, -ENOMEM, "allocating shared ring");
261-
return -ENOMEM;
262-
}
263-
264-
rv = xenbus_grant_ring(dev, priv->shr, 1, &gref);
257+
rv = xenbus_setup_ring(dev, GFP_KERNEL, (void **)&priv->shr, 1,
258+
&priv->ring_ref);
265259
if (rv < 0)
266260
return rv;
267261

268-
priv->ring_ref = gref;
269-
270262
rv = xenbus_alloc_evtchn(dev, &priv->evtchn);
271263
if (rv)
272264
return rv;
@@ -331,11 +323,7 @@ static void ring_free(struct tpm_private *priv)
331323
if (!priv)
332324
return;
333325

334-
if (priv->ring_ref)
335-
gnttab_end_foreign_access(priv->ring_ref,
336-
(unsigned long)priv->shr);
337-
else
338-
free_page((unsigned long)priv->shr);
326+
xenbus_teardown_ring((void **)&priv->shr, 1, &priv->ring_ref);
339327

340328
if (priv->irq)
341329
unbind_from_irqhandler(priv->irq, priv);

drivers/gpu/drm/xen/xen_drm_front.h

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -80,15 +80,6 @@ struct drm_pending_vblank_event;
8080
/* timeout in ms to wait for backend to respond */
8181
#define XEN_DRM_FRONT_WAIT_BACK_MS 3000
8282

83-
#ifndef GRANT_INVALID_REF
84-
/*
85-
* Note on usage of grant reference 0 as invalid grant reference:
86-
* grant reference 0 is valid, but never exposed to a PV driver,
87-
* because of the fact it is already in use/reserved by the PV console.
88-
*/
89-
#define GRANT_INVALID_REF 0
90-
#endif
91-
9283
struct xen_drm_front_info {
9384
struct xenbus_device *xb_dev;
9485
struct xen_drm_front_drm_info *drm_info;

drivers/gpu/drm/xen/xen_drm_front_evtchnl.c

Lines changed: 11 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -123,12 +123,12 @@ static irqreturn_t evtchnl_interrupt_evt(int irq, void *dev_id)
123123
static void evtchnl_free(struct xen_drm_front_info *front_info,
124124
struct xen_drm_front_evtchnl *evtchnl)
125125
{
126-
unsigned long page = 0;
126+
void *page = NULL;
127127

128128
if (evtchnl->type == EVTCHNL_TYPE_REQ)
129-
page = (unsigned long)evtchnl->u.req.ring.sring;
129+
page = evtchnl->u.req.ring.sring;
130130
else if (evtchnl->type == EVTCHNL_TYPE_EVT)
131-
page = (unsigned long)evtchnl->u.evt.page;
131+
page = evtchnl->u.evt.page;
132132
if (!page)
133133
return;
134134

@@ -147,8 +147,7 @@ static void evtchnl_free(struct xen_drm_front_info *front_info,
147147
xenbus_free_evtchn(front_info->xb_dev, evtchnl->port);
148148

149149
/* end access and free the page */
150-
if (evtchnl->gref != GRANT_INVALID_REF)
151-
gnttab_end_foreign_access(evtchnl->gref, page);
150+
xenbus_teardown_ring(&page, 1, &evtchnl->gref);
152151

153152
memset(evtchnl, 0, sizeof(*evtchnl));
154153
}
@@ -158,8 +157,7 @@ static int evtchnl_alloc(struct xen_drm_front_info *front_info, int index,
158157
enum xen_drm_front_evtchnl_type type)
159158
{
160159
struct xenbus_device *xb_dev = front_info->xb_dev;
161-
unsigned long page;
162-
grant_ref_t gref;
160+
void *page;
163161
irq_handler_t handler;
164162
int ret;
165163

@@ -168,44 +166,25 @@ static int evtchnl_alloc(struct xen_drm_front_info *front_info, int index,
168166
evtchnl->index = index;
169167
evtchnl->front_info = front_info;
170168
evtchnl->state = EVTCHNL_STATE_DISCONNECTED;
171-
evtchnl->gref = GRANT_INVALID_REF;
172169

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)
176173
goto fail;
177-
}
178174

179175
if (type == EVTCHNL_TYPE_REQ) {
180176
struct xen_displif_sring *sring;
181177

182178
init_completion(&evtchnl->u.req.completion);
183179
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);
194182

195183
handler = evtchnl_interrupt_ctrl;
196184
} 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;
206186
handler = evtchnl_interrupt_evt;
207187
}
208-
evtchnl->gref = gref;
209188

210189
ret = xenbus_alloc_evtchn(xb_dev, &evtchnl->port);
211190
if (ret < 0)

0 commit comments

Comments
 (0)