mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-12 21:57:43 +00:00
Merge branch 'stable/for-jens-4.13' of git://git.kernel.org/pub/scm/linux/kernel/git/konrad/xen into for-linus
Pull xen-blkfront fixes from Konrad for 4.13.
This commit is contained in:
commit
e9193da00f
1 changed files with 12 additions and 9 deletions
|
@ -708,6 +708,7 @@ static int blkif_queue_rw_req(struct request *req, struct blkfront_ring_info *ri
|
||||||
* existing persistent grants, or if we have to get new grants,
|
* existing persistent grants, or if we have to get new grants,
|
||||||
* as there are not sufficiently many free.
|
* as there are not sufficiently many free.
|
||||||
*/
|
*/
|
||||||
|
bool new_persistent_gnts = false;
|
||||||
struct scatterlist *sg;
|
struct scatterlist *sg;
|
||||||
int num_sg, max_grefs, num_grant;
|
int num_sg, max_grefs, num_grant;
|
||||||
|
|
||||||
|
@ -719,19 +720,21 @@ static int blkif_queue_rw_req(struct request *req, struct blkfront_ring_info *ri
|
||||||
*/
|
*/
|
||||||
max_grefs += INDIRECT_GREFS(max_grefs);
|
max_grefs += INDIRECT_GREFS(max_grefs);
|
||||||
|
|
||||||
/*
|
/* Check if we have enough persistent grants to allocate a requests */
|
||||||
* We have to reserve 'max_grefs' grants because persistent
|
if (rinfo->persistent_gnts_c < max_grefs) {
|
||||||
* grants are shared by all rings.
|
new_persistent_gnts = true;
|
||||||
*/
|
|
||||||
if (max_grefs > 0)
|
if (gnttab_alloc_grant_references(
|
||||||
if (gnttab_alloc_grant_references(max_grefs, &setup.gref_head) < 0) {
|
max_grefs - rinfo->persistent_gnts_c,
|
||||||
|
&setup.gref_head) < 0) {
|
||||||
gnttab_request_free_callback(
|
gnttab_request_free_callback(
|
||||||
&rinfo->callback,
|
&rinfo->callback,
|
||||||
blkif_restart_queue_callback,
|
blkif_restart_queue_callback,
|
||||||
rinfo,
|
rinfo,
|
||||||
max_grefs);
|
max_grefs - rinfo->persistent_gnts_c);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* Fill out a communications ring structure. */
|
/* Fill out a communications ring structure. */
|
||||||
id = blkif_ring_get_request(rinfo, req, &ring_req);
|
id = blkif_ring_get_request(rinfo, req, &ring_req);
|
||||||
|
@ -832,7 +835,7 @@ static int blkif_queue_rw_req(struct request *req, struct blkfront_ring_info *ri
|
||||||
if (unlikely(require_extra_req))
|
if (unlikely(require_extra_req))
|
||||||
rinfo->shadow[extra_id].req = *extra_ring_req;
|
rinfo->shadow[extra_id].req = *extra_ring_req;
|
||||||
|
|
||||||
if (max_grefs > 0)
|
if (new_persistent_gnts)
|
||||||
gnttab_free_grant_references(setup.gref_head);
|
gnttab_free_grant_references(setup.gref_head);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -906,8 +909,8 @@ static blk_status_t blkif_queue_rq(struct blk_mq_hw_ctx *hctx,
|
||||||
return BLK_STS_IOERR;
|
return BLK_STS_IOERR;
|
||||||
|
|
||||||
out_busy:
|
out_busy:
|
||||||
spin_unlock_irqrestore(&rinfo->ring_lock, flags);
|
|
||||||
blk_mq_stop_hw_queue(hctx);
|
blk_mq_stop_hw_queue(hctx);
|
||||||
|
spin_unlock_irqrestore(&rinfo->ring_lock, flags);
|
||||||
return BLK_STS_RESOURCE;
|
return BLK_STS_RESOURCE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue