DPDK patches and discussions
 help / color / mirror / Atom feed
From: <wubenqing@ruijie.com.cn>
To: <keith.wiles@intel.com>
Cc: <dev@dpdk.org>
Subject: Re: [dpdk-dev] Does lthread_cond_wait need a mutex?
Date: Sat, 21 Jul 2018 01:32:27 +0000	[thread overview]
Message-ID: <82A10A71B70FF2449A8AD233969A45A11DB0CCBA@FZEX4.ruijie.com.cn> (raw)
In-Reply-To: <1A8B8E17-366B-475A-8399-AE7C26CED6C7@intel.com>

Hi~
    I would be appreciate it if you could provide your lthread code for me. And I found that DPDK lthreads does not provide lthread_cond_timedwait API which I am looking for.
    Thanks.

________________________________
Regards,
Wubenqing

From: Wiles, Keith<mailto:keith.wiles@intel.com>
Date: 2018-07-19 13:21
To: 吴本卿(研五 福州)<mailto:wubenqing@ruijie.com.cn>
CC: dev@dpdk.org<mailto:dev@dpdk.org>
Subject: Re: [dpdk-dev] Does lthread_cond_wait need a mutex?



> On Jul 18, 2018, at 7:34 PM, wubenqing@ruijie.com.cn wrote:
>
> Hi~
>
> If the lthreads run on different lcores, a race condition with lthread_mutex may occur.
> Like this:
>     lthread1 run on lcore=1
>     lthread2 run on lcore=2
> If the mutex is owned by lthread2, lthread1 try to lock the mutex that will block thread1. lthread_sched on lcore1 will insert lthread1 to the blocked queue of the mutex. lthread1 blocks until lthread2 unlock the mutex.
> Is that right?
>
> Let's go back to the previous question.
>
> Refer to http://pubs.opengroup.org/onlinepubs/7908799/xsh/pthread_cond_wait.html
> "The pthread_cond_wait() and pthread_cond_timedwait() functions are used to block on a condition variable. They are called with mutex locked by the calling thread or undefined behaviour will result.
> These functions atomically release mutex and cause the calling thread to block on the condition variable cond; atomically here means "atomically with respect to access by another thread to the mutex and then the condition variable”."

Yes, I believe you are correct. I was able to look at my version of lthreads and I had changed lthread_cond_wait() to have a mutex argument and removed the reserved variable. The same was done for timed wait function. As I remember I found a couple minor problems in lthreads, which I fixed. The problem is my lthread code is somewhat different then the code in DPDK and my changes would not apply to DPDK lthreads.

>
> So I think there is a problem with pthread_cond_wait implemented by lthread. If that is the case, could lthread fix this problem?
>
> Regards,
> Wubenqing
>
>
> From: Wiles, Keith
> Date: 2018-07-18 23:01
> To: 吴本卿(研五 福州)
> CC: dev@dpdk.org
> Subject: Re: [dpdk-dev] Does lthread_cond_wait need a mutex?
>
>
> > On Jul 17, 2018, at 10:43 PM, wubenqing@ruijie.com.cn wrote:
> >
> > Hi~
> >    Reference: http://doc.dpdk.org/guides-18.05/sample_app_ug/performance_thread.html?highlight=lthread
> >    The L-thread subsystem provides a set of functions that are logically equivalent to the corresponding functions offered by the POSIX pthread library.
> >    I think there is a bug with pthread_cond_wait of lthread implement.
> >    Look at this code, there are two lthread:
> >
> > lthread1:
> >    pthread_mutex_lock(mutex);                 //a1
> >    if (predicate == FALSE) {                        //a2
> >        pthread_cond_wait(cond, mutex)        //a3
> >    }
> >    pthread_mutex_unlock(mutex);            //a4
> >
> > int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex)
> > {
> > if (override) {
> > pthread_mutex_unlock(mutex); //a31
> > int rv = lthread_cond_wait(*(struct lthread_cond **)cond, 0); //a32
> >
> > pthread_mutex_lock(mutex); //a33
> > return rv;
> > }
> > return _sys_pthread_funcs.f_pthread_cond_wait(cond, mutex);
> > }
> >
> > lthread2:
> >    pthread_mutex_lock(mutex);                //b1
> >    predicate = TRUE;                                //b2
> >    pthread_mutex_unlock(mutex);            //b3
> >    pthread_cond_signal(cond);                //b4
> >
> >
> >    If the sequence is:
> >    a1->a2->a31->b1->b2->b3->b4->a32
> >    Will lthread1 sleep forever?
>
> Maybe is it possible, my brain is not working this morning. Please remember that lthreads must give up control or lthread will continue to and can not be preempted.
>
> Does that fix the problem?
>
> >
> > ________________________________
> > 吴本卿(研五 福州)
>
> Regards,
> Keith

Regards,
Keith


  reply	other threads:[~2018-07-21  1:32 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-07-18  5:43 wubenqing
2018-07-18 15:01 ` Wiles, Keith
2018-07-19  2:34   ` wubenqing
2018-07-19  5:21     ` Wiles, Keith
2018-07-21  1:32       ` wubenqing [this message]
2018-07-21 13:49         ` Wiles, Keith
2018-07-22 12:59           ` [dpdk-dev] 回复: " wubenqing
2018-08-02  7:03             ` [dpdk-dev] 回复: " wubenqing

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=82A10A71B70FF2449A8AD233969A45A11DB0CCBA@FZEX4.ruijie.com.cn \
    --to=wubenqing@ruijie.com.cn \
    --cc=dev@dpdk.org \
    --cc=keith.wiles@intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).