All of lore.kernel.org
 help / color / mirror / Atom feed
From: Patrick McHardy <kaber@trash.net>
To: Eric Leblond <eric@inl.fr>
Cc: netfilter-devel@vger.kernel.org
Subject: Re: [PATCH 1/7] netfilter: use a linked list of loggers.
Date: Wed, 11 Feb 2009 15:13:40 +0100	[thread overview]
Message-ID: <4992DD14.8050906@trash.net> (raw)
In-Reply-To: <1234213876-8176-1-git-send-email-eric@inl.fr>

Eric Leblond wrote:
> This patch modifies nf_log to use a linked list of loggers for each
> protocol. It also separate registration and binding. To be used as
> logging module, a module has to register calling nf_log_register()
> and to bind to a protocol it has to call nf_log_bind_pf().
> 
> Signed-off-by: Eric Leblond <eric@inl.fr>
> ---
>  include/net/netfilter/nf_log.h |   10 +++-
>  net/netfilter/nf_log.c         |  107 +++++++++++++++++++++++++++++++---------
>  2 files changed, 91 insertions(+), 26 deletions(-)
> 
> diff --git a/net/netfilter/nf_log.c b/net/netfilter/nf_log.c
> index fa8ae5d..8a5e4aa 100644
> --- a/net/netfilter/nf_log.c
> +++ b/net/netfilter/nf_log.c
> @@ -14,13 +14,25 @@
>     LOG target modules */
>  
>  #define NF_LOG_PREFIXLEN		128
> +#define NFLOGGER_NAME_LEN		12

Just wondering what this limit is based on, I can't seem to
fine anything requiring a limit at all since the names are
const char *.

>  static const struct nf_logger *nf_loggers[NFPROTO_NUMPROTO] __read_mostly;
> -static DEFINE_MUTEX(nf_log_mutex);
> +static struct list_head nf_loggers_l[NFPROTO_NUMPROTO] __read_mostly;
> +static DEFINE_SPINLOCK(nf_log_lock);

I don't understand how locking is supposed to work now. You change
the mutex to a spinlock and use it with _bh everywhere, yet I don't
see a single spot thats called outside of process context and the
RCU assignments are still present.

The users of nf_log_register are also not converted simultaneously,
so this patch breaks bisection.

