Thread (12 messages) 12 messages, 4 authors, 2016-06-15

Re: [PATCH] locking/qrwlock: fix write unlock issue in big endian

From: xinhui <hidden>
Date: 2016-06-15 03:47:38
Also in: lkml


On 2016年06月14日 18:40, Will Deacon wrote:
On Tue, Jun 14, 2016 at 02:11:48PM +0800, xinhui wrote:
quoted
On 2016年06月08日 17:22, Will Deacon wrote:
quoted
On Thu, Jun 02, 2016 at 06:09:08PM +0800, Pan Xinhui wrote:
quoted
strcut __qrwlock has different layout in big endian machine. we need set
the __qrwlock->wmode to NULL, and the address is not &lock->cnts in big
endian machine.

Do as what read unlock does. we are lucky that the __qrwlock->wmode's
val is _QW_LOCKED.
Doesn't this have wider implications for the qrwlocks, for example:

   while ((cnts & _QW_WMASK) == _QW_LOCKED) { ... }

would actually end up looking at the wrong field of the lock?
I does not clearly understand your idea. :(
That's because I'm talking rubbish :) Sorry, I completely confused myself.
Locking is bad enough on its own, but add big-endian to the mix and I'm
all done.
quoted
quoted
Shouldn't we just remove the #ifdef __LITTLE_ENDIAN stuff from __qrwlock,
given that all the struct members are u8?
No. that makes codes complex. for example

struct __qrwlock lock;

WRITE_ONCE(lock->wmode, _QW_WAITING);
if (atomic_(&lock->cnts) == _QW_WAITING) {
	do_something();
}

IF you remove the  #ifdef __LITTLE_ENDIAN stuff from __qrwlock.
codes above obviously will break. And we already have such code.
I was wondering more along the lines of having one definition of the data
structure, but then defining _QW_* differently depending on endianness
(i.e. add a << 24 when big-endian). That way queued_write_unlock can
make sense. And I review all the code, there is not much code to be changed.
I will work out one patch based on your idea :)
stay like it is (having an arch override to handle the big-endian case
is incredibly ugly).
I admit that. HOWEVER from the view of performance, having an arch override is acceptable.

thanks
xinhui
Will
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help