Message ID | 20160728052917.GA811@gondor.apana.org.au (mailing list archive) |
---|---|
State | Accepted |
Delegated to: | Herbert Xu |
Headers | show |
Herbert Xu <herbert@gondor.apana.org.au> writes: > On Wed, Jul 27, 2016 at 11:05:05PM +0200, Nicolai Stange wrote: >> >> with linux-next-20160726, I get this: >> >> BUG: sleeping function called from invalid context at /mnt/scratch/nic/linux-next/mm/slab.h:388 > > Does this patch help? Yes, works like a charm now! >> I would have sent a patch, but there is another point which puzzles me >> in mpi_read_raw_from_sgl(): >> >> [...] >> const u8 *buff; >> [...] >> sg_miter_start(&miter, sgl, ents, SG_MITER_ATOMIC | SG_MITER_FROM_SG); >> >> lzeros = 0; >> len = 0; >> while (nbytes > 0) { >> while (len && !*buff) { >> lzeros++; >> len--; >> buff++; >> } >> >> >> Thus, buff isn't initialized before its first use? Or am I misreading >> something here? > > On the first entry len is zero therefore we will go to the end of the > loop and initialise buff. Hah! Thanks, although being obvious, I didn't see this... Thanks, Nicolai -- To unsubscribe from this list: send the line "unsubscribe linux-crypto" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/lib/mpi/mpicoder.c b/lib/mpi/mpicoder.c index c6272ae..5a0f75a 100644 --- a/lib/mpi/mpicoder.c +++ b/lib/mpi/mpicoder.c @@ -363,6 +363,9 @@ MPI mpi_read_raw_from_sgl(struct scatterlist *sgl, unsigned int nbytes) lzeros = 0; } + miter.consumed = lzeros; + sg_miter_stop(&miter); + nbytes -= lzeros; nbits = nbytes * 8; if (nbits > MAX_EXTERN_MPI_BITS) { @@ -390,7 +393,10 @@ MPI mpi_read_raw_from_sgl(struct scatterlist *sgl, unsigned int nbytes) z = BYTES_PER_MPI_LIMB - nbytes % BYTES_PER_MPI_LIMB; z %= BYTES_PER_MPI_LIMB; - for (;;) { + while (sg_miter_next(&miter)) { + buff = miter.addr; + len = miter.length; + for (x = 0; x < len; x++) { a <<= 8; a |= *buff++; @@ -400,12 +406,6 @@ MPI mpi_read_raw_from_sgl(struct scatterlist *sgl, unsigned int nbytes) } } z += x; - - if (!sg_miter_next(&miter)) - break; - - buff = miter.addr; - len = miter.length; } return val;