Message ID | 874ndlmg0h.fsf@rustcorp.com.au (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Thu, May 30 2013, Rusty Russell wrote: > Jens Axboe <axboe@kernel.dk> writes: > > On Wed, Feb 27 2013, Rusty Russell wrote: > >> Aurelien Jarno <aurelien@aurel32.net> writes: > >> > Hi, > >> > > >> > I have noticed that virtio-rng only returns zero for kernels >= 2.6.33 > >> > built with CONFIG_HW_RANDOM=m. This is a bit much too predictable for a > >> > random generator ;-). > >> > >> Wow. Fortunately, all of SLES, RHEL, Ubuntu or Fedora set > >> CONFIG_HW_RANDOM=y. What do they know that we don't? > >> > >> Oops, looks like Debian testing: config-3.2.0-4-amd64:CONFIG_HW_RANDOM=m > >> > >> > The reason for that is virtio expects guest real addresses, while > >> > rng_core.ko (ie when built as a module) is passing a vmalloced buffer > >> > to the virtio-rng read function, declared as such: > >> > > >> > static u8 rng_buffer[SMP_CACHE_BYTES < 32 ? 32 : SMP_CACHE_BYTES] > >> > __cacheline_aligned; > >> > >> Yuck... It would be nice if this has oopsed. Jens, what about this patch? > >> > >> Cheers, > >> Rusty. > >> > >> Subject: scatterlist: sg_set_buf() argument must be in linear mapping. > >> > >> Signed-off-by: Rusty Russell <rusty@rustcorp.com.au> > >> > >> diff --git a/include/linux/scatterlist.h b/include/linux/scatterlist.h > >> index 4bd6c06..9365375 100644 > >> --- a/include/linux/scatterlist.h > >> +++ b/include/linux/scatterlist.h > >> @@ -111,6 +111,9 @@ static inline struct page *sg_page(struct scatterlist *sg) > >> static inline void sg_set_buf(struct scatterlist *sg, const void *buf, > >> unsigned int buflen) > >> { > >> +#ifdef CONFIG_DEBUG_SG > >> + BUG_ON(!virt_addr_valid(buf)); > >> +#endif > >> sg_set_page(sg, virt_to_page(buf), buflen, offset_in_page(buf)); > >> } > > > > Looks good to me, in lieu of being able to return an error. Want me to > > queue it up? > > > > -- > > Jens Axboe > > Ping? I haven't seen this go into Linus' tree... I forget if I didn't get a reply, or whether it just got lost! Queued up now, at least.
diff --git a/include/linux/scatterlist.h b/include/linux/scatterlist.h index 4bd6c06..9365375 100644 --- a/include/linux/scatterlist.h +++ b/include/linux/scatterlist.h @@ -111,6 +111,9 @@ static inline struct page *sg_page(struct scatterlist *sg) static inline void sg_set_buf(struct scatterlist *sg, const void *buf, unsigned int buflen) { +#ifdef CONFIG_DEBUG_SG + BUG_ON(!virt_addr_valid(buf)); +#endif sg_set_page(sg, virt_to_page(buf), buflen, offset_in_page(buf)); }