This file contains functions for constructing and destructing homa structs. Signed-off-by: John Ousterhout --- Changes for v10: * Remove log messages after alloc errors Changes for v9: * Add support for homa_net objects * Use new homa_clock abstraction layer * Various name improvements (e.g. use "alloc" instead of "new" for functions that allocate memory) Changes for v8: * Accommodate homa_pacer refactoring Changes for v7: * Make Homa a pernet subsystem * Add support for tx memory accounting * Remove "lock_slow" functions, which don't add functionality in this patch series * Use u64 and __u64 properly --- net/homa/homa_impl.h | 6 +++ net/homa/homa_utils.c | 121 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 127 insertions(+) create mode 100644 net/homa/homa_utils.c diff --git a/net/homa/homa_impl.h b/net/homa/homa_impl.h index a03ee6ca3403..72d646f70381 100644 --- a/net/homa/homa_impl.h +++ b/net/homa/homa_impl.h @@ -379,12 +379,18 @@ static inline bool homa_make_header_avl(struct sk_buff *skb) extern unsigned int homa_net_id; +void homa_destroy(struct homa *homa); int homa_fill_data_interleaved(struct homa_rpc *rpc, struct sk_buff *skb, struct iov_iter *iter); +int homa_init(struct homa *homa); int homa_message_out_fill(struct homa_rpc *rpc, struct iov_iter *iter, int xmit); void homa_message_out_init(struct homa_rpc *rpc, int length); +void homa_net_destroy(struct homa_net *hnet); +int homa_net_init(struct homa_net *hnet, struct net *net, + struct homa *homa); void homa_rpc_handoff(struct homa_rpc *rpc); +void homa_spin(int ns); struct sk_buff *homa_tx_data_pkt_alloc(struct homa_rpc *rpc, struct iov_iter *iter, int offset, int length, int max_seg_data); diff --git a/net/homa/homa_utils.c b/net/homa/homa_utils.c new file mode 100644 index 000000000000..75cedb55cad0 --- /dev/null +++ b/net/homa/homa_utils.c @@ -0,0 +1,121 @@ +// SPDX-License-Identifier: BSD-2-Clause + +/* This file contains miscellaneous utility functions for Homa, such + * as initializing and destroying homa structs. + */ + +#include "homa_impl.h" +#include "homa_pacer.h" +#include "homa_peer.h" +#include "homa_rpc.h" +#include "homa_stub.h" + +/** + * homa_init() - Constructor for homa objects. + * @homa: Object to initialize. + * + * Return: 0 on success, or a negative errno if there was an error. Even + * if an error occurs, it is safe (and necessary) to call + * homa_destroy at some point. + */ +int homa_init(struct homa *homa) +{ + int err; + + memset(homa, 0, sizeof(*homa)); + + atomic64_set(&homa->next_outgoing_id, 2); + homa->pacer = homa_pacer_alloc(homa); + if (IS_ERR(homa->pacer)) { + err = PTR_ERR(homa->pacer); + homa->pacer = NULL; + return err; + } + homa->peertab = homa_peer_alloc_peertab(); + if (IS_ERR(homa->peertab)) { + err = PTR_ERR(homa->peertab); + homa->peertab = NULL; + return err; + } + homa->socktab = kmalloc(sizeof(*homa->socktab), GFP_KERNEL); + if (!homa->socktab) + return -ENOMEM; + homa_socktab_init(homa->socktab); + + /* Wild guesses to initialize configuration values... */ + homa->resend_ticks = 5; + homa->resend_interval = 5; + homa->timeout_ticks = 100; + homa->timeout_resends = 5; + homa->request_ack_ticks = 2; + homa->reap_limit = 10; + homa->dead_buffs_limit = 5000; + homa->max_gso_size = 10000; + homa->wmem_max = 100000000; + homa->bpage_lease_usecs = 10000; + return 0; +} + +/** + * homa_destroy() - Destructor for homa objects. + * @homa: Object to destroy. It is safe if this object has already + * been previously destroyed. + */ +void homa_destroy(struct homa *homa) +{ + /* The order of the following cleanups matters! */ + if (homa->socktab) { + homa_socktab_destroy(homa->socktab, NULL); + kfree(homa->socktab); + homa->socktab = NULL; + } + if (homa->pacer) { + homa_pacer_free(homa->pacer); + homa->pacer = NULL; + } + if (homa->peertab) { + homa_peer_free_peertab(homa->peertab); + homa->peertab = NULL; + } +} + +/** + * homa_net_init() - Initialize a new struct homa_net as a per-net subsystem. + * @hnet: Struct to initialzie. + * @net: The network namespace the struct will be associated with. + * @homa: The main Homa data structure to use for the net. + * Return: 0 on success, otherwise a negative errno. + */ +int homa_net_init(struct homa_net *hnet, struct net *net, struct homa *homa) +{ + memset(hnet, 0, sizeof(*hnet)); + hnet->net = net; + hnet->homa = homa; + hnet->prev_default_port = HOMA_MIN_DEFAULT_PORT - 1; + return 0; +} + +/** + * homa_net_destroy() - Release any resources associated with a homa_net. + * @hnet: Object to destroy; must not be used again after this function + * returns. + */ +void homa_net_destroy(struct homa_net *hnet) +{ + homa_socktab_destroy(hnet->homa->socktab, hnet); + homa_peer_free_net(hnet); +} + +/** + * homa_spin() - Delay (without sleeping) for a given time interval. + * @ns: How long to delay (in nanoseconds) + */ +void homa_spin(int ns) +{ + u64 end; + + end = homa_clock() + homa_ns_to_cycles(ns); + while (homa_clock() < end) + /* Empty loop body.*/ + ; +} -- 2.43.0