Messages in this thread | | | Date | Fri, 25 Jun 2010 11:44:46 +0200 | Subject | Re: [RFC][PATCH] irq_work | From | Frederic Weisbecker <> |
| |
2010/6/25 Huang Ying <ying.huang@intel.com>: > On Fri, 2010-06-25 at 17:23 +0800, Frederic Weisbecker wrote: >> 2010/6/25 Huang Ying <ying.huang@intel.com>: >> > On Fri, 2010-06-25 at 15:48 +0800, Peter Zijlstra wrote: >> >> On Fri, 2010-06-25 at 10:12 +0800, Huang Ying wrote: >> >> > >> >> > It is better to add "void *data" field in this struct to allow same >> >> > function can be used for multiple struct irq_work. >> >> >> >> No, simply do: >> >> >> >> struct my_foo { >> >> struct irq_work work; >> >> /* my extra data */ >> >> } >> >> >> >> void my_func(struct irq_work *work) >> >> { >> >> struct my_foo *foo = container_of(work, struct my_foo, work); >> >> >> >> /* tada! */ >> >> } >> > >> > Yes. This works too. But Adding "void *data" field is helpful if you do >> > not embed struct irq_work into another struct. >> >> >> That's what makes most sense. If you use work->data to put foo, then >> you can also do the opposite. Now the best is to pick the choice that >> gives you a real type and a typechecking, and not an error-prone and >> obfuscated void * >> >> This is the way things are made in the kernel. struct work_struct, struct list, >> struct rcu_head, etc... are all embedded into a container, so that we can >> use container_of. > > container_of has no full type checking too.
You're right. There is nothing that guarantees B is contained into A, I mean the code is supposed to provide this guarantee, but not the type.
That said it's much proper than playing with a void *data, beside the fact kernel developers will quickly understand what you do if you play with such scheme as they are used to it. -- 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/
| |