OpenVZ Forum - RDF feed
type: channel
items: [PATCH] Introduce a handy list_first_entry macro
items: Re: [PATCH] Introduce a handy list_first_entry macro

[PATCH] Introduce a handy list_first_entry macro
type: item
description: There are many places in the kernel where the construction like foo = list_entry(head->next, struct foo_struct, list); are used. The code might look more descriptive and neat if using the macro list_first_entry(head, type, member) \ list_entry((head)->next, type, member) Here is the macro itself and the examples of its usage in the generic code. If it will turn out to be useful, I can prepare the set of patches to inject in into arch-specific code, drivers, networking, etc. Signed-off-by: Pavel Emelianov <xemul@openvz.org> Signed-off-by: Kirill Korotaev <dev@openvz.org> --- diff --git a/fs/dquot.c b/fs/dquot.c index ac40503..e5cce5a 100644 --- a/fs/dquot.c +++ b/fs/dquot.c @@ -474,7 +474,7 @@ int vfs_quota_sync(struct super_block *s spin_lock(&dq_list_lock); dirty = &dqopt->info[cnt].dqi_dirty_list; while (!list_empty(dirty)) { - dquot = list_entry(dirty->next, struct dquot, dq_dirty); + dquot = list_first_entry(dirty, struct dquot, dq_dirty); /* Dirty and inactive can be only bad dquot... */ if (!test_bit(DQ_ACTIVE_B, &dquot->dq_flags)) { clear_dquot_dirty(dquot); diff --git a/fs/eventpoll.c b/fs/eventpoll.c index aeedc99..1aad34e 100644 --- a/fs/eventpoll.c +++ b/fs/eventpoll.c @@ -371,7 +371,7 @@ static void ep_unregister_pollwait(struc if (nwait) { while (!list_empty(lsthead)) { - pwq = list_entry(lsthead->next, struct eppoll_entry, llink); + pwq = list_first_entry(lsthead, struct eppoll_entry, llink); list_del_init(&pwq->llink); remove_wait_queue(pwq->whead, &pwq->wait); @@ -602,7 +602,7 @@ void eventpoll_release_file(struct file mutex_lock(&epmutex); while (!list_empty(lsthead)) { - epi = list_entry(lsthead->next, struct epitem, fllink); + epi = list_first_entry(lsthead, struct epitem, fllink); ep = epi->ep; list_del_init(&epi->fllink); @@ -943,7 +943,7 @@ static int ep_send_events(struct eventpo * read. */ for (eventcnt = 0; !list_empty(txlist) && eventcnt < maxevents;) { - epi = list_entry(txlist->next, struct epitem, rdllink); + epi = list_first_entry(txlis…
creator: xemul
date: 2007-04-17T11:14:12-00:00

Re: [PATCH] Introduce a handy list_first_entry macro
type: item
description: Pavel Emelianov <xemul@sw.ru> writes: > There are many places in the kernel where the construction like > > foo = list_entry(head->next, struct foo_struct, list); > > are used. > The code might look more descriptive and neat if using the macro > > list_first_entry(head, type, member) \ > list_entry((head)->next, type, member) Thanks. I always wanted that too. -andi
creator: Andi Kleen
date: 2007-04-17T14:21:21-00:00

Re: [PATCH] Introduce a handy list_first_entry macro
type: item
description: On Tue, Apr 17, 2007 at 03:18:56PM +0400, Pavel Emelianov wrote: > There are many places in the kernel where the construction like > > foo = list_entry(head->next, struct foo_struct, list); > > are used. > The code might look more descriptive and neat if using the macro > > list_first_entry(head, type, member) \ > list_entry((head)->next, type, member) > - dquot = list_entry(dirty->next, struct dquot, dq_dirty); > + dquot = list_first_entry(dirty, struct dquot, dq_dirty); I think it's more than just descriptive and neat. A common sneaky bug is to accidentally pass &list->next into list_entry() instead of list->next. This is easy to do because one is used to typing &list in list_empty(), etc. So by following ->next in the macro we make the list argument consistent in list_empty() and list_first_entry() and hopefully reduce the risk of making that mistake. I like it. - z
creator: Zach Brown
date: 2007-04-17T17:11:44-00:00

Re: [PATCH] Introduce a handy list_first_entry macro
type: item
description: On Tue, 17 Apr 2007 15:18:56 +0400 Pavel Emelianov wrote: > There are many places in the kernel where the construction like > > foo = list_entry(head->next, struct foo_struct, list); > > are used. > The code might look more descriptive and neat if using the macro > > list_first_entry(head, type, member) \ > list_entry((head)->next, type, member) > > Here is the macro itself and the examples of its usage in the > generic code. If it will turn out to be useful, I can prepare > the set of patches to inject in into arch-specific code, drivers, > networking, etc. > > Signed-off-by: Pavel Emelianov <xemul@openvz.org> > Signed-off-by: Kirill Korotaev <dev@openvz.org> > > --- > diff --git a/include/linux/list.h b/include/linux/list.h > index fd59659..71318fc 100644 > --- a/include/linux/list.h > +++ b/include/linux/list.h > @@ -425,6 +425,9 @@ static inline void list_splice_init_rcu( > #define list_entry(ptr, type, member) \ > container_of(ptr, type, member) > > +#define list_first_entry(ptr, type, member) \ > + list_entry((ptr)->next, type, member) > + Please provide kernel-doc for that like the rest of list.h has. > /** > * list_for_each - iterate over a list > * @pos: the &struct list_head to use as a loop cursor. --- ~Randy *** Remember to use Documentation/SubmitChecklist when testing your code ***
creator: Randy Dunlap
date: 2007-04-17T17:29:45-00:00

Re: [PATCH] Introduce a handy list_first_entry macro
type: item
description: Pavel Emelianov writes: > There are many places in the kernel where the construction like > > foo = list_entry(head->next, struct foo_struct, list); > > are used. > The code might look more descriptive and neat if using the macro > > list_first_entry(head, type, member) \ > list_entry((head)->next, type, member) Won't list_next_entry() be more descriptive name for that? Nikita.
creator: Nikita Danilov
date: 2007-04-18T11:42:05-00:00