diff options
| -rw-r--r-- | arch/parisc/kernel/syscall.S | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/arch/parisc/kernel/syscall.S b/arch/parisc/kernel/syscall.S index a63bb179f79a..838786011037 100644 --- a/arch/parisc/kernel/syscall.S +++ b/arch/parisc/kernel/syscall.S | |||
| @@ -589,10 +589,13 @@ cas_nocontend: | |||
| 589 | # endif | 589 | # endif |
| 590 | /* ENABLE_LWS_DEBUG */ | 590 | /* ENABLE_LWS_DEBUG */ |
| 591 | 591 | ||
| 592 | rsm PSW_SM_I, %r0 /* Disable interrupts */ | ||
| 593 | /* COW breaks can cause contention on UP systems */ | ||
| 592 | LDCW 0(%sr2,%r20), %r28 /* Try to acquire the lock */ | 594 | LDCW 0(%sr2,%r20), %r28 /* Try to acquire the lock */ |
| 593 | cmpb,<>,n %r0, %r28, cas_action /* Did we get it? */ | 595 | cmpb,<>,n %r0, %r28, cas_action /* Did we get it? */ |
| 594 | cas_wouldblock: | 596 | cas_wouldblock: |
| 595 | ldo 2(%r0), %r28 /* 2nd case */ | 597 | ldo 2(%r0), %r28 /* 2nd case */ |
| 598 | ssm PSW_SM_I, %r0 | ||
| 596 | b lws_exit /* Contended... */ | 599 | b lws_exit /* Contended... */ |
| 597 | ldo -EAGAIN(%r0), %r21 /* Spin in userspace */ | 600 | ldo -EAGAIN(%r0), %r21 /* Spin in userspace */ |
| 598 | 601 | ||
| @@ -619,15 +622,17 @@ cas_action: | |||
| 619 | stw %r1, 4(%sr2,%r20) | 622 | stw %r1, 4(%sr2,%r20) |
| 620 | #endif | 623 | #endif |
| 621 | /* The load and store could fail */ | 624 | /* The load and store could fail */ |
| 622 | 1: ldw 0(%sr3,%r26), %r28 | 625 | 1: ldw,ma 0(%sr3,%r26), %r28 |
| 623 | sub,<> %r28, %r25, %r0 | 626 | sub,<> %r28, %r25, %r0 |
| 624 | 2: stw %r24, 0(%sr3,%r26) | 627 | 2: stw,ma %r24, 0(%sr3,%r26) |
| 625 | /* Free lock */ | 628 | /* Free lock */ |
| 626 | stw %r20, 0(%sr2,%r20) | 629 | stw,ma %r20, 0(%sr2,%r20) |
| 627 | #if ENABLE_LWS_DEBUG | 630 | #if ENABLE_LWS_DEBUG |
| 628 | /* Clear thread register indicator */ | 631 | /* Clear thread register indicator */ |
| 629 | stw %r0, 4(%sr2,%r20) | 632 | stw %r0, 4(%sr2,%r20) |
| 630 | #endif | 633 | #endif |
| 634 | /* Enable interrupts */ | ||
| 635 | ssm PSW_SM_I, %r0 | ||
| 631 | /* Return to userspace, set no error */ | 636 | /* Return to userspace, set no error */ |
| 632 | b lws_exit | 637 | b lws_exit |
| 633 | copy %r0, %r21 | 638 | copy %r0, %r21 |
| @@ -639,6 +644,7 @@ cas_action: | |||
| 639 | #if ENABLE_LWS_DEBUG | 644 | #if ENABLE_LWS_DEBUG |
| 640 | stw %r0, 4(%sr2,%r20) | 645 | stw %r0, 4(%sr2,%r20) |
| 641 | #endif | 646 | #endif |
| 647 | ssm PSW_SM_I, %r0 | ||
| 642 | b lws_exit | 648 | b lws_exit |
| 643 | ldo -EFAULT(%r0),%r21 /* set errno */ | 649 | ldo -EFAULT(%r0),%r21 /* set errno */ |
| 644 | nop | 650 | nop |
