}
/* Sets number of upcall handler threads. The default is
- * (number of online cores - 1). */
+ * (number of online cores - 2). */
void
ofproto_set_n_handler_threads(unsigned limit)
{
if (limit) {
n_handler_threads = limit;
} else {
- n_handler_threads = MAX(1, sysconf(_SC_NPROCESSORS_ONLN) - 1);
+ int n_proc = sysconf(_SC_NPROCESSORS_ONLN);
+ n_handler_threads = n_proc > 2 ? n_proc - 2 : 1;
}
}
ovs_assert(list_is_empty(&ofproto->pending));
ovs_assert(!ofproto->n_pending);
- if (ofproto->meters) {
- meter_delete(ofproto, 1, ofproto->meter_features.max_meters);
- free(ofproto->meters);
- }
-
connmgr_destroy(ofproto->connmgr);
hmap_remove(&all_ofprotos, &ofproto->hmap_node);
return;
}
+ if (p->meters) {
+ meter_delete(p, 1, p->meter_features.max_meters);
+ p->meter_features.max_meters = 0;
+ free(p->meters);
+ p->meters = NULL;
+ }
+
ofproto_flush__(p);
HMAP_FOR_EACH_SAFE (ofport, next_ofport, hmap_node, &p->ports) {
ofport_destroy(ofport);
if (mm.command != OFPMC13_DELETE) {
/* Fails also when meters are not implemented by the provider. */
- if (!meter_id || meter_id > ofproto->meter_features.max_meters) {
+ if (meter_id == 0 || meter_id > OFPM13_MAX) {
error = OFPERR_OFPMMFC_INVALID_METER;
goto exit_free_bands;
+ } else if (meter_id > ofproto->meter_features.max_meters) {
+ error = OFPERR_OFPMMFC_OUT_OF_METERS;
+ goto exit_free_bands;
}
if (mm.meter.n_bands > ofproto->meter_features.max_bands) {
error = OFPERR_OFPMMFC_OUT_OF_BANDS;
OVS_REQ_WRLOCK(cls->rwlock) OVS_RELEASES(rule->rwlock)
{
classifier_remove(cls, &rule->cr);
- if (rule->meter_id) {
- list_remove(&rule->meter_list_node);
- }
cookies_remove(ofproto, rule);
eviction_group_remove_rule(rule);
ovs_mutex_lock(&ofproto->expirable_mutex);
ovs_mutex_unlock(&ofproto->expirable_mutex);
if (!list_is_empty(&rule->meter_list_node)) {
list_remove(&rule->meter_list_node);
+ list_init(&rule->meter_list_node);
}
ovs_rwlock_unlock(&rule->rwlock);
}