All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Paul E. McKenney" <paulmck@linux.vnet.ibm.com>
To: Jiri Pirko <jpirko@redhat.com>
Cc: linux-kernel@vger.kernel.org
Subject: Re: [PATCH] list: add list_last_entry macros
Date: Mon, 28 Feb 2011 11:33:54 -0800	[thread overview]
Message-ID: <20110228193354.GW2331@linux.vnet.ibm.com> (raw)
In-Reply-To: <20110227104620.GA2814@psychotron.redhat.com>

On Sun, Feb 27, 2011 at 11:46:21AM +0100, Jiri Pirko wrote:
> Handy to get last item in a list. Also corrected parameter name for
> list_first_entry.
> 
> Signed-off-by: Jiri Pirko <jpirko@redhat.com>
> 
> diff --git a/include/linux/list.h b/include/linux/list.h
> index 3a54266..e10862e 100644
> --- a/include/linux/list.h
> +++ b/include/linux/list.h
> @@ -352,14 +352,25 @@ static inline void list_splice_tail_init(struct list_head *list,
> 
>  /**
>   * list_first_entry - get the first element from a list
> - * @ptr:	the list head to take the element from.
> + * @head:	the list head to take the element from.
>   * @type:	the type of the struct this is embedded in.
>   * @member:	the name of the list_struct within the struct.
>   *
>   * Note, that list is expected to be not empty.
>   */
> -#define list_first_entry(ptr, type, member) \
> -	list_entry((ptr)->next, type, member)
> +#define list_first_entry(head, type, member) \
> +	list_entry((head)->next, type, member)
> +
> +/**
> + * list_last_entry - get the last element from a list
> + * @head:	the list head to take the element from.
> + * @type:	the type of the struct this is embedded in.
> + * @member:	the name of the list_struct within the struct.
> + *
> + * Note, that list is expected to be not empty.
> + */
> +#define list_last_entry(head, type, member) \
> +	list_entry((head)->prev, type, member)
> 
>  /**
>   * list_for_each	-	iterate over a list
> diff --git a/include/linux/rculist.h b/include/linux/rculist.h
> index 2dea94f..2cfa99f 100644
> --- a/include/linux/rculist.h
> +++ b/include/linux/rculist.h
> @@ -229,7 +229,7 @@ static inline void list_splice_init_rcu(struct list_head *list,
> 
>  /**
>   * list_first_entry_rcu - get the first element from a list
> - * @ptr:        the list head to take the element from.
> + * @head:       the list head to take the element from.
>   * @type:       the type of the struct this is embedded in.
>   * @member:     the name of the list_struct within the struct.
>   *
> @@ -238,8 +238,23 @@ static inline void list_splice_init_rcu(struct list_head *list,
>   * This primitive may safely run concurrently with the _rcu list-mutation
>   * primitives such as list_add_rcu() as long as it's guarded by rcu_read_lock().
>   */
> -#define list_first_entry_rcu(ptr, type, member) \
> -	list_entry_rcu((ptr)->next, type, member)
> +#define list_first_entry_rcu(head, type, member) \
> +	list_entry_rcu((head)->next, type, member)
> +
> +/**
> + * list_last_entry_rcu - get the last element from a list
> + * @head:       the list head to take the element from.
> + * @type:       the type of the struct this is embedded in.
> + * @member:     the name of the list_struct within the struct.
> + *
> + * Note, that list is expected to be not empty.
> + *
> + * This primitive may safely run concurrently with the _rcu list-mutation
> + * primitives such as list_add_rcu() as long as it's guarded by rcu_read_lock().
> + */
> +
> +#define list_last_entry_rcu(head, type, member) \
> +	list_entry_rcu((head)->prev, type, member)

But won't a concurrent list_del_rcu() on head, which removes the full
list, poison the ->prev pointer?

Do you have a definite use case for list_last_entry_rcu()?

							Thanx, Paul

>  /**
>   * list_for_each_entry_rcu	-	iterate over rcu list of given type
> --
> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at  http://www.tux.org/lkml/

      reply	other threads:[~2011-02-28 19:33 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-02-27 10:46 [PATCH] list: add list_last_entry macros Jiri Pirko
2011-02-28 19:33 ` Paul E. McKenney [this message]

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=20110228193354.GW2331@linux.vnet.ibm.com \
    --to=paulmck@linux.vnet.ibm.com \
    --cc=jpirko@redhat.com \
    --cc=linux-kernel@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.