[ovs-dev] [PATCH] [RFC] lib/ovs-thread: set pthread stack size to 128k

Alexandru Ardelean ardeleanalex at gmail.com
Mon Jan 25 13:16:22 UTC 2016


On Mon, Jan 25, 2016 at 10:13 AM, Alexandru Ardelean <ardeleanalex at gmail.com
> wrote:

>
>
> On Sun, Jan 24, 2016 at 11:24 PM, Russell Bryant <russell at ovn.org> wrote:
>
>> On 01/24/2016 08:56 AM, Alexandru Ardelean wrote:
>> > Seems that musl libc's default thread stack size is 80k, which
>> > causes a segfault (stack overflow actually) when trying to add
>> > a bridge (via the "ovs-vsctl add-br" command).
>> >
>> > OpenWRT has been switching to musl libc for a few months now.
>> > So far, we've been using OVS with uClibc, so I did not catch this
>> > earlier.
>> >
>> > This patch is a RFC:
>> > - is this thread stack size sufficient ?
>> > - is this approach acceptable ?
>> >
>> > In OpenWRT we'll use this patch since it works.
>> >
>> > Issue was found and fixed by Robert McKay.
>> > I fine tuned his patch and will add it to our OVS package
>> > in OpenWRT.
>> >
>> > Signed-off-by: Robert McKay <robert at mckay.com>
>> > Signed-off-by: Alexandru Ardelean <ardeleanalex at gmail.com>
>> > ---
>> >  lib/ovs-thread.c |    5 ++++-
>> >  1 file changed, 4 insertions(+), 1 deletion(-)
>> >
>> > diff --git a/lib/ovs-thread.c b/lib/ovs-thread.c
>> > index 7855b3a..e35ddba 100644
>> > --- a/lib/ovs-thread.c
>> > +++ b/lib/ovs-thread.c
>> > @@ -347,6 +347,7 @@ ovs_thread_create(const char *name, void
>> *(*start)(void *), void *arg)
>> >  {
>> >      struct ovsthread_aux *aux;
>> >      pthread_t thread;
>> > +    pthread_attr_t attr;
>> >      int error;
>> >
>> >      forbid_forking("multiple threads exist");
>> > @@ -358,7 +359,9 @@ ovs_thread_create(const char *name, void
>> *(*start)(void *), void *arg)
>> >      aux->arg = arg;
>> >      ovs_strlcpy(aux->name, name, sizeof aux->name);
>> >
>> > -    error = pthread_create(&thread, NULL, ovsthread_wrapper, aux);
>> > +    pthread_attr_init(&attr);
>> > +    pthread_attr_setstacksize(&attr, 128*1024);
>> > +    error = pthread_create(&thread, &attr, ovsthread_wrapper, aux);
>> >      if (error) {
>> >          ovs_abort(error, "pthread_create failed");
>> >      }
>> >
>>
>> I don't actually have feedback on the more important question of how
>> best to deal with your issue, but fwiw, you need a
>> pthread_attr_destroy() after pthread_create().
>>
>> --
>> Russell Bryant
>>
>
> Thanks for that.
> Re-spinned patch with your suggestion.
>
>
I've found that 128k is too small under some tests.
Will try to increase this in increments of 128k (so next one is 256k) and
run a few more tests.
RFC for "is this approach acceptable ?" still stands.



More information about the dev mailing list