[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [MirageOS-devel] wireshark capture of failed download from mirage-www on ARM



On 22 July 2014 04:00, Anil Madhavapeddy <anil@xxxxxxxxxx> wrote:
> On 21 Jul 2014, at 16:10, Thomas Leonard <talex5@xxxxxxxxx> wrote:
>
>> What are the rules about alignment for cstructs?
>>
>> Allocating the buffer like this works:
>>
>>  let data = Io_page.get 1 |> Io_page.to_cstruct
>>  let () = Cstruct.blit_from_string (Buffer.contents buffer) 0 data 0
>> (Buffer.length buffer)
>>
>> But using Cstruct.of_string doesn't. It does look like Netif assumes
>> the structs are page aligned. e.g.
>>
>>  if page.Cstruct.off + len > page_size then begin
>>    (* netback rejects packets that cross page boundaries *)
>>    let msg =
>>      Printf.sprintf "Invalid page: offset=%d, length=%d"
>> page.Cstruct.off len in
>>    print_endline msg;
>>    Lwt.fail (Failure msg)
>>  end else
>
> Argh, this is exactly the problem.  Netif requires page aligned buffers
> (in theory, sub-page grants are possible, but ill-advised for performance
> reasons).
>
> Cstruct.of_string calls Cstruct.create, which calls Bigarray.Array1.create
> which isn't page-aligned.  It does need to go through Io_page to ensure it's
> page-aligned.
>
> We don't protect this distinction using phantom types, and it's bitten us
> several times now through these hard-to-spot dynamic failures :-/
>
> Making Cstruct's always page aligned is too expensive for the 'casual'
> small Cstructs (as seen in OCaml TLS for example), so ensure your buffer
> originates from Io_page is the best bet for now.  An issue on how to
> ensure this is checked statically would be good to have (but involve
> a fair bit of mechanical code motion).

I notice that FLOW explicitly states that the buffer need not be page-aligned:

module type FLOW = sig
  type buffer
  (** Abstract type for a memory buffer that may not be page aligned. *)

  val write : flow -> buffer -> [`Ok of unit | `Eof | `Error of error ] io

Also, it can fail even if it is aligned:

S.TCPV4.write flow (Io_page.get 10 |> Io_page.to_cstruct)

gives

RX exn Failure("Invalid page: offset=2920, length=1460")

(presumably because splitting the pages into TCP-packet-sized chunks
loses the alignment)


-- 
Dr Thomas Leonard        http://0install.net/
GPG: 9242 9807 C985 3C07 44A6  8B9A AE07 8280 59A5 3CC1
GPG: DA98 25AE CAD0 8975 7CDA  BD8E 0713 3F96 CA74 D8BA

_______________________________________________
MirageOS-devel mailing list
MirageOS-devel@xxxxxxxxxxxxxxxxxxxx
http://lists.xenproject.org/cgi-bin/mailman/listinfo/mirageos-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.