Prev: [PATCH 4/4] workqueue: fix worker management invocation without pending works
Next: pcrypt: sysfs interface
From: Dan Kruchinin on 6 Jul 2010 04:40 On Tue, Jul 6, 2010 at 11:46 AM, Steffen Klassert <steffen.klassert(a)secunet.com> wrote: > On Tue, Jul 06, 2010 at 11:40:11AM +0400, Dan Kruchinin wrote: >> >> > >> >> >> >> I think we can use RCU anyway. For instance we could use a structure >> >> >> >> struct pcrypt_cpumask { >> >> � � � cpumask_var_t � � � � � pmask; >> >> � � � cpumask_var_t � � � � � smask; >> >> }; >> >> >> >> and add a pointer to a structure of that type to the instance context. >> >> Then we could use this pointer for RCU and replace the whole structure >> >> if a cpumask changes. >> >> But is pcrypt interested pmask? If it isn't, pmask field will be unused. >> > > It's probaply not, in this case the struct could look like > > struct pcrypt_cpumask { > � � � �cpumask_var_t � � � � � smask; > }; > Would't it be the same as with a pointer to cpumask_var_t? I mean: struct pcrypt { ... struct pcrypt_cpumask *mask; ... } pencrypt; To assign a pointer via RCU: int cpumask_change_nitify(...) { ... struct pcrypt_cpumask *new_mask = kmalloc(sizeof(*mask), GFP); struct pcrypt_cpumask *old_mask = pencrypt.mask; if (!new_mask) error(); if (!alloc_cpumask_var(&new_mask->smask, GFP_KERNEL)) error(); get_serial_cpumask_from_padata(new_mask->mask); rcu_assign_pointer(pencrypt.mask, new_mask); synchronize_rcu_bh(); free_cpumask_var(old_mask->smask); kfree(old_mask); ... } It's a bit hard to read this code because at the first sight it appears unclear and odd why we allocate the structure with only one member. -- W.B.R. Dan Kruchinin -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo(a)vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
From: Steffen Klassert on 6 Jul 2010 09:30 On Tue, Jul 06, 2010 at 12:31:21PM +0400, Dan Kruchinin wrote: > > Would't it be the same as with a pointer to cpumask_var_t? I mean: Using a pointer to cpumask_var_t is a bit problematic because you don't know a priori about the type of cpumask_var_t. The type depends whether the cpumasks are on/off stack. So the easiest thing is to embed it to a struct, then you don't need to care about the type. If you allocate a struct of type pcrypt_cpumask you get what you want to have. > struct pcrypt { > ... > struct pcrypt_cpumask *mask; > ... > } pencrypt; > > To assign a pointer via RCU: > > int cpumask_change_nitify(...) { > ... > struct pcrypt_cpumask *new_mask = kmalloc(sizeof(*mask), GFP); > struct pcrypt_cpumask *old_mask = pencrypt.mask; > > if (!new_mask) > error(); > if (!alloc_cpumask_var(&new_mask->smask, GFP_KERNEL)) > error(); > > get_serial_cpumask_from_padata(new_mask->mask); > rcu_assign_pointer(pencrypt.mask, new_mask); > synchronize_rcu_bh(); > > free_cpumask_var(old_mask->smask); > kfree(old_mask); > ... > } > > It's a bit hard to read this code because at the first sight it > appears unclear and odd why we allocate the structure with only one > member. > We can easily add a code comment if this appears to be unclear :) -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo(a)vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
From: Dan Kruchinin on 6 Jul 2010 12:40 On Tue, Jul 6, 2010 at 5:28 PM, Steffen Klassert <steffen.klassert(a)secunet.com> wrote: > On Tue, Jul 06, 2010 at 12:31:21PM +0400, Dan Kruchinin wrote: >> >> Would't it be the same as with a pointer to cpumask_var_t? I mean: > > Using a pointer to cpumask_var_t is a bit problematic because > you don't know a priori about the type of cpumask_var_t. > The type depends whether the cpumasks are on/off stack. > So the easiest thing is to embed it to a struct, then you don't > need to care about the type. If you allocate a struct of type > pcrypt_cpumask you get what you want to have. Oh, I meant pointer to pointer of course. Anyway you're probably right. I modified my patches according to the results of our discussion. So I'm waiting for your fixes. > >> struct pcrypt { >> � ... >> � struct pcrypt_cpumask *mask; >> � ... >> } pencrypt; >> >> To assign a pointer via RCU: >> >> int cpumask_change_nitify(...) { >> � �... >> � struct pcrypt_cpumask *new_mask = kmalloc(sizeof(*mask), GFP); >> � struct pcrypt_cpumask *old_mask = pencrypt.mask; >> >> � if (!new_mask) >> � � �error(); >> � if (!alloc_cpumask_var(&new_mask->smask, GFP_KERNEL)) >> � � �error(); >> >> � get_serial_cpumask_from_padata(new_mask->mask); >> � rcu_assign_pointer(pencrypt.mask, new_mask); >> � synchronize_rcu_bh(); >> >> � free_cpumask_var(old_mask->smask); >> � kfree(old_mask); >> � ... >> } >> >> It's a bit hard to read this code because at the first sight it >> appears unclear and odd why we allocate the structure with only one >> member. >> > > We can easily add a code comment if this appears to be unclear :) > -- W.B.R. Dan Kruchinin -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo(a)vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
From: Steffen Klassert on 7 Jul 2010 09:20 On Tue, Jul 06, 2010 at 08:30:40PM +0400, Dan Kruchinin wrote: > > I modified my patches according to the results of our discussion. So > I'm waiting for your fixes. > I'll send out a patchset later. The first three patches of the patchset address the empty padata cpumask handling. I did some rough tests and it appeared to work. However, I still have no fixed testcase for this. So see whether this works with your patches and whether it meets your requirements. -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo(a)vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
First
|
Prev
|
Pages: 1 2 3 Prev: [PATCH 4/4] workqueue: fix worker management invocation without pending works Next: pcrypt: sysfs interface |