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

Re: [MirageOS-devel] MPL compiler and bigarray

[ccing the mirageos-devel list]

On 29 Jul 2014, at 10:29, Goswin von Brederlow <goswin-v-b@xxxxxx> wrote:
> I've looked at your melange paper [1] and it says that the MPL
> compiler will use a basis library for I/O and buffer management
> functions. You then show the data type for a light-weight packet
> environment record showing that the actual payload is stored in a
> string.
> I want to use MPL for a high througput protocol that involves lots of
> disk I/O with the linux AIO libarry as well and I need to use page
> aligned bigarrays for that.
> I'm wondering how flexible this is. Would it be easy to replace the
> string with a bigarray in the library or replace the library
> altogether? The advantage of a bigarray is that the data is allocated
> outside the ocaml heap and will never be moved by the GC. This allows
> using it in C stubs while the ocaml runtime lock is released or for
> DMA. Bigarrays can also be created to be page aligned or from an
> existing block of data. Which strings all of that requires copying the
> data.
> The MPL generated code is already fast despite the extra copying the
> string requires. I wonder how much using bigarrays for true zero-copy
> networking and I/O would gain on top of that.

Sorry about the delay getting back to you on this.

While it would be easy to replace MPL with a Bigarray rather than a
string, it's probably not worth the effort to resurrect that tool.

We're leaning towards lightweight views over Bigarrays via Cstruct
these days, and using GADTs+metaprogramming to convert packet grammars
into parsers.   The GADT portion of ASN1 parsing for example:

What's not fully integrated yet is the use of Metacaml or ppx/camlp4
to perform the metaprogramming.  MPL's introduction of concrete syntax
can then disappear, and packets can be manipulated directly in the
host language as an EDSL.

For simpler protocols like IPv4 or TCP parsing, Cstruct provides a
camlp4 extension that lets you write things like:

cstruct ipv4 {
  uint8_t        hlen_version;
  uint8_t        tos;
  uint16_t       len;
  uint16_t       id;
  uint16_t       off;
  uint8_t        ttl;
  uint8_t        proto;
  uint16_t       csum;
  uint8_t        src[4];
  uint8_t        dst[4]
} as big_endian

and retrieve the values from a Bigarray representation using the
efficient compiler builtins (4.01.0+) for integer conversions.
See https://github.com/mirage/ocaml-cstruct for more on that.


MirageOS-devel mailing list



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