Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

netfilter: flowtable: Make nf_flow_table_offload_add/del_cb inline

Currently, nf_flow_table_offload_add/del_cb are exported by nf_flow_table
module, therefore modules using them will have hard-dependency
on nf_flow_table and will require loading it all the time.

This can lead to an unnecessary overhead on systems that do not
use this API.

To relax the hard-dependency between the modules, we unexport these
functions and make them static inline.

Fixes: 978703f42549 ("netfilter: flowtable: Add API for registering to flow table events")
Signed-off-by: Alaa Hleihel <alaa@mellanox.com>
Reviewed-by: Roi Dayan <roid@mellanox.com>
Reviewed-by: Marcelo Ricardo Leitner <marcelo.leitner@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Alaa Hleihel and committed by
David S. Miller
505ee3a1 762f926d

+45 -49
+45 -4
include/net/netfilter/nf_flow_table.h
··· 161 161 struct flow_offload *flow_offload_alloc(struct nf_conn *ct); 162 162 void flow_offload_free(struct flow_offload *flow); 163 163 164 - int nf_flow_table_offload_add_cb(struct nf_flowtable *flow_table, 165 - flow_setup_cb_t *cb, void *cb_priv); 166 - void nf_flow_table_offload_del_cb(struct nf_flowtable *flow_table, 167 - flow_setup_cb_t *cb, void *cb_priv); 164 + static inline int 165 + nf_flow_table_offload_add_cb(struct nf_flowtable *flow_table, 166 + flow_setup_cb_t *cb, void *cb_priv) 167 + { 168 + struct flow_block *block = &flow_table->flow_block; 169 + struct flow_block_cb *block_cb; 170 + int err = 0; 171 + 172 + down_write(&flow_table->flow_block_lock); 173 + block_cb = flow_block_cb_lookup(block, cb, cb_priv); 174 + if (block_cb) { 175 + err = -EEXIST; 176 + goto unlock; 177 + } 178 + 179 + block_cb = flow_block_cb_alloc(cb, cb_priv, cb_priv, NULL); 180 + if (IS_ERR(block_cb)) { 181 + err = PTR_ERR(block_cb); 182 + goto unlock; 183 + } 184 + 185 + list_add_tail(&block_cb->list, &block->cb_list); 186 + 187 + unlock: 188 + up_write(&flow_table->flow_block_lock); 189 + return err; 190 + } 191 + 192 + static inline void 193 + nf_flow_table_offload_del_cb(struct nf_flowtable *flow_table, 194 + flow_setup_cb_t *cb, void *cb_priv) 195 + { 196 + struct flow_block *block = &flow_table->flow_block; 197 + struct flow_block_cb *block_cb; 198 + 199 + down_write(&flow_table->flow_block_lock); 200 + block_cb = flow_block_cb_lookup(block, cb, cb_priv); 201 + if (block_cb) { 202 + list_del(&block_cb->list); 203 + flow_block_cb_free(block_cb); 204 + } else { 205 + WARN_ON(true); 206 + } 207 + up_write(&flow_table->flow_block_lock); 208 + } 168 209 169 210 int flow_offload_route_init(struct flow_offload *flow, 170 211 const struct nf_flow_route *route);
-45
net/netfilter/nf_flow_table_core.c
··· 387 387 queue_delayed_work(system_power_efficient_wq, &flow_table->gc_work, HZ); 388 388 } 389 389 390 - int nf_flow_table_offload_add_cb(struct nf_flowtable *flow_table, 391 - flow_setup_cb_t *cb, void *cb_priv) 392 - { 393 - struct flow_block *block = &flow_table->flow_block; 394 - struct flow_block_cb *block_cb; 395 - int err = 0; 396 - 397 - down_write(&flow_table->flow_block_lock); 398 - block_cb = flow_block_cb_lookup(block, cb, cb_priv); 399 - if (block_cb) { 400 - err = -EEXIST; 401 - goto unlock; 402 - } 403 - 404 - block_cb = flow_block_cb_alloc(cb, cb_priv, cb_priv, NULL); 405 - if (IS_ERR(block_cb)) { 406 - err = PTR_ERR(block_cb); 407 - goto unlock; 408 - } 409 - 410 - list_add_tail(&block_cb->list, &block->cb_list); 411 - 412 - unlock: 413 - up_write(&flow_table->flow_block_lock); 414 - return err; 415 - } 416 - EXPORT_SYMBOL_GPL(nf_flow_table_offload_add_cb); 417 - 418 - void nf_flow_table_offload_del_cb(struct nf_flowtable *flow_table, 419 - flow_setup_cb_t *cb, void *cb_priv) 420 - { 421 - struct flow_block *block = &flow_table->flow_block; 422 - struct flow_block_cb *block_cb; 423 - 424 - down_write(&flow_table->flow_block_lock); 425 - block_cb = flow_block_cb_lookup(block, cb, cb_priv); 426 - if (block_cb) { 427 - list_del(&block_cb->list); 428 - flow_block_cb_free(block_cb); 429 - } else { 430 - WARN_ON(true); 431 - } 432 - up_write(&flow_table->flow_block_lock); 433 - } 434 - EXPORT_SYMBOL_GPL(nf_flow_table_offload_del_cb); 435 390 436 391 static int nf_flow_nat_port_tcp(struct sk_buff *skb, unsigned int thoff, 437 392 __be16 port, __be16 new_port)