All of lore.kernel.org
 help / color / mirror / Atom feed
* Re: [PATCH 1/1] percpu_rw_semaphore: reimplement to not block the readers unnecessarily
@ 2012-11-04  8:47 George Spelvin
  2012-11-04 15:52 ` Oleg Nesterov
  0 siblings, 1 reply; 8+ messages in thread
From: George Spelvin @ 2012-11-04  8:47 UTC (permalink / raw)
  To: oleg, torvalds; +Cc: linux, linux-kernel

Grand poo-bah Linus wrote:
> Now, I doubt you'll find an architecture or C compiler where this will
> actually ever make a difference, but the fact remains that you
> shouldn't use signed integers for counters like this. You should use
> unsigned, and you should rely on the well-defined modulo-2**n
> semantics.

Actually, this is another C standard undefined case that recent versions of
GCC exploit for optimization.

When using signed integers, GCC's optimizer assumes that, if b > 0,
then a + b > a.

For example, the loop:
	for (i = 1; i; i++)
		/* Code */
will never terminate!  Feed the following to gcc -O2 and see for yourself:

extern void foo(int x);

void bar(void)
{
	int i;
	for (i = 0; i >= 0; i++)
		foo(i);
}

here's what I get:

        .file   "test.c"
        .text
        .p2align 4,,15
        .globl  bar
        .type   bar, @function
bar:
.LFB0:
        .cfi_startproc
        pushl   %ebx
        .cfi_def_cfa_offset 8
        .cfi_offset 3, -8
        movl    $1, %ebx
        subl    $24, %esp
        .cfi_def_cfa_offset 32
        .p2align 4,,7
        .p2align 3
.L2:
        movl    %ebx, (%esp)
        addl    $1, %ebx
        call    foo
        jmp     .L2
        .cfi_endproc
.LFE0:
        .size   bar, .-bar
        .ident  "GCC: (Debian 4.7.2-4) 4.7.2"
        .section        .note.GNU-stack,"",@progbits

Notice the lack of test in the "jmp .L2" loop.

It can even handle more complicated cases like:

void bar(int j)
{
        int i = 0;
        do {
                foo(i);
                if (j >= 0)
                        i += j;
                else
                        i -= j;
        } while (i >= 0);
}

... which gcc -O3 neatly splits into two infinite loops, as if I had written:

void bar(int j)
{
        int i = 0;
	if (j >= 0)
		for (; ; i += j)
			foo(i);
	else
		for (; ; i -= j)
			foo(i);
}

^ permalink raw reply	[flat|nested] 8+ messages in thread
* Re: [PATCH 1/2] brw_mutex: big read-write mutex
@ 2012-10-16 19:56 Linus Torvalds
  2012-10-17 16:59 ` Oleg Nesterov
  0 siblings, 1 reply; 8+ messages in thread
From: Linus Torvalds @ 2012-10-16 19:56 UTC (permalink / raw)
  To: Oleg Nesterov
  Cc: Ingo Molnar, Paul E. McKenney, Peter Zijlstra, Srikar Dronamraju,
	Ananth N Mavinakayanahalli, Anton Arapov, linux-kernel

On Mon, Oct 15, 2012 at 12:10 PM, Oleg Nesterov <oleg@redhat.com> wrote:
> This patch adds the new sleeping lock, brw_mutex. Unlike rw_semaphore
> it allows multiple writers too, just "read" and "write" are mutually
> exclusive.

So those semantics just don't sound sane. It's also not what any kind
of normal "rw" lock ever does.

So can you explain why these particular insane semantics are useful,
and what for?

                  Linus

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2012-11-04 15:51 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-11-04  8:47 [PATCH 1/1] percpu_rw_semaphore: reimplement to not block the readers unnecessarily George Spelvin
2012-11-04 15:52 ` Oleg Nesterov
  -- strict thread matches above, loose matches on Subject: below --
2012-10-16 19:56 [PATCH 1/2] brw_mutex: big read-write mutex Linus Torvalds
2012-10-17 16:59 ` Oleg Nesterov
2012-10-17 22:44   ` Paul E. McKenney
2012-10-18 16:24     ` Oleg Nesterov
2012-10-18 16:38       ` Paul E. McKenney
2012-10-18 17:57         ` Oleg Nesterov
2012-10-19 19:28           ` Paul E. McKenney
2012-10-22 23:36             ` [PATCH 0/2] fix and improvements for percpu-rw-semaphores (was: brw_mutex: big read-write mutex) Mikulas Patocka
2012-10-30 18:48               ` Oleg Nesterov
2012-10-31 19:41                 ` [PATCH 0/1] percpu_rw_semaphore: reimplement to not block the readers unnecessarily Oleg Nesterov
2012-10-31 19:41                   ` [PATCH 1/1] " Oleg Nesterov
2012-11-01 15:10                     ` Linus Torvalds
2012-11-01 15:34                       ` Oleg Nesterov
2012-11-01 15:43                     ` Paul E. McKenney
2012-11-01 18:33                       ` Oleg Nesterov
2012-11-02 16:18                         ` Oleg Nesterov

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.