[ovs-dev] [branch-1.1 1/6] dpif-linux: Recycle leaked ports.

Ethan Jackson ethan at nicira.com
Tue May 10 19:39:22 UTC 2011


I'm fine with this moving to branch 1.1 as well.

Ethan

On Tue, May 10, 2011 at 11:08, Ben Pfaff <blp at nicira.com> wrote:
> From: Ethan Jackson <ethan at nicira.com>
>
> When ports are deleted from the datapath they need to be added to
> an LRU list maintained in dpif-linux so they may be reallocated.
> When using vswitchd to delete the ports this happens automatically.
> However, if a port is deleted directly from the datapath it is
> never reclaimed by dpif-linux.  If this happens often, eventually
> no ports will be available for allocation and dpif-linux will fall
> back to using the old, kernel implemented, allocation strategy.
>
> This commit fixes the problem by automatically reclaiming ports
> missing from the datapath whenever the list of ports in the
> datapath is dumped.
>
> Bug #2140.
> ---
>  lib/dpif-linux.c |   24 +++++++++++++++++++++++-
>  1 files changed, 23 insertions(+), 1 deletions(-)
>
> diff --git a/lib/dpif-linux.c b/lib/dpif-linux.c
> index fed81b7..d71e414 100644
> --- a/lib/dpif-linux.c
> +++ b/lib/dpif-linux.c
> @@ -472,6 +472,8 @@ dpif_linux_flow_flush(struct dpif *dpif_)
>
>  struct dpif_linux_port_state {
>     struct nl_dump dump;
> +    unsigned long *port_bitmap; /* Ports in the datapath. */
> +    bool complete;              /* Dump completed without error. */
>  };
>
>  static int
> @@ -483,6 +485,8 @@ dpif_linux_port_dump_start(const struct dpif *dpif_, void **statep)
>     struct ofpbuf *buf;
>
>     *statep = state = xmalloc(sizeof *state);
> +    state->port_bitmap = bitmap_allocate(LRU_MAX_PORTS);
> +    state->complete = false;
>
>     dpif_linux_vport_init(&request);
>     request.cmd = ODP_DP_CMD_GET;
> @@ -506,6 +510,7 @@ dpif_linux_port_dump_next(const struct dpif *dpif OVS_UNUSED, void *state_,
>     int error;
>
>     if (!nl_dump_next(&state->dump, &buf)) {
> +        state->complete = true;
>         return EOF;
>     }
>
> @@ -514,6 +519,10 @@ dpif_linux_port_dump_next(const struct dpif *dpif OVS_UNUSED, void *state_,
>         return error;
>     }
>
> +    if (vport.port_no < LRU_MAX_PORTS) {
> +        bitmap_set1(state->port_bitmap, vport.port_no);
> +    }
> +
>     dpif_port->name = (char *) vport.name;
>     dpif_port->type = (char *) netdev_vport_get_netdev_type(&vport);
>     dpif_port->port_no = vport.port_no;
> @@ -521,10 +530,23 @@ dpif_linux_port_dump_next(const struct dpif *dpif OVS_UNUSED, void *state_,
>  }
>
>  static int
> -dpif_linux_port_dump_done(const struct dpif *dpif OVS_UNUSED, void *state_)
> +dpif_linux_port_dump_done(const struct dpif *dpif_, void *state_)
>  {
> +    struct dpif_linux *dpif = dpif_linux_cast(dpif_);
>     struct dpif_linux_port_state *state = state_;
>     int error = nl_dump_done(&state->dump);
> +
> +    if (state->complete) {
> +        uint16_t i;
> +
> +        for (i = 0; i < LRU_MAX_PORTS; i++) {
> +            if (!bitmap_is_set(state->port_bitmap, i)) {
> +                dpif_linux_push_port(dpif, i);
> +            }
> +        }
> +    }
> +
> +    free(state->port_bitmap);
>     free(state);
>     return error;
>  }
> --
> 1.7.4.4
>
>



More information about the dev mailing list