* Re: [Xenomai] Jan Kiszka : cobalt/debug: Fix locking
[not found] <E1e2arC-0007kc-Al@xenomai.org>
@ 2017-11-13 16:34 ` Jan Kiszka
2017-11-14 16:47 ` Philippe Gerum
0 siblings, 1 reply; 2+ messages in thread
From: Jan Kiszka @ 2017-11-13 16:34 UTC (permalink / raw)
To: Philippe Gerum; +Cc: xenomai
On 2017-10-12 12:36, git repository hosting wrote:
> Module: xenomai-jki
> Branch: for-forge
> Commit: 02424d69f933bea30904b6ef53168c3a3aca8459
> URL: http://git.xenomai.org/?p=xenomai-jki.git;a=commit;h=02424d69f933bea30904b6ef53168c3a3aca8459
>
> Author: Jan Kiszka <jan.kiszka@siemens.com>
> Date: Thu Oct 12 09:46:41 2017 +0200
>
> cobalt/debug: Fix locking
>
> None of these functions are called over interrupt context. Leaving the
> critical sections interruptible can cause premature/double-unlock
> scenarios and bug reports such as
>
> [Xenomai] lock ffffffff81c56000 already unlocked on CPU #1
> last owner = kernel/xenomai/debug.c:74 (hash_symbol(), CPU #1)
> 000000000000002f ffff88007dc8bb10 ffffffff8118ae8f ffffffff00000001
> 0000000000000021 ffff88007f897fde ffff88007dc8bb50 ffffffff8118b266
> 00000000000000f1 ffff88007dc8bd68 0000000000000006 ffff88007dc8bd40
> Call Trace:
> [<ffffffff8118ae8f>] xnlock_dbg_release+0xdf/0xf0
> [<ffffffff8118b266>] hash_symbol+0x236/0x2d0
> [<ffffffff8118b668>] xndebug_trace_relax+0x118/0x450
> [<ffffffff811b8d50>] ? CoBaLt32emu_mmap+0xf0/0xf0
> [<ffffffff811b8dd7>] CoBaLt32emu_backtrace+0x87/0xb0
> [<ffffffff8100def6>] ? fpu__clear+0xd6/0x160
> [<ffffffff817b3691>] ? _raw_spin_unlock_irq+0x11/0x30
> [<ffffffff811ab1cc>] ipipe_syscall_hook+0x11c/0x3a0
> [<ffffffff8113d9bf>] __ipipe_notify_syscall+0xbf/0x180
> [<ffffffff810cd019>] ? __set_current_blocked+0x49/0x50
> [<ffffffff8113daab>] ipipe_handle_syscall+0x2b/0xb0
> [<ffffffff81001c9d>] do_fast_syscall_32+0xbd/0x220
> [<ffffffff817b64e2>] sysenter_flags_fixed+0x8/0x12
>
> Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
>
> ---
>
> kernel/cobalt/debug.c | 28 ++++++++++++++++------------
> 1 file changed, 16 insertions(+), 12 deletions(-)
>
> diff --git a/kernel/cobalt/debug.c b/kernel/cobalt/debug.c
> index 159b3c7..e5f4ab9 100644
> --- a/kernel/cobalt/debug.c
> +++ b/kernel/cobalt/debug.c
> @@ -64,14 +64,15 @@ DEFINE_PRIVATE_XNLOCK(symbol_lock);
> static const char *hash_symbol(const char *symbol)
> {
> struct hashed_symbol *p, **h;
> - const char *s;
> + const char *str;
> size_t len;
> u32 hash;
> + spl_t s;
>
> len = strlen(symbol);
> hash = jhash(symbol, len, 0);
>
> - xnlock_get(&symbol_lock);
> + xnlock_get_irqsave(&symbol_lock, s);
>
> h = &symbol_jhash[hash & (SYMBOL_HSLOTS - 1)];
> p = *h;
> @@ -85,7 +86,7 @@ static const char *hash_symbol(const char *symbol)
>
> p = xnheap_alloc(&memory_pool, sizeof(*p) + len + 1);
> if (p == NULL) {
> - s = NULL;
> + str = NULL;
> goto out;
> }
>
> @@ -93,11 +94,11 @@ static const char *hash_symbol(const char *symbol)
> p->next = *h;
> *h = p;
> done:
> - s = p->symbol;
> + str = p->symbol;
> out:
> - xnlock_put(&symbol_lock);
> + xnlock_put_irqrestore(&symbol_lock, s);
>
> - return s;
> + return str;
> }
>
> /*
> @@ -214,6 +215,7 @@ void xndebug_trace_relax(int nr, unsigned long *backtrace,
> int n, depth;
> char *tmp;
> u32 hash;
> + spl_t s;
>
> thread = xnthread_current();
> if (thread == NULL)
> @@ -285,7 +287,7 @@ void xndebug_trace_relax(int nr, unsigned long *backtrace,
> strcpy(spot.thread, thread->name);
> hash = jhash2((u32 *)&spot, sizeof(spot) / sizeof(u32), 0);
>
> - xnlock_get(&relax_lock);
> + xnlock_get_irqsave(&relax_lock, s);
>
> h = &relax_jhash[hash & (RELAX_HSLOTS - 1)];
> p = *h;
> @@ -326,7 +328,7 @@ void xndebug_trace_relax(int nr, unsigned long *backtrace,
> out:
> relax_overall++;
>
> - xnlock_put(&relax_lock);
> + xnlock_put_irqrestore(&relax_lock, s);
> }
>
> static DEFINE_VFILE_HOSTLOCK(relax_mutex);
> @@ -343,6 +345,7 @@ static void *relax_vfile_begin(struct xnvfile_regular_iterator *it)
> {
> struct relax_vfile_priv *priv = xnvfile_iterator_priv(it);
> struct relax_record *p;
> + spl_t s;
> int n;
>
> /*
> @@ -352,7 +355,7 @@ static void *relax_vfile_begin(struct xnvfile_regular_iterator *it)
> * holds the relax_mutex lock for us, so that we can't race
> * with ->store().
> */
> - xnlock_get(&relax_lock);
> + xnlock_get_irqsave(&relax_lock, s);
>
> if (relax_queued == 0 || it->pos > relax_queued) {
> xnlock_put(&relax_lock);
> @@ -362,7 +365,7 @@ static void *relax_vfile_begin(struct xnvfile_regular_iterator *it)
> priv->queued = relax_queued;
> priv->head = relax_record_list;
>
> - xnlock_put(&relax_lock);
> + xnlock_put_irqrestore(&relax_lock, s);
>
> if (it->pos == 0) {
> priv->curr = NULL;
> @@ -447,19 +450,20 @@ static int relax_vfile_show(struct xnvfile_regular_iterator *it, void *data)
> static ssize_t relax_vfile_store(struct xnvfile_input *input)
> {
> struct relax_record *p, *np;
> + spl_t s;
>
> /*
> * Flush out all records. Races with ->show() are prevented
> * using the relax_mutex lock. The vfile layer takes care of
> * this internally.
> */
> - xnlock_get(&relax_lock);
> + xnlock_get_irqsave(&relax_lock, s);
> p = relax_record_list;
> relax_record_list = NULL;
> relax_overall = 0;
> relax_queued = 0;
> memset(relax_jhash, 0, sizeof(relax_jhash));
> - xnlock_put(&relax_lock);
> + xnlock_put_irqrestore(&relax_lock, s);
>
> while (p) {
> np = p->r_next;
>
Please review/merge. It's also stable material.
Thanks,
Jan
--
Siemens AG, Corporate Technology, CT RDA ITP SES-DE
Corporate Competence Center Embedded Linux
^ permalink raw reply [flat|nested] 2+ messages in thread
* Re: [Xenomai] Jan Kiszka : cobalt/debug: Fix locking
2017-11-13 16:34 ` [Xenomai] Jan Kiszka : cobalt/debug: Fix locking Jan Kiszka
@ 2017-11-14 16:47 ` Philippe Gerum
0 siblings, 0 replies; 2+ messages in thread
From: Philippe Gerum @ 2017-11-14 16:47 UTC (permalink / raw)
To: Jan Kiszka; +Cc: xenomai
On 11/13/2017 05:34 PM, Jan Kiszka wrote:
> On 2017-10-12 12:36, git repository hosting wrote:
>> Module: xenomai-jki
>> Branch: for-forge
>> Commit: 02424d69f933bea30904b6ef53168c3a3aca8459
>> URL: http://git.xenomai.org/?p=xenomai-jki.git;a=commit;h=02424d69f933bea30904b6ef53168c3a3aca8459
>>
>> Author: Jan Kiszka <jan.kiszka@siemens.com>
>> Date: Thu Oct 12 09:46:41 2017 +0200
>>
>> cobalt/debug: Fix locking
>>
>> None of these functions are called over interrupt context. Leaving the
>> critical sections interruptible can cause premature/double-unlock
>> scenarios and bug reports such as
>>
>> [Xenomai] lock ffffffff81c56000 already unlocked on CPU #1
>> last owner = kernel/xenomai/debug.c:74 (hash_symbol(), CPU #1)
>> 000000000000002f ffff88007dc8bb10 ffffffff8118ae8f ffffffff00000001
>> 0000000000000021 ffff88007f897fde ffff88007dc8bb50 ffffffff8118b266
>> 00000000000000f1 ffff88007dc8bd68 0000000000000006 ffff88007dc8bd40
>> Call Trace:
>> [<ffffffff8118ae8f>] xnlock_dbg_release+0xdf/0xf0
>> [<ffffffff8118b266>] hash_symbol+0x236/0x2d0
>> [<ffffffff8118b668>] xndebug_trace_relax+0x118/0x450
>> [<ffffffff811b8d50>] ? CoBaLt32emu_mmap+0xf0/0xf0
>> [<ffffffff811b8dd7>] CoBaLt32emu_backtrace+0x87/0xb0
>> [<ffffffff8100def6>] ? fpu__clear+0xd6/0x160
>> [<ffffffff817b3691>] ? _raw_spin_unlock_irq+0x11/0x30
>> [<ffffffff811ab1cc>] ipipe_syscall_hook+0x11c/0x3a0
>> [<ffffffff8113d9bf>] __ipipe_notify_syscall+0xbf/0x180
>> [<ffffffff810cd019>] ? __set_current_blocked+0x49/0x50
>> [<ffffffff8113daab>] ipipe_handle_syscall+0x2b/0xb0
>> [<ffffffff81001c9d>] do_fast_syscall_32+0xbd/0x220
>> [<ffffffff817b64e2>] sysenter_flags_fixed+0x8/0x12
>>
>> Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
>>
>> ---
>>
>> kernel/cobalt/debug.c | 28 ++++++++++++++++------------
>> 1 file changed, 16 insertions(+), 12 deletions(-)
>>
>> diff --git a/kernel/cobalt/debug.c b/kernel/cobalt/debug.c
>> index 159b3c7..e5f4ab9 100644
>> --- a/kernel/cobalt/debug.c
>> +++ b/kernel/cobalt/debug.c
>> @@ -64,14 +64,15 @@ DEFINE_PRIVATE_XNLOCK(symbol_lock);
>> static const char *hash_symbol(const char *symbol)
>> {
>> struct hashed_symbol *p, **h;
>> - const char *s;
>> + const char *str;
>> size_t len;
>> u32 hash;
>> + spl_t s;
>>
>> len = strlen(symbol);
>> hash = jhash(symbol, len, 0);
>>
>> - xnlock_get(&symbol_lock);
>> + xnlock_get_irqsave(&symbol_lock, s);
>>
>> h = &symbol_jhash[hash & (SYMBOL_HSLOTS - 1)];
>> p = *h;
>> @@ -85,7 +86,7 @@ static const char *hash_symbol(const char *symbol)
>>
>> p = xnheap_alloc(&memory_pool, sizeof(*p) + len + 1);
>> if (p == NULL) {
>> - s = NULL;
>> + str = NULL;
>> goto out;
>> }
>>
>> @@ -93,11 +94,11 @@ static const char *hash_symbol(const char *symbol)
>> p->next = *h;
>> *h = p;
>> done:
>> - s = p->symbol;
>> + str = p->symbol;
>> out:
>> - xnlock_put(&symbol_lock);
>> + xnlock_put_irqrestore(&symbol_lock, s);
>>
>> - return s;
>> + return str;
>> }
>>
>> /*
>> @@ -214,6 +215,7 @@ void xndebug_trace_relax(int nr, unsigned long *backtrace,
>> int n, depth;
>> char *tmp;
>> u32 hash;
>> + spl_t s;
>>
>> thread = xnthread_current();
>> if (thread == NULL)
>> @@ -285,7 +287,7 @@ void xndebug_trace_relax(int nr, unsigned long *backtrace,
>> strcpy(spot.thread, thread->name);
>> hash = jhash2((u32 *)&spot, sizeof(spot) / sizeof(u32), 0);
>>
>> - xnlock_get(&relax_lock);
>> + xnlock_get_irqsave(&relax_lock, s);
>>
>> h = &relax_jhash[hash & (RELAX_HSLOTS - 1)];
>> p = *h;
>> @@ -326,7 +328,7 @@ void xndebug_trace_relax(int nr, unsigned long *backtrace,
>> out:
>> relax_overall++;
>>
>> - xnlock_put(&relax_lock);
>> + xnlock_put_irqrestore(&relax_lock, s);
>> }
>>
>> static DEFINE_VFILE_HOSTLOCK(relax_mutex);
>> @@ -343,6 +345,7 @@ static void *relax_vfile_begin(struct xnvfile_regular_iterator *it)
>> {
>> struct relax_vfile_priv *priv = xnvfile_iterator_priv(it);
>> struct relax_record *p;
>> + spl_t s;
>> int n;
>>
>> /*
>> @@ -352,7 +355,7 @@ static void *relax_vfile_begin(struct xnvfile_regular_iterator *it)
>> * holds the relax_mutex lock for us, so that we can't race
>> * with ->store().
>> */
>> - xnlock_get(&relax_lock);
>> + xnlock_get_irqsave(&relax_lock, s);
>>
>> if (relax_queued == 0 || it->pos > relax_queued) {
>> xnlock_put(&relax_lock);
>> @@ -362,7 +365,7 @@ static void *relax_vfile_begin(struct xnvfile_regular_iterator *it)
>> priv->queued = relax_queued;
>> priv->head = relax_record_list;
>>
>> - xnlock_put(&relax_lock);
>> + xnlock_put_irqrestore(&relax_lock, s);
>>
>> if (it->pos == 0) {
>> priv->curr = NULL;
>> @@ -447,19 +450,20 @@ static int relax_vfile_show(struct xnvfile_regular_iterator *it, void *data)
>> static ssize_t relax_vfile_store(struct xnvfile_input *input)
>> {
>> struct relax_record *p, *np;
>> + spl_t s;
>>
>> /*
>> * Flush out all records. Races with ->show() are prevented
>> * using the relax_mutex lock. The vfile layer takes care of
>> * this internally.
>> */
>> - xnlock_get(&relax_lock);
>> + xnlock_get_irqsave(&relax_lock, s);
>> p = relax_record_list;
>> relax_record_list = NULL;
>> relax_overall = 0;
>> relax_queued = 0;
>> memset(relax_jhash, 0, sizeof(relax_jhash));
>> - xnlock_put(&relax_lock);
>> + xnlock_put_irqrestore(&relax_lock, s);
>>
>> while (p) {
>> np = p->r_next;
>>
>
> Please review/merge. It's also stable material.
>
Merged, thanks.
--
Philippe.
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2017-11-14 16:47 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
[not found] <E1e2arC-0007kc-Al@xenomai.org>
2017-11-13 16:34 ` [Xenomai] Jan Kiszka : cobalt/debug: Fix locking Jan Kiszka
2017-11-14 16:47 ` Philippe Gerum
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.