[ovs-dev] [Simple DB Stats 08/11] bridge: Make configuration database records valid all the time.
Justin Pettit
jpettit at nicira.com
Tue Jun 22 23:04:44 UTC 2010
Looks good.
--Justin
On Jun 10, 2010, at 5:14 PM, Ben Pfaff wrote:
> Before, it was possible for records in the configuration database to
> disappear, so all of the ovsrec pointers inside bridge structures had
> comments cautioning against their use except during reconfiguration. But
> now that the bridge has direct control over when ovsdb_idl_run() is called,
> it can ensure that bridge_reconfigure() is always called immediately
> whenever the IDL data structures change. That means that we can use the
> ovsrec configuration at any time after the reconfiguration process
> initializes them, not just during reconfiguration.
> ---
> vswitchd/bridge.c | 18 +++++++++---------
> 1 files changed, 9 insertions(+), 9 deletions(-)
>
> diff --git a/vswitchd/bridge.c b/vswitchd/bridge.c
> index f2d3baa..8be0f03 100644
> --- a/vswitchd/bridge.c
> +++ b/vswitchd/bridge.c
> @@ -82,12 +82,10 @@ struct iface {
> long long delay_expires; /* Time after which 'enabled' may change. */
>
> /* These members are valid only after bridge_reconfigure() causes them to
> - * be initialized.*/
> + * be initialized. */
> int dp_ifidx; /* Index within kernel datapath. */
> struct netdev *netdev; /* Network device. */
> bool enabled; /* May be chosen for flows? */
> -
> - /* This member is only valid *during* bridge_reconfigure(). */
> const struct ovsrec_interface *cfg;
> };
>
> @@ -125,6 +123,7 @@ struct port {
> int vlan; /* -1=trunk port, else a 12-bit VLAN ID. */
> unsigned long *trunks; /* Bitmap of trunked VLANs, if 'vlan' == -1.
> * NULL if all VLANs are trunked. */
> + const struct ovsrec_port *cfg;
> char *name;
>
> /* An ordinary bridge port has 1 interface.
> @@ -148,9 +147,6 @@ struct port {
> mirror_mask_t src_mirrors; /* Mirrors triggered when packet received. */
> mirror_mask_t dst_mirrors; /* Mirrors triggered when packet sent. */
> bool is_mirror_output_port; /* Does port mirroring send frames here? */
> -
> - /* This member is only valid *during* bridge_reconfigure(). */
> - const struct ovsrec_port *cfg;
> };
>
> #define DP_MAX_PORTS 255
> @@ -160,6 +156,7 @@ struct bridge {
> struct mac_learning *ml; /* MAC learning table. */
> bool sent_config_request; /* Successfully sent config request? */
> uint8_t default_ea[ETH_ADDR_LEN]; /* Default MAC. */
> + const struct ovsrec_bridge *cfg;
>
> /* OpenFlow switch processing. */
> struct ofproto *ofproto; /* OpenFlow switch. */
> @@ -192,9 +189,6 @@ struct bridge {
>
> /* Port mirroring. */
> struct mirror *mirrors[MAX_MIRRORS];
> -
> - /* This member is only valid *during* bridge_reconfigure(). */
> - const struct ovsrec_bridge *cfg;
> };
>
> /* List of all bridges. */
> @@ -1095,6 +1089,12 @@ bridge_run(void)
> ovsrec_open_vswitch_set_cur_cfg(cfg, cfg->next_cfg);
> ovsdb_idl_txn_commit(txn);
> ovsdb_idl_txn_destroy(txn); /* XXX */
> + } else {
> + /* We still need to reconfigure to avoid dangling pointers to
> + * now-destroyed ovsrec structures inside bridge data. */
> + static const struct ovsrec_open_vswitch null_cfg;
> +
> + bridge_reconfigure(&null_cfg);
> }
> }
> }
> --
> 1.7.1
>
>
> _______________________________________________
> dev mailing list
> dev at openvswitch.org
> http://openvswitch.org/mailman/listinfo/dev_openvswitch.org
More information about the dev
mailing list