Hi Mike,
Thanks for the patch. Does this patch need to change this line too? https://github.com/openvswitch/ovs/blob/31db0e043119cf597d720d94f70ec19cf5b8b7d4/rhel/usr_lib_systemd_system_ovs-vswitchd.service.in#L18 Wouldn't it be better to have a config option that we can change at runtime? Or perhaps leave it to use the system's default unless configured to cap the amount? BTW, I think we use Reported-at: tag instead of Bugzilla:. fbl On Wed, Oct 19, 2022 at 09:01:46AM -0400, Mike Pattrick wrote: > Previously the minimum thread stack size was always set to 512 kB to > help accomidate smaller OpenWRT based systems. Often these devices > don't have a lot of total system memory, so such a limit makes sense. > > The default under x86-64 linux is 2MB, this limit is not always enough > to reach the recursion limits in xlate_resubmit_resource_check(), > resulting in a segfault instead of a recoverable error. This can happen > even when the stack size is set up for unlimited expansion when the > virtaul memory areas of handler threads abut eachother, preventing any > further expansion. > > The solution proposed here is to set a minimum of 4MB on systems with > more than 4GB of total ram. > > Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2104779 > Signed-off-by: Mike Pattrick <[email protected]> > --- > lib/ovs-thread.c | 46 ++++++++++++++++++++++++++++++++++++++++++++-- > lib/ovs-thread.h | 1 + > 2 files changed, 45 insertions(+), 2 deletions(-) > > diff --git a/lib/ovs-thread.c b/lib/ovs-thread.c > index 78ed3e970..dbe4a036f 100644 > --- a/lib/ovs-thread.c > +++ b/lib/ovs-thread.c > @@ -478,10 +478,21 @@ ovs_thread_create(const char *name, void *(*start)(void > *), void *arg) > * requires approximately 384 kB according to the following analysis: > * > https://mail.openvswitch.org/pipermail/ovs-dev/2016-January/308592.html > * > - * We use 512 kB to give us some margin of error. */ > + * We use at least 512 kB to give us some margin of error. > + * > + * However, this can cause issues on larger systems with complex > + * OpenFlow tables. A default stack size of 2MB can result in segfaults > + * if a lot of clones and resubmits are used. So if the system memory > + * exceeds some limit then use a 4 MB stack. > + * */ > pthread_attr_t attr; > pthread_attr_init(&attr); > - set_min_stack_size(&attr, 512 * 1024); > + > + if (system_memory() >> 30 > 4) { > + set_min_stack_size(&attr, 4096 * 1024); > + } else { > + set_min_stack_size(&attr, 512 * 1024); > + } > > error = pthread_create(&thread, &attr, ovsthread_wrapper, aux); > if (error) { > @@ -680,6 +691,37 @@ count_total_cores(void) > return n_cores > 0 ? n_cores : 0; > } > > +/* Returns the total system memory in bytes, or 0 if the > + * number cannot be determined. */ > +uint64_t > +system_memory(void) > +{ > + static struct ovsthread_once once = OVSTHREAD_ONCE_INITIALIZER; > + static uint64_t memory; > + > + if (ovsthread_once_start(&once)) { > +#if defined(_WIN32) > + MEMORYSTATUSEX statex; > + > + statex.dwLength = sizeof statex; > + GlobalMemoryStatusEx(&statex); > + memory = statex.ullTotalPhys; > +#elif defined(__linux__) > + long int page_count = sysconf(_SC_PHYS_PAGES); > + long int page_size = sysconf(_SC_PAGESIZE); > + > + if (page_count > 0 && page_size > 0) { > + memory = page_count * page_size; > + } else { > + memory = 0; > + } > +#endif > + ovsthread_once_done(&once); > + } > + > + return memory; > +} > + > /* Returns 'true' if current thread is PMD thread. */ > bool > thread_is_pmd(void) > diff --git a/lib/ovs-thread.h b/lib/ovs-thread.h > index aac5e19c9..2ce66b721 100644 > --- a/lib/ovs-thread.h > +++ b/lib/ovs-thread.h > @@ -523,6 +523,7 @@ bool may_fork(void); > > int count_cpu_cores(void); > int count_total_cores(void); > +uint64_t system_memory(void); > bool thread_is_pmd(void); > > #endif /* ovs-thread.h */ > -- > 2.31.1 > > _______________________________________________ > dev mailing list > [email protected] > https://mail.openvswitch.org/mailman/listinfo/ovs-dev -- fbl _______________________________________________ dev mailing list [email protected] https://mail.openvswitch.org/mailman/listinfo/ovs-dev
