From: Walker, Benjamin <benjamin.walker at intel.com>
To: spdk@lists.01.org
Subject: Re: [SPDK] Using spdk_thread_poll with custom scheduler
Date: Wed, 01 May 2019 17:41:45 +0000 [thread overview]
Message-ID: <01df4c56298fd5741dbc33a66530c06867739b40.camel@intel.com> (raw)
In-Reply-To: AT5PR8401MB09326230635493255D75B297D93A0@AT5PR8401MB0932.NAMPRD84.PROD.OUTLOOK.COM
[-- Attachment #1: Type: text/plain, Size: 3261 bytes --]
On Tue, 2019-04-30 at 21:50 +0000, Gupta, Sumit wrote:
> Hi
>
> I am looking for using spdk_threads with a custom scheduler as presented by
> Ben in the recent summit. I understand that I can do that by calling
> spdk_thread_poll from within my scheduler's poller. But I see that there are
> thread local variables used by various modules (such as bdev) which wont work
> if I move my poller to a different core. One example is spdk_bdev_open which
> gets spdk_thread from the tls variable. Thoughts/ideas ?
I just did a search for all occurrences of __thread in the code. I see several,
but if I filter out the ones in tests or example applications (where we can
deduce they're safe due to the structure of the example or test) then only a few
remain.
The most important one is the one in lib/thread which stores the current thread.
This thread local variable is set when the user calls spdk_thread_poll() and is
unset when that function returns. This allows us to implement an efficient
version of spdk_get_thread() for use within pollers or events. All code within
SPDK is driven by calls to spdk_thread_poll(), so all calls to spdk_get_thread()
are necessarily inside of an spdk_thread_poll() call while the thread local
variable is set. Between calls to spdk_thread_poll(), you are free to move the
spdk_thread to a different system thread and everything continues to function as
expected.
There's two additional ones that require some consideration.
1. nvme_pcie.c: There is a thread local variable used when reading/writing the
PCI BAR. This is part of hot remove handling. If the device is hot-removed,
writes to the PCI BAR generate a SIGBUS. We install a SIGBUS handler to deal
with this (by swapping in a memory region mapped with all 0xF). That SIGBUS
handler needs some information to function correctly, which we store in a thread
local variable. The SIGBUS handler is guaranteed to run on the same system
thread as where the signal was generated and the system thread resumes execution
afterward. Because all of these PCI BAR writes are done within the context of an
spdk_thread_poll(), and the lifetime of the thread local variable does not
extend across calls to spdk_thread_poll(), this one is safe.
2. strerror_tls.cs: We have a utility function for converting error codes to
strings that uses a thread local variable as the pre-allocated string output.
The typical use here is that you are going to convert the errnum to a string and
print it out immediately. This whole process also occurs entirely within the
context of one spdk_thread_poll() call, so the system thread never switches
during the lifetime of the thread local variable unless you were to hang on to
that string output for an extended period of time. We deal with this by simply
saying to not do that - make a copy or print it out and be done with it.
So looking it over, I think all uses of thread local variables are safe. You can
move spdk_threads around between calls to spdk_thread_poll() and everything will
work as expected.
Thanks,
Ben
>
> Thanks
> Sumit
> _______________________________________________
> SPDK mailing list
> SPDK(a)lists.01.org
> https://lists.01.org/mailman/listinfo/spdk
next reply other threads:[~2019-05-01 17:41 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-05-01 17:41 Walker, Benjamin [this message]
-- strict thread matches above, loose matches on Subject: below --
2019-05-06 23:12 [SPDK] Using spdk_thread_poll with custom scheduler Michael Haeuptle
2019-05-03 16:45 Walker, Benjamin
2019-05-03 14:27 Michael Haeuptle
2019-04-30 21:50 Gupta, Sumit
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=01df4c56298fd5741dbc33a66530c06867739b40.camel@intel.com \
--to=spdk@lists.01.org \
/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).