2
0
mirror of https://github.com/openvswitch/ovs synced 2025-10-19 14:37:21 +00:00
Files
openvswitch/lib/worker.h
Ben Pfaff 70e4e586e4 worker: New library for breaking a daemon into multiple processes.
ovs-vswitchd is effectively a "soft real-time" process, because flows that
do not get set up quickly lead to packet loss or retransmission.  We've
done our best to keep it from blocking unnecessarily, but some operations
unavoidably block.  This new library allows a daemon to break itself up
into a main process and a worker process, connected by an RPC channel,
with the idea being that the main process will delegate any possibly
blocking operations to the worker.

This commit also modifies ovs-vswitchd to start a worker process, but it
does not actually introduce any uses for the worker process.  Upcoming
commits will add those.

Signed-off-by: Ben Pfaff <blp@nicira.com>
2012-07-18 10:30:49 -07:00

69 lines
2.5 KiB
C

/* Copyright (c) 2012 Nicira, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at:
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef WORKER_H
#define WORKER_H 1
/* Worker processes.
*
* Thes functions allow an OVS daemon to fork off a "worker process" to do
* tasks that may unavoidably block in the kernel. The worker executes remote
* procedure calls on behalf of the main process.
*
* Tasks that may unavoidably block in the kernel include writes to regular
* files, sends to Generic Netlink sockets (which as of this writing use a
* global lock), and other unusual operations.
*
* The worker functions *will* block if the finite buffer between a main
* process and its worker process fills up.
*/
#include <stdbool.h>
#include <stddef.h>
#include "compiler.h"
struct iovec;
struct ofpbuf;
/* The main process calls this function to start a worker. */
void worker_start(void);
/* Interface for main process to interact with the worker. */
typedef void worker_request_func(struct ofpbuf *request,
const int fds[], size_t n_fds);
typedef void worker_reply_func(struct ofpbuf *reply,
const int fds[], size_t n_fds, void *aux);
bool worker_is_running(void);
void worker_run(void);
void worker_wait(void);
void worker_request(const void *data, size_t size,
const int fds[], size_t n_fds,
worker_request_func *request_cb,
worker_reply_func *reply_cb, void *aux);
void worker_request_iovec(const struct iovec *iovs, size_t n_iovs,
const int fds[], size_t n_fds,
worker_request_func *request_cb,
worker_reply_func *reply_cb, void *aux);
/* Interfaces for RPC implementations (running in the worker process). */
void worker_reply(const void *data, size_t size,
const int fds[], size_t n_fds);
void worker_reply_iovec(const struct iovec *iovs, size_t n_iovs,
const int fds[], size_t n_fds);
#endif /* worker.h */