Commit c46f2334 authored by Jens Axboe's avatar Jens Axboe Committed by Jens Axboe

[SG] Get rid of __sg_mark_end()

sg_mark_end() overwrites the page_link information, but all users want
__sg_mark_end() behaviour where we just set the end bit. That is the most
natural way to use the sg list, since you'll fill it in and then mark the
end point.

So change sg_mark_end() to only set the termination bit. Add a sg_magic
debug check as well, and clear a chain pointer if it is set.
Signed-off-by: default avatarJens Axboe <jens.axboe@oracle.com>
parent 87ae9afd
...@@ -1369,7 +1369,7 @@ int blk_rq_map_sg(struct request_queue *q, struct request *rq, ...@@ -1369,7 +1369,7 @@ int blk_rq_map_sg(struct request_queue *q, struct request *rq,
} /* segments in rq */ } /* segments in rq */
if (sg) if (sg)
__sg_mark_end(sg); sg_mark_end(sg);
return nsegs; return nsegs;
} }
......
...@@ -785,7 +785,7 @@ struct scatterlist *scsi_alloc_sgtable(struct scsi_cmnd *cmd, gfp_t gfp_mask) ...@@ -785,7 +785,7 @@ struct scatterlist *scsi_alloc_sgtable(struct scsi_cmnd *cmd, gfp_t gfp_mask)
* end-of-list * end-of-list
*/ */
if (!left) if (!left)
sg_mark_end(sgl, this); sg_mark_end(&sgl[this - 1]);
/* /*
* don't allow subsequent mempool allocs to sleep, it would * don't allow subsequent mempool allocs to sleep, it would
......
...@@ -188,21 +188,23 @@ static inline void sg_chain(struct scatterlist *prv, unsigned int prv_nents, ...@@ -188,21 +188,23 @@ static inline void sg_chain(struct scatterlist *prv, unsigned int prv_nents,
/** /**
* sg_mark_end - Mark the end of the scatterlist * sg_mark_end - Mark the end of the scatterlist
* @sgl: Scatterlist * @sg: SG entryScatterlist
* @nents: Number of entries in sgl
* *
* Description: * Description:
* Marks the last entry as the termination point for sg_next() * Marks the passed in sg entry as the termination point for the sg
* table. A call to sg_next() on this entry will return NULL.
* *
**/ **/
static inline void sg_mark_end(struct scatterlist *sgl, unsigned int nents) static inline void sg_mark_end(struct scatterlist *sg)
{
sgl[nents - 1].page_link = 0x02;
}
static inline void __sg_mark_end(struct scatterlist *sg)
{ {
#ifdef CONFIG_DEBUG_SG
BUG_ON(sg->sg_magic != SG_MAGIC);
#endif
/*
* Set termination bit, clear potential chain bit
*/
sg->page_link |= 0x02; sg->page_link |= 0x02;
sg->page_link &= ~0x01;
} }
/** /**
...@@ -218,7 +220,6 @@ static inline void __sg_mark_end(struct scatterlist *sg) ...@@ -218,7 +220,6 @@ static inline void __sg_mark_end(struct scatterlist *sg)
static inline void sg_init_table(struct scatterlist *sgl, unsigned int nents) static inline void sg_init_table(struct scatterlist *sgl, unsigned int nents)
{ {
memset(sgl, 0, sizeof(*sgl) * nents); memset(sgl, 0, sizeof(*sgl) * nents);
sg_mark_end(sgl, nents);
#ifdef CONFIG_DEBUG_SG #ifdef CONFIG_DEBUG_SG
{ {
unsigned int i; unsigned int i;
...@@ -226,6 +227,7 @@ static inline void sg_init_table(struct scatterlist *sgl, unsigned int nents) ...@@ -226,6 +227,7 @@ static inline void sg_init_table(struct scatterlist *sgl, unsigned int nents)
sgl[i].sg_magic = SG_MAGIC; sgl[i].sg_magic = SG_MAGIC;
} }
#endif #endif
sg_mark_end(&sgl[nents - 1]);
} }
/** /**
......
...@@ -2095,7 +2095,7 @@ int skb_to_sgvec(struct sk_buff *skb, struct scatterlist *sg, int offset, int le ...@@ -2095,7 +2095,7 @@ int skb_to_sgvec(struct sk_buff *skb, struct scatterlist *sg, int offset, int le
{ {
int nsg = __skb_to_sgvec(skb, sg, offset, len); int nsg = __skb_to_sgvec(skb, sg, offset, len);
__sg_mark_end(&sg[nsg - 1]); sg_mark_end(&sg[nsg - 1]);
return nsg; return nsg;
} }
......
...@@ -1083,7 +1083,7 @@ static int tcp_v4_do_calc_md5_hash(char *md5_hash, struct tcp_md5sig_key *key, ...@@ -1083,7 +1083,7 @@ static int tcp_v4_do_calc_md5_hash(char *md5_hash, struct tcp_md5sig_key *key,
sg_set_buf(&sg[block++], key->key, key->keylen); sg_set_buf(&sg[block++], key->key, key->keylen);
nbytes += key->keylen; nbytes += key->keylen;
__sg_mark_end(&sg[block - 1]); sg_mark_end(&sg[block - 1]);
/* Now store the Hash into the packet */ /* Now store the Hash into the packet */
err = crypto_hash_init(desc); err = crypto_hash_init(desc);
......
...@@ -781,7 +781,7 @@ static int tcp_v6_do_calc_md5_hash(char *md5_hash, struct tcp_md5sig_key *key, ...@@ -781,7 +781,7 @@ static int tcp_v6_do_calc_md5_hash(char *md5_hash, struct tcp_md5sig_key *key,
sg_set_buf(&sg[block++], key->key, key->keylen); sg_set_buf(&sg[block++], key->key, key->keylen);
nbytes += key->keylen; nbytes += key->keylen;
__sg_mark_end(&sg[block - 1]); sg_mark_end(&sg[block - 1]);
/* Now store the hash into the packet */ /* Now store the hash into the packet */
err = crypto_hash_init(desc); err = crypto_hash_init(desc);
......
...@@ -702,7 +702,7 @@ static void rxkad_sg_set_buf2(struct scatterlist sg[2], ...@@ -702,7 +702,7 @@ static void rxkad_sg_set_buf2(struct scatterlist sg[2],
nsg++; nsg++;
} }
__sg_mark_end(&sg[nsg - 1]); sg_mark_end(&sg[nsg - 1]);
ASSERTCMP(sg[0].length + sg[1].length, ==, buflen); ASSERTCMP(sg[0].length + sg[1].length, ==, buflen);
} }
......
...@@ -211,8 +211,8 @@ encryptor(struct scatterlist *sg, void *data) ...@@ -211,8 +211,8 @@ encryptor(struct scatterlist *sg, void *data)
if (thislen == 0) if (thislen == 0)
return 0; return 0;
__sg_mark_end(&desc->infrags[desc->fragno - 1]); sg_mark_end(&desc->infrags[desc->fragno - 1]);
__sg_mark_end(&desc->outfrags[desc->fragno - 1]); sg_mark_end(&desc->outfrags[desc->fragno - 1]);
ret = crypto_blkcipher_encrypt_iv(&desc->desc, desc->outfrags, ret = crypto_blkcipher_encrypt_iv(&desc->desc, desc->outfrags,
desc->infrags, thislen); desc->infrags, thislen);
...@@ -293,7 +293,7 @@ decryptor(struct scatterlist *sg, void *data) ...@@ -293,7 +293,7 @@ decryptor(struct scatterlist *sg, void *data)
if (thislen == 0) if (thislen == 0)
return 0; return 0;
__sg_mark_end(&desc->frags[desc->fragno - 1]); sg_mark_end(&desc->frags[desc->fragno - 1]);
ret = crypto_blkcipher_decrypt_iv(&desc->desc, desc->frags, ret = crypto_blkcipher_decrypt_iv(&desc->desc, desc->frags,
desc->frags, thislen); desc->frags, thislen);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment