|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH V9 08/12] remus: implement the API to buffer/release packages
Yang Hongyang writes ("[PATCH V9 08/12] remus: implement the API to
buffer/release packages"):
> This patch implements two APIs:
> 1. netbuf_start_new_epoch()
> It marks a new epoch. The packages before this epoch will
> be flushed, and the packages after this epoch will be buffered.
> It will be called after the guest is suspended.
> 2. netbuf_release_prev_epoch()
> It flushes the buffered packages to client, and it will be
> called when a checkpoint finishes.
Thanks.
(BTW "packages" should be "packets" throughout.)
> diff --git a/tools/libxl/libxl_netbuffer.c b/tools/libxl/libxl_netbuffer.c
> index a5f2b9a..4b4bc9d 100644
> --- a/tools/libxl/libxl_netbuffer.c
> +++ b/tools/libxl/libxl_netbuffer.c
> @@ -416,9 +416,66 @@ static int nic_teardown(libxl__remus_device *remus_dev,
> return REMUS_INPROGRESS;
> }
>
> +/* The buffer_op's value, not the value passed to kernel */
> +enum {
> + tc_buffer_start,
> + tc_buffer_release
> +};
The comment refers to a "buffer_op" variable which is not nearby. I
suggest replacing the comment with
/* Internal value for libxl, not the value passed to kernel */
Are these names "tc_" not possibly clashing with some future kernel
things ?
> +static int remus_netbuf_op(libxl__remus_device_nic *remus_nic,
> + libxl__remus_netbuf_state *netbuf_state,
> + int buffer_op)
> +{
> + int ret;
> +
> + STATE_AO_GC(netbuf_state->ao);
> +
> + if (buffer_op == tc_buffer_start)
> + ret = rtnl_qdisc_plug_buffer(remus_nic->qdisc);
> + else
> + ret = rtnl_qdisc_plug_release_one(remus_nic->qdisc);
If you're going to have an enum here, I think you should use
"switch", and explicitly abort() on unknown values. Otherwise when a
new op is invented this code will silently do the wrong thing.
> + if (!ret) {
This is an opaque error handling style. Please use libxl's standard
"goto out" style.
> + ret = rtnl_qdisc_add(netbuf_state->nlsock,
> + remus_nic->qdisc,
> + NLM_F_REQUEST);
> + if (ret)
> + goto out;
> + }
> +
> + return REMUS_OK;
Please don't invent your own error numbers. Please use the existing
libxl error code type. Feel free to add new values if you need them.
> +out:
> + LOG(ERROR, "Remus: cannot do netbuf op %s on %s:%s",
> + ((buffer_op == tc_buffer_start) ?
> + "start_new_epoch" : "release_prev_epoch"),
Perhaps there should be a static const array of these strings. At the
very least you should make sure this code handles the _release op
explicitly and crashes if the value is not recognised.
> libxl__remus_device_type remus_device_nic = {
> .init = nic_init,
> .destroy = nic_destroy,
> + .postsuspend = netbuf_start_new_epoch,
> + .commit = netbuf_release_prev_epoch,
Presumably, this is the patch where network buffering actually starts
to happen. So should this come with a documentation change removing
any warnings about remus and networking ?
Thanks,
Ian.
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |