Re: via82cxxx_audio locking problems

Thomas Sailer (sailer@scs.ch)
Fri, 21 Sep 2001 11:27:38 +0200


Dies ist eine mehrteilige Nachricht im MIME-Format.
--------------91FB347F1E3060146B5D1265
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit

Jeff Garzik schrieb:

> Is there a possibility of do_read being re-entered during that window?
> I agree its a problem but the solution sounds racy?

do_read may be reentered. In that case some of the samples land in one read,
the other part in the other read.

This is not a problem, however. UNIX never made any guarantees about
read from or writes to the same fd. Take pipes for example, they don't
guarantee read or write atomicity either. Well, they do guarantee it
if they are all less than PIPEBUF in size. But so do we, the limit
is not called PIPEBUF, but fragment.

> I disagree; I think the idea at aleast is correct: if contention
> exists, it implies that I/O needs to be completed.

Well, it depends what the semaphore is supposed to do. If you (ab)use
it as a waitqueue, then yes, the idea is correct. If you only use it
to guard short critical sections, then the cost of reissuing the syscall
is greater than just waiting for the semaphore to be released.

This is the patch I've tested yesterday. It worked so far.

There is however an unrelated problem that happens both with and without
patch. Sometimes playback sound is very distorted, until I either press
stop, then the remaining second or so continues undistortedly, or I try
to debug the problem. Debugging is anyway difficult without reasonable
docs. It may be a PCI bridge latency issue, as the VIA northbridge my
board uses is fairly crappy.

Tom
--------------91FB347F1E3060146B5D1265
Content-Type: application/octet-stream;
name="via82cxxx_audio.diff"
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
filename="via82cxxx_audio.diff"

LS0tIHZpYTgyY3h4eF9hdWRpby5jLjEuMS4xNQlUaHUgU2VwIDIwIDE1OjQxOjMwIDIwMDEK
KysrIHZpYTgyY3h4eF9hdWRpby5jCVRodSBTZXAgMjAgMTY6MTU6MDUgMjAwMQpAQCAtMTIs
MTAgKzEyLDE3IEBACiAgKiB0aGUgZHJpdmVyJ3MgV2Vic2l0ZSBhdAogICogaHR0cDovL2d0
Zi5vcmcvZ2FyemlrL2RyaXZlcnMvdmlhODJjeHh4LwogICoKKyAqIFRob21hcyBTYWlsZXIs
IDIwMDEtMDktMjA6CisgKiAgIC0gdW5sb2NrIHN5c2NhbGxfc2VtIGR1cmluZyBzbGVlcGlu
ZyBpbiByZWFkL3dyaXRlCisgKiAgIC0gcmV0dXJuIGJ5dGUgY291bnQgaW4gY2FzZSBvZiBw
YXJ0aWFsIHRyYW5zZmVyIGluc3RlYWQgb2YKKyAqICAgICBlcnJvciBpbiByZWFkL3dyaXRl
IHN5c2NhbGxzCisgKiAgIC0gYXZvaWQgbG9vc2luZyB3YWtlX3VwIGV2ZW50CisgKiAgIC0g
bm9uYmxvY2tpbmcgc2VtYXBob3JlIGRvd24gZGlzYWJsZWQKKyAqCiAgKi8KIAogCi0jZGVm
aW5lIFZJQV9WRVJTSU9OCSIxLjEuMTUiCisjZGVmaW5lIFZJQV9WRVJTSU9OCSIxLjEuMTV0
c2EiCiAKIAogI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgpAQCAtNDU5LDYgKzQ2NiwxNCBA
QAogCiBzdGF0aWMgaW5saW5lIGludCB2aWFfc3lzY2FsbF9kb3duIChzdHJ1Y3QgdmlhX2lu
Zm8gKmNhcmQsIGludCBub25ibG9jaykKIHsKKwkvKiBUaG9tYXMgU2FpbGVyOgorCSAqIEVB
R0FJTiBpcyBzdXBwb3NlZCB0byBiZSB1c2VkIGlmIElPIGlzIHBlbmRpbmcsCisJICogbm90
IGlmIHRoZXJlIGlzIGNvbnRlbnRpb24gb24gc29tZSBpbnRlcm5hbAorCSAqIHN5bmNocm9u
aXphdGlvbiBwcmltaXRpdmUgd2hpY2ggc2hvdWxkIGJlCisJICogaGVsZCBvbmx5IGZvciBh
IHNob3J0IHRpbWUgYW55d2F5CisJICovCisJbm9uYmxvY2sgPSAwOworCiAJaWYgKG5vbmJs
b2NrKSB7CiAJCWlmIChkb3duX3RyeWxvY2sgKCZjYXJkLT5zeXNjYWxsX3NlbSkpCiAJCQly
ZXR1cm4gLUVBR0FJTjsKQEAgLTE5NzMsMTggKzE5ODgsMjcgQEAKIAkJCQljaGFyICp1c2Vy
YnVmLCBzaXplX3QgY291bnQsCiAJCQkJaW50IG5vbmJsb2NrKQogeworICAgICAgICBERUNM
QVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKIAljb25zdCBjaGFyICpvcmlnX3VzZXJi
dWYgPSB1c2VyYnVmOwogCXN0cnVjdCB2aWFfY2hhbm5lbCAqY2hhbiA9ICZjYXJkLT5jaF9p
bjsKIAlzaXplX3Qgc2l6ZTsKIAlpbnQgbiwgdG1wOworCXNzaXplX3QgcmV0ID0gMDsKIAog
CS8qIGlmIFNHRCBoYXMgbm90IHlldCBiZWVuIHN0YXJ0ZWQsIHN0YXJ0IGl0ICovCiAJdmlh
X2NoYW5fbWF5YmVfc3RhcnQgKGNoYW4pOwogCiBoYW5kbGVfb25lX2Jsb2NrOgogCS8qIGp1
c3QgdG8gYmUgYSBuaWNlIG5laWdoYm9yICovCi0JaWYgKGN1cnJlbnQtPm5lZWRfcmVzY2hl
ZCkKKwkvKiBUaG9tYXMgU2FpbGVyOgorCSAqIEJ1dCBhbHNvIHRvIG91cnNlbHZlcywgcmVs
ZWFzZSBzZW1hcGhvcmUgaWYgd2UgZG8gc28gKi8KKwlpZiAoY3VycmVudC0+bmVlZF9yZXNj
aGVkKSB7CisJCXVwKCZjYXJkLT5zeXNjYWxsX3NlbSk7CiAJCXNjaGVkdWxlICgpOworCQly
ZXQgPSB2aWFfc3lzY2FsbF9kb3duIChjYXJkLCBub25ibG9jayk7CisJCWlmIChyZXQpCisJ
CQlnb3RvIG91dDsKKwl9CiAKIAkvKiBncmFiIGN1cnJlbnQgY2hhbm5lbCBzb2Z0d2FyZSBw
b2ludGVyLiAgSW4gdGhlIGNhc2Ugb2YKIAkgKiByZWNvcmRpbmcsIHRoaXMgaXMgcG9pbnRp
bmcgdG8gdGhlIG5leHQgYnVmZmVyIHRoYXQKQEAgLTE5OTYsMjEgKzIwMjAsMzcgQEAKIAkg
KiB0byBiZSBjb3BpZWQgdG8gdXNlcmxhbmQuICBzbGVlcCB1bnRpbCBhdCBsZWFzdAogCSAq
IG9uZSBidWZmZXIgaGFzIGJlZW4gcmVhZCBmcm9tIHRoZSBhdWRpbyBoYXJkd2FyZS4KIAkg
Ki8KLQl0bXAgPSBhdG9taWNfcmVhZCAoJmNoYW4tPm5fZnJhZ3MpOwotCWFzc2VydCAodG1w
ID49IDApOwotCWFzc2VydCAodG1wIDw9IGNoYW4tPmZyYWdfbnVtYmVyKTsKLQl3aGlsZSAo
dG1wID09IDApIHsKLQkJaWYgKG5vbmJsb2NrIHx8ICFjaGFuLT5pc19hY3RpdmUpCi0JCQly
ZXR1cm4gLUVBR0FJTjsKKwlhZGRfd2FpdF9xdWV1ZSgmY2hhbi0+d2FpdCwgJndhaXQpOwor
CWZvciAoOzspIHsKKwkJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUp
OworCQl0bXAgPSBhdG9taWNfcmVhZCAoJmNoYW4tPm5fZnJhZ3MpOworCQlhc3NlcnQgKHRt
cCA+PSAwKTsKKwkJYXNzZXJ0ICh0bXAgPD0gY2hhbi0+ZnJhZ19udW1iZXIpOworCQlpZiAo
dG1wKQorCQkJYnJlYWs7CisJCWlmIChub25ibG9jayB8fCAhY2hhbi0+aXNfYWN0aXZlKSB7
CisJCQlyZXQgPSAtRUFHQUlOOworCQkJYnJlYWs7CisJCX0KKworCQl1cCgmY2FyZC0+c3lz
Y2FsbF9zZW0pOwogCiAJCURQUklOVEsgKCJTbGVlcGluZyBvbiBibG9jayAlZFxuIiwgbik7
Ci0JCWludGVycnVwdGlibGVfc2xlZXBfb24gKCZjaGFuLT53YWl0KTsKKwkJc2NoZWR1bGUo
KTsKIAotCQlpZiAoc2lnbmFsX3BlbmRpbmcgKGN1cnJlbnQpKQotCQkJcmV0dXJuIC1FUkVT
VEFSVFNZUzsKKwkJcmV0ID0gdmlhX3N5c2NhbGxfZG93biAoY2FyZCwgbm9uYmxvY2spOwor
CQlpZiAocmV0KQorCQkJYnJlYWs7CiAKLQkJdG1wID0gYXRvbWljX3JlYWQgKCZjaGFuLT5u
X2ZyYWdzKTsKKwkJaWYgKHNpZ25hbF9wZW5kaW5nIChjdXJyZW50KSkgeworCQkJcmV0ID0g
LUVSRVNUQVJUU1lTOworCQkJYnJlYWs7CisJCX0KIAl9CisgICAgICAgIHNldF9jdXJyZW50
X3N0YXRlKFRBU0tfUlVOTklORyk7CisgICAgICAgIHJlbW92ZV93YWl0X3F1ZXVlKCZjaGFu
LT53YWl0LCAmd2FpdCk7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CiAKIAkvKiBOb3cgdGhh
dCB3ZSBoYXZlIGEgYnVmZmVyIHdlIGNhbiByZWFkIGZyb20sIHNlbmQKIAkgKiBhcyBtdWNo
IGFzIHNhbXBsZSBkYXRhIHBvc3NpYmxlIHRvIHVzZXJzcGFjZS4KQEAgLTIwMjEsOCArMjA2
MSwxMCBAQAogCQlzaXplID0gKGNvdW50IDwgc2xvcF9sZWZ0KSA/IGNvdW50IDogc2xvcF9s
ZWZ0OwogCQlpZiAoY29weV90b191c2VyICh1c2VyYnVmLAogCQkJCSAgY2hhbi0+cGd0Ymxb
biAvIChQQUdFX1NJWkUgLyBjaGFuLT5mcmFnX3NpemUpXS5jcHVhZGRyICsgbiAlIChQQUdF
X1NJWkUgLyBjaGFuLT5mcmFnX3NpemUpICsgY2hhbi0+c2xvcF9sZW4sCi0JCQkJICBzaXpl
KSkKLQkJCXJldHVybiAtRUZBVUxUOworCQkJCSAgc2l6ZSkpIHsKKwkJCXJldCA9IC1FRkFV
TFQ7CisJCQlnb3RvIG91dDsKKwkJfQogCiAJCWNvdW50IC09IHNpemU7CiAJCWNoYW4tPnNs
b3BfbGVuICs9IHNpemU7CkBAIC0yMDcxLDcgKzIxMTMsNyBAQAogCQlnb3RvIGhhbmRsZV9v
bmVfYmxvY2s7CiAKIG91dDoKLQlyZXR1cm4gdXNlcmJ1ZiAtIG9yaWdfdXNlcmJ1ZjsKKwly
ZXR1cm4gKHVzZXJidWYgIT0gb3JpZ191c2VyYnVmKSA/ICh1c2VyYnVmIC0gb3JpZ191c2Vy
YnVmKSA6IHJldDsKIH0KIAogCkBAIC0yMTIyLDE2ICsyMTY0LDI1IEBACiAJCQkJIGNvbnN0
IGNoYXIgKnVzZXJidWYsIHNpemVfdCBjb3VudCwKIAkJCQkgaW50IG5vbmJsb2NrKQogewor
ICAgICAgICBERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKIAljb25zdCBjaGFy
ICpvcmlnX3VzZXJidWYgPSB1c2VyYnVmOwogCXN0cnVjdCB2aWFfY2hhbm5lbCAqY2hhbiA9
ICZjYXJkLT5jaF9vdXQ7CiAJdm9sYXRpbGUgc3RydWN0IHZpYV9zZ2RfdGFibGUgKnNndGFi
bGUgPSBjaGFuLT5zZ3RhYmxlOwogCXNpemVfdCBzaXplOwogCWludCBuLCB0bXA7CisJc3Np
emVfdCByZXQgPSAwOwogCiBoYW5kbGVfb25lX2Jsb2NrOgogCS8qIGp1c3QgdG8gYmUgYSBu
aWNlIG5laWdoYm9yICovCi0JaWYgKGN1cnJlbnQtPm5lZWRfcmVzY2hlZCkKKwkvKiBUaG9t
YXMgU2FpbGVyOgorCSAqIEJ1dCBhbHNvIHRvIG91cnNlbHZlcywgcmVsZWFzZSBzZW1hcGhv
cmUgaWYgd2UgZG8gc28gKi8KKwlpZiAoY3VycmVudC0+bmVlZF9yZXNjaGVkKSB7CisJCXVw
KCZjYXJkLT5zeXNjYWxsX3NlbSk7CiAJCXNjaGVkdWxlICgpOworCQlyZXQgPSB2aWFfc3lz
Y2FsbF9kb3duIChjYXJkLCBub25ibG9jayk7CisJCWlmIChyZXQpCisJCQlnb3RvIG91dDsK
Kwl9CiAKIAkvKiBncmFiIGN1cnJlbnQgY2hhbm5lbCBmcmFnbWVudCBwb2ludGVyLiAgSW4g
dGhlIGNhc2Ugb2YKIAkgKiBwbGF5YmFjaywgdGhpcyBpcyBwb2ludGluZyB0byB0aGUgbmV4
dCBmcmFnbWVudCB0aGF0CkBAIC0yMTQzLDIxICsyMTk0LDM3IEBACiAJICogdG8gYmUgZmls
bGVkIGJ5IHVzZXJzcGFjZS4gIFNsZWVwIHVudGlsCiAJICogYXQgbGVhc3Qgb25lIGZyYWdt
ZW50IGlzIGF2YWlsYWJsZSBmb3Igb3VyIHVzZS4KIAkgKi8KLQl0bXAgPSBhdG9taWNfcmVh
ZCAoJmNoYW4tPm5fZnJhZ3MpOwotCWFzc2VydCAodG1wID49IDApOwotCWFzc2VydCAodG1w
IDw9IGNoYW4tPmZyYWdfbnVtYmVyKTsKLQl3aGlsZSAodG1wID09IDApIHsKLQkJaWYgKG5v
bmJsb2NrIHx8ICFjaGFuLT5pc19lbmFibGVkKQotCQkJcmV0dXJuIC1FQUdBSU47CisJYWRk
X3dhaXRfcXVldWUoJmNoYW4tPndhaXQsICZ3YWl0KTsKKwlmb3IgKDs7KSB7CisJCV9fc2V0
X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJdG1wID0gYXRvbWljX3Jl
YWQgKCZjaGFuLT5uX2ZyYWdzKTsKKwkJYXNzZXJ0ICh0bXAgPj0gMCk7CisJCWFzc2VydCAo
dG1wIDw9IGNoYW4tPmZyYWdfbnVtYmVyKTsKKwkJaWYgKHRtcCkKKwkJCWJyZWFrOworCQlp
ZiAobm9uYmxvY2sgfHwgIWNoYW4tPmlzX2FjdGl2ZSkgeworCQkJcmV0ID0gLUVBR0FJTjsK
KwkJCWJyZWFrOworCQl9CisKKwkJdXAoJmNhcmQtPnN5c2NhbGxfc2VtKTsKIAogCQlEUFJJ
TlRLICgiU2xlZXBpbmcgb24gcGFnZSAlZCwgdG1wPT0lZCwgaXI9PSVkXG4iLCBuLCB0bXAs
IGNoYW4tPmlzX3JlY29yZCk7Ci0JCWludGVycnVwdGlibGVfc2xlZXBfb24gKCZjaGFuLT53
YWl0KTsKKwkJc2NoZWR1bGUoKTsKIAotCQlpZiAoc2lnbmFsX3BlbmRpbmcgKGN1cnJlbnQp
KQotCQkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwkJcmV0ID0gdmlhX3N5c2NhbGxfZG93biAo
Y2FyZCwgbm9uYmxvY2spOworCQlpZiAocmV0KQorCQkJYnJlYWs7CiAKLQkJdG1wID0gYXRv
bWljX3JlYWQgKCZjaGFuLT5uX2ZyYWdzKTsKKwkJaWYgKHNpZ25hbF9wZW5kaW5nIChjdXJy
ZW50KSkgeworCQkJcmV0ID0gLUVSRVNUQVJUU1lTOworCQkJYnJlYWs7CisJCX0KIAl9Cisg
ICAgICAgIHNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisgICAgICAgIHJlbW92
ZV93YWl0X3F1ZXVlKCZjaGFuLT53YWl0LCAmd2FpdCk7CisJaWYgKHJldCkKKwkJZ290byBv
dXQ7CiAKIAkvKiBOb3cgdGhhdCB3ZSBoYXZlIGF0IGxlYXN0IG9uZSBmcmFnbWVudCB3ZSBj
YW4gd3JpdGUgdG8sIGZpbGwgdGhlIGJ1ZmZlcgogCSAqIGFzIG11Y2ggYXMgcG9zc2libGUg
d2l0aCBkYXRhIGZyb20gdXNlcnNwYWNlLgpAQCAtMjE2Nyw4ICsyMjM0LDEwIEBACiAKIAkJ
c2l6ZSA9IChjb3VudCA8IHNsb3BfbGVmdCkgPyBjb3VudCA6IHNsb3BfbGVmdDsKIAkJaWYg
KGNvcHlfZnJvbV91c2VyIChjaGFuLT5wZ3RibFtuIC8gKFBBR0VfU0laRSAvIGNoYW4tPmZy
YWdfc2l6ZSldLmNwdWFkZHIgKyAobiAlIChQQUdFX1NJWkUgLyBjaGFuLT5mcmFnX3NpemUp
KSAqIGNoYW4tPmZyYWdfc2l6ZSArIGNoYW4tPnNsb3BfbGVuLAotCQkJCSAgICB1c2VyYnVm
LCBzaXplKSkKLQkJCXJldHVybiAtRUZBVUxUOworCQkJCSAgICB1c2VyYnVmLCBzaXplKSkg
eworCQkJcmV0ID0gLUVGQVVMVDsKKwkJCWdvdG8gb3V0OworCQl9CiAKIAkJY291bnQgLT0g
c2l6ZTsKIAkJY2hhbi0+c2xvcF9sZW4gKz0gc2l6ZTsKQEAgLTIzMzAsNiArMjM5OSw5IEBA
CiBzdGF0aWMgaW50IHZpYV9kc3BfZHJhaW5fcGxheWJhY2sgKHN0cnVjdCB2aWFfaW5mbyAq
Y2FyZCwKIAkJCQkgICBzdHJ1Y3QgdmlhX2NoYW5uZWwgKmNoYW4sIGludCBub25ibG9jaykK
IHsKKyAgICAgICAgREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CisJaW50IHJl
dCA9IDA7CisKIAlEUFJJTlRLICgiRU5URVIsIG5vbmJsb2NrID0gJWRcbiIsIG5vbmJsb2Nr
KTsKIAogCWlmIChjaGFuLT5zbG9wX2xlbiA+IDApCkBAIC0yMzQwLDEwICsyNDEyLDE2IEBA
CiAKIAl2aWFfY2hhbl9tYXliZV9zdGFydCAoY2hhbik7CiAKLQl3aGlsZSAoYXRvbWljX3Jl
YWQgKCZjaGFuLT5uX2ZyYWdzKSA8IGNoYW4tPmZyYWdfbnVtYmVyKSB7CisJYWRkX3dhaXRf
cXVldWUoJmNoYW4tPndhaXQsICZ3YWl0KTsKKwlmb3IgKDs7KSB7CisJCV9fc2V0X2N1cnJl
bnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJaWYgKGF0b21pY19yZWFkICgmY2hh
bi0+bl9mcmFncykgPj0gY2hhbi0+ZnJhZ19udW1iZXIpCisJCQlicmVhazsKKwogCQlpZiAo
bm9uYmxvY2spIHsKIAkJCURQUklOVEsgKCJFWElULCByZXR1cm5pbmcgLUVBR0FJTlxuIik7
Ci0JCQlyZXR1cm4gLUVBR0FJTjsKKwkJCXJldCA9IC1FQUdBSU47CisJCQlicmVhazsKIAkJ
fQogCiAjaWZkZWYgVklBX0RFQlVHCkBAIC0yMzcyLDE0ICsyNDUwLDI0IEBACiAJCQlwcmlu
dGsgKEtFUk5fRVJSICJzbGVlcGluZyBidXQgbm90IGFjdGl2ZVxuIik7CiAjZW5kaWYKIAor
CQl1cCgmY2FyZC0+c3lzY2FsbF9zZW0pOworCiAJCURQUklOVEsgKCJzbGVlcGluZywgbmJ1
ZnM9JWRcbiIsIGF0b21pY19yZWFkICgmY2hhbi0+bl9mcmFncykpOwotCQlpbnRlcnJ1cHRp
YmxlX3NsZWVwX29uICgmY2hhbi0+d2FpdCk7CisJCXNjaGVkdWxlKCk7CisKKwkJaWYgKChy
ZXQgPSB2aWFfc3lzY2FsbF9kb3duIChjYXJkLCBub25ibG9jaykpKQorCQkJYnJlYWs7CiAK
IAkJaWYgKHNpZ25hbF9wZW5kaW5nIChjdXJyZW50KSkgewogCQkJRFBSSU5USyAoIkVYSVQs
IHJldHVybmluZyAtRVJFU1RBUlRTWVNcbiIpOwotCQkJcmV0dXJuIC1FUkVTVEFSVFNZUzsK
KwkJCXJldCA9IC1FUkVTVEFSVFNZUzsKKwkJCWJyZWFrOwogCQl9CiAJfQorICAgICAgICBz
ZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworICAgICAgICByZW1vdmVfd2FpdF9x
dWV1ZSgmY2hhbi0+d2FpdCwgJndhaXQpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CiAK
ICNpZmRlZiBWSUFfREVCVUcKIAl7CkBAIC0yNDA4LDcgKzI0OTYsNyBAQAogCiBvdXQ6CiAJ
RFBSSU5USyAoIkVYSVQsIHJldHVybmluZyAwXG4iKTsKLQlyZXR1cm4gMDsKKwlyZXR1cm4g
cmV0OwogfQogCiAK
--------------91FB347F1E3060146B5D1265--

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/