> @@ -29,50 +41,91 @@ int nf_log_register(u_int8_t pf, const struct nf_logger *logger)
>  
>  	/* Any setup of logging members must be done before
>  	 * substituting pointer. */
> -	ret = mutex_lock_interruptible(&nf_log_mutex);
> -	if (ret < 0)
> -		return ret;
> -
> -	if (!nf_loggers[pf])
> -		rcu_assign_pointer(nf_loggers[pf], logger);
> -	else if (nf_loggers[pf] == logger)
> -		ret = -EEXIST;
> -	else
> -		ret = -EBUSY;
> -
> -	mutex_unlock(&nf_log_mutex);
> +	spin_lock_bh(&nf_log_lock);
> +
> +	ret = -EEXIST;
> +	if (pf == NFPROTO_UNSPEC) {
> +		int i;
> +		for (i = NFPROTO_UNSPEC; i < NFPROTO_NUMPROTO; i++) {
> +			if (__find_logger(i, logger->name) == NULL) {
> +				ret = 0;
> +				INIT_LIST_HEAD(&(logger->list[i]));

This is not necessary, list_add_* doesn't require the new element
to be initialized. Also please remove the unneeded parens (same
remarks for below).

> +				list_add_tail(&(logger->list[i]),
> +						  &(nf_loggers_l[i]));
> +			}
> +		}
> +	} else {
> +		if (__find_logger(pf, logger->name) == NULL) {
> +			ret = 0;
> +			INIT_LIST_HEAD(&(logger->list[pf]));
> +			/* register at end of list to honor first register win */
> +			list_add_tail(&(logger->list[pf]),
> +					  &nf_loggers_l[pf]);
> +		}
> +	}
> +
> +	spin_unlock_bh(&nf_log_lock);
>  	return ret;
>  }
>  EXPORT_SYMBOL(nf_log_register);
>  
>  void nf_log_unregister_pf(u_int8_t pf)
>  {
> +	struct nf_logger *e;
>  	if (pf >= ARRAY_SIZE(nf_loggers))
>  		return;
> -	mutex_lock(&nf_log_mutex);
> -	rcu_assign_pointer(nf_loggers[pf], NULL);
> -	mutex_unlock(&nf_log_mutex);
> +	spin_lock_bh(&nf_log_lock);
> +	list_for_each_entry(e, &(nf_loggers_l[pf]), list[pf])
> +		list_del(&(e->list[pf]));
> +	spin_unlock_bh(&nf_log_lock);
>  
>  	/* Give time to concurrent readers. */
>  	synchronize_rcu();
>  }
>  EXPORT_SYMBOL(nf_log_unregister_pf);
>  
> -void nf_log_unregister(const struct nf_logger *logger)
> +void nf_log_unregister(struct nf_logger *logger)
>  {
>  	int i;
> +	struct nf_logger *llog;
>  
> -	mutex_lock(&nf_log_mutex);
> +	spin_lock_bh(&nf_log_lock);
>  	for (i = 0; i < ARRAY_SIZE(nf_loggers); i++) {
> -		if (nf_loggers[i] == logger)
> -			rcu_assign_pointer(nf_loggers[i], NULL);
> +		llog = __find_logger(i, logger->name);
> +		if (llog) {
> +			const struct nf_logger *c_logger = rcu_dereference(nf_loggers[i]);
> +			if (c_logger == llog)
> +				rcu_assign_pointer(nf_loggers[i], NULL);
> +			list_del(&(logger->list[i]));
> +		}
>  	}
> -	mutex_unlock(&nf_log_mutex);
> +	spin_unlock_bh(&nf_log_lock);
>  
>  	synchronize_rcu();
>  }
>  EXPORT_SYMBOL(nf_log_unregister);
>  
> +int nf_log_bind_pf(u_int8_t pf, const struct nf_logger *logger)
> +{
> +	if (__find_logger(pf, logger->name) == NULL)
> +		return -1;
> +
> +	spin_lock_bh(&nf_log_lock);
> +	rcu_assign_pointer(nf_loggers[pf], logger);
> +	spin_unlock_bh(&nf_log_lock);
> +	return 0;
> +}
> +EXPORT_SYMBOL(nf_log_bind_pf);
> +
> +int nf_log_unbind_pf(u_int8_t pf)
> +{
> +	spin_lock_bh(&nf_log_lock);
> +	rcu_assign_pointer(nf_loggers[pf], NULL);
> +	spin_unlock_bh(&nf_log_lock);
> +	return 0;
> +}
> +EXPORT_SYMBOL(nf_log_unbind_pf);
> +
>  void nf_log_packet(u_int8_t pf,
>  		   unsigned int hooknum,
>  		   const struct sk_buff *skb,
> @@ -163,10 +216,16 @@ static const struct file_operations nflog_file_ops = {
>  
>  int __init netfilter_log_init(void)
>  {
> +	int i;
>  #ifdef CONFIG_PROC_FS
>  	if (!proc_create("nf_log", S_IRUGO,
>  			 proc_net_netfilter, &nflog_file_ops))
>  		return -1;
>  #endif
> +
> +	for (i = NFPROTO_UNSPEC; i < NFPROTO_NUMPROTO; i++) {
> +		INIT_LIST_HEAD(&(nf_loggers_l[i]));
> +	}

Please no parens for single statements.

  reply	other threads:[~2009-02-11 14:13 UTC|newest]

Thread overview: 59+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-01-02 17:04 [netfilter 0/5] nf_log refactoring Eric Leblond
2009-01-02 17:07 ` [PATCH 1/5] netfilter: use a linked list of loggers Eric Leblond
2009-01-02 17:07 ` [PATCH 2/5] netfilter: suppress nf_log_unregister_pf function Eric Leblond
2009-01-02 17:07 ` [PATCH 3/5] netfilter: convert logger modules to new API Eric Leblond
2009-01-07  7:17   ` Eric Leblond
2009-01-07 20:05     ` [PATCH 1/6] netfilter: use a linked list of loggers Eric Leblond
2009-01-07 20:05     ` [PATCH 2/6] netfilter: suppress nf_log_unregister_pf function Eric Leblond
2009-01-07 20:05     ` [PATCH 3/6] netfilter: bind at registration if no logger is already set Eric Leblond
2009-01-07 20:05     ` [PATCH 4/6] netfilter: convert logger modules to new API Eric Leblond
2009-01-07 23:53       ` Jan Engelhardt
2009-01-07 20:05     ` [PATCH 5/6] netfilter: print the list of register loggers Eric Leblond
2009-01-07 23:56       ` Jan Engelhardt
2009-01-08 22:01         ` [PATCH 0/6] rework of nf_log refactoring Eric Leblond
2009-01-08 22:03           ` [PATCH 1/6] netfilter: use a linked list of loggers Eric Leblond
2009-01-08 22:03           ` [PATCH 2/6] netfilter: suppress nf_log_unregister_pf function Eric Leblond
2009-01-08 22:03           ` [PATCH 3/6] netfilter: bind at registration if no logger is already set Eric Leblond
2009-01-08 22:03           ` [PATCH 4/6] netfilter: convert logger modules to new API Eric Leblond
2009-01-08 22:03           ` [PATCH 5/6] netfilter: print the list of register loggers Eric Leblond
2009-01-08 22:03           ` [PATCH 6/6] netfilter: sysctl support of logger choice Eric Leblond
2009-01-12  7:14           ` [PATCH] netfilter: desactivate nf_log logger via sysctl Eric Leblond
2009-02-09 17:43           ` [PATCH 0/6] rework of nf_log refactoring Patrick McHardy
2009-02-09 21:08             ` Eric Leblond
2009-02-09 21:11               ` [PATCH 1/7] netfilter: use a linked list of loggers Eric Leblond
2009-02-11 14:13                 ` Patrick McHardy [this message]
2009-02-15 12:33                   ` Eric Leblond
2009-02-15 12:37                     ` [PATCH 1/4] " Eric Leblond
2009-02-18 16:08                       ` Patrick McHardy
2009-02-15 12:37                     ` [PATCH 2/4] netfilter: suppress now unused nf_log_unregister_pf() function Eric Leblond
2009-02-18 16:10                       ` Patrick McHardy
2009-02-15 12:37                     ` [PATCH 3/4] netfilter: print the list of register loggers Eric Leblond
2009-02-16 17:01                       ` Jan Engelhardt
2009-02-16 17:11                         ` Patrick McHardy
2009-02-15 12:37                     ` [PATCH 4/4] netfilter: sysctl support of logger choice Eric Leblond
2009-02-18 15:56                       ` Patrick McHardy
2009-02-19 20:59                         ` Eric Leblond
2009-02-19 21:02                           ` Patrick McHardy
2009-02-19 21:52                             ` Eric Leblond
2009-02-19 21:54                               ` [PATCH 1/3] netfilter: use a linked list of loggers Eric Leblond
2009-03-16 13:54                                 ` Patrick McHardy
2009-02-19 21:54                               ` [PATCH 2/3] netfilter: print the list of register loggers Eric Leblond
2009-03-16 13:56                                 ` Patrick McHardy
2009-02-19 21:54                               ` [PATCH 3/3] netfilter: sysctl support of logger choice Eric Leblond
2009-03-16 13:58                                 ` Patrick McHardy
2009-03-17 23:15                                   ` Eric Leblond
2009-03-17 23:27                                     ` [PATCH] " Eric Leblond
2009-03-19  9:45                                       ` Patrick McHardy
2009-03-19 21:46                                         ` Eric Leblond
2009-03-23 12:17                                           ` Patrick McHardy
2009-02-09 21:11               ` [PATCH 2/7] netfilter: suppress nf_log_unregister_pf function Eric Leblond
2009-02-09 21:11               ` [PATCH 3/7] netfilter: bind at registration if no logger is already set Eric Leblond
2009-02-09 21:11               ` [PATCH 4/7] netfilter: convert logger modules to new API Eric Leblond
2009-02-09 21:11               ` [PATCH 5/7] netfilter: print the list of register loggers Eric Leblond
2009-02-09 21:11               ` [PATCH 6/7] netfilter: sysctl support of logger choice Eric Leblond
2009-02-11 14:21                 ` Patrick McHardy
2009-02-09 21:11               ` [PATCH 7/7] netfilter: fix nflog timeout handling Eric Leblond
2009-02-11 14:33                 ` Patrick McHardy
2009-01-07 20:05     ` [PATCH 6/6] netfilter: sysctl support of logger choice Eric Leblond
2009-01-02 17:07 ` [PATCH 4/5] netfilter: print the list of register loggers Eric Leblond
2009-01-02 17:07 ` [PATCH 5/5] netfilter: sysctl support of logger choice Eric Leblond

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4992DD14.8050906@trash.net \
    --to=kaber@trash.net \
    --cc=eric@inl.fr \
    --cc=netfilter-devel@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.