+static void
+vlog_unixctl_close(struct unixctl_conn *conn, int argc OVS_UNUSED,
+ const char *argv[] OVS_UNUSED, void *aux OVS_UNUSED)
+{
+ ovs_mutex_lock(&log_file_mutex);
+ if (log_fd >= 0) {
+ close(log_fd);
+ log_fd = -1;
+
+ async_append_destroy(log_writer);
+ log_writer = NULL;
+
+ struct vlog_module *mp;
+ LIST_FOR_EACH (mp, list, &vlog_modules) {
+ update_min_level(mp);
+ }
+ }
+ ovs_mutex_unlock(&log_file_mutex);
+
+ unixctl_command_reply(conn, NULL);
+}
+
+static void
+set_all_rate_limits(bool enable)
+{
+ struct vlog_module *mp;
+
+ ovs_mutex_lock(&log_file_mutex);
+ LIST_FOR_EACH (mp, list, &vlog_modules) {
+ mp->honor_rate_limits = enable;
+ }
+ ovs_mutex_unlock(&log_file_mutex);
+}
+
+static void
+set_rate_limits(struct unixctl_conn *conn, int argc,
+ const char *argv[], bool enable)
+{
+ if (argc > 1) {
+ int i;
+
+ for (i = 1; i < argc; i++) {
+ if (!strcasecmp(argv[i], "ANY")) {
+ set_all_rate_limits(enable);
+ } else {
+ struct vlog_module *module = vlog_module_from_name(argv[i]);
+ if (!module) {
+ unixctl_command_reply_error(conn, "unknown module");
+ return;
+ }
+ module->honor_rate_limits = enable;
+ }
+ }
+ } else {
+ set_all_rate_limits(enable);
+ }
+ unixctl_command_reply(conn, NULL);
+}
+
+static void
+vlog_enable_rate_limit(struct unixctl_conn *conn, int argc,
+ const char *argv[], void *aux OVS_UNUSED)
+{
+ set_rate_limits(conn, argc, argv, true);
+}
+
+static void
+vlog_disable_rate_limit(struct unixctl_conn *conn, int argc,
+ const char *argv[], void *aux OVS_UNUSED)
+{
+ set_rate_limits(conn, argc, argv, false);
+}
+