From: Michael Clark <michaeljclark@mac.com>
To: Christoph Hellwig <hch@infradead.org>
Cc: RISC-V Patches <patches@groups.riscv.org>,
Linux RISC-V <linux-riscv@lists.infradead.org>
Subject: Re: [PATCH 1/3] RISC-V: implement xchg_small and cmpxchg_small for char and short
Date: Mon, 25 Feb 2019 10:03:22 +1300 [thread overview]
Message-ID: <951195a2-1d02-fdf8-c72d-9dae3df9f1ca@mac.com> (raw)
In-Reply-To: <20190212071726.GA15079@infradead.org>
On 12/02/19 8:17 PM, Christoph Hellwig wrote:
>>
>> +extern unsigned long __xchg_relaxed_small(volatile void *ptr, unsigned long new,
>> + unsigned int size);
>> +extern unsigned long __xchg_acquire_small(volatile void *ptr, unsigned long new,
>
> No need for any of the externs on function declarations.
>
>> +++ b/arch/riscv/kernel/cmpxchg.c
>> @@ -0,0 +1,118 @@
>> +/*
>> + * Copyright (C) 2017 Imagination Technologies
>> + * Author: Paul Burton <paul.burton@mips.com>
>> + *
>> + * This program is free software; you can redistribute it and/or modify it
>> + * under the terms of the GNU General Public License as published by the
>> + * Free Software Foundation; either version 2 of the License, or (at your
>> + * option) any later version.
>> + */
>
> Please use an SPDX tag instead of the GPL boilerplate.
Okay.
> Also this code seems to be entirely generic and very similar to the
> mips code. Did you consider making it a generic library routine
> in lib/ instead?
Indeed. After your feedback, I agree. There is no reason why small word
atomic support cannot be generalized, as it is, it is written in terms
of the underlying primitives and is not MIPS specific. The addition, is
the addition of; relaxed, acquire, release; and they can be made
optional if this code is made generic. We have to think how the arch
instantiates the templates, in the C template idiom and that likely
requires some Kconfig magic...
In the mean time, I've absorbed feedback regarding amoadd, and it may be
the case that we end up with an arch specific spinlock for RISC-V. I
have not research rwlocks yet. Below is the sample asm snipped from
another email. Note: this code has not been tested yet...
spin_lock:
lui a2,0x10
amoadd.w a5,a5,(a0)
srliw a4,a5,0x10
2: slliw a5,a5,0x10
srliw a5,a5,0x10
bne a5,a4,3f
ret
3: lw a5,0(a0)
fence r,rw
j 2b
spin_trylock:
lui a5,0x10
lr.w.aq a4,(a0)
addw a5,a5,a4
slliw a3,a5,0x10
srliw a3,a3,0x10
srliw a4,a5,0x10
beq a3,a4,2f
1: li a0,0
ret
2: sc.w.rl a4,a5,(a0)
bnez a4,1b
fence r,rw
li a0,1
ret
spin_unlock:
fence rw,w
1: lr.w.aq a4,(a0)
srliw a5,a4,0x10
addiw a4,a4,1
slliw a4,a4,0x10
srliw a4,a4,0x10
slliw a5,a5,0x10
or a5,a5,a4
sc.w.rl a4,a5,(a0)
bnez a5,1b
ret
Here is the thread where I happened to be thinking at the time about (a
bit of a tangent, but as we know, acos and asin can be formed with atan)
- https://patchwork.kernel.org/patch/10805093/
Reading the per-cpu amoadd thread made me consider a ticket spinlock
that uses amoadd for lock/acquire and LR/SC for trylock and
unlock/release. The idea is a compromise between fairness, code size and
lock structure size. In this case we have a 32-bit spinlock and amoadd
0x0001_0000 is used for head increment/acquire, while release is
slightly more costly, but it balances out the code size quite nicely,
compared to the previous 32-bit ticket spinlock code that I have been
experimenting with (independently from Linux asm-generic qspinlock).
I am interested in fair locks, and would also like to try them in an OoO
simulator that explores the constraints on the bounds of the RISC-V
memory model, such as testing the correctness for the extent of what can
be executed out of order. There is quite a bit of work to get one's head
around this, because I would like to see possible alternate executions.
We can't really do this with QEMU nor spike. Work such as this has
previously been done with black-boxes, however I would like OoO
simulation to be part of general simulation infrastructure for RISC-V
(although I don't currently have funding for that as there is a
reasonably significant effort involved; small steps; like actually
getting different lock variants to test...).
Michael.
_______________________________________________
linux-riscv mailing list
linux-riscv@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-riscv
next prev parent reply other threads:[~2019-02-24 21:03 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-02-11 4:38 [PATCH 0/3] RISC-V: use generic spinlock and rwlock Michael Clark
2019-02-11 4:38 ` [PATCH 1/3] RISC-V: implement xchg_small and cmpxchg_small for char and short Michael Clark
2019-02-12 7:17 ` Christoph Hellwig
2019-02-24 21:03 ` Michael Clark [this message]
2019-02-11 4:38 ` [PATCH 2/3] RISC-V: convert custom spinlock/rwlock to generic qspinlock/qrwlock Michael Clark
2019-02-11 4:38 ` [PATCH 3/3] MIPS: fix truncation in __cmpxchg_small for short values Michael Clark
2019-02-11 12:37 ` Jonas Gorski
2019-02-11 20:20 ` Paul Burton
2019-02-24 0:09 ` Michael Clark
2019-02-11 20:03 ` Paul Burton
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=951195a2-1d02-fdf8-c72d-9dae3df9f1ca@mac.com \
--to=michaeljclark@mac.com \
--cc=hch@infradead.org \
--cc=linux-riscv@lists.infradead.org \
--cc=patches@groups.riscv.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).