From mboxrd@z Thu Jan 1 00:00:00 1970 From: Thomas Hellstrom Subject: Re: [PATCH] drm: Fix an unwanted master inheritance v2 Date: Thu, 3 Dec 2015 21:27:55 +0100 Message-ID: <5660A5CB.1000702@vmware.com> References: <1449077086-3125-1-git-send-email-thellstrom@vmware.com> <87wpsv23bh.fsf@intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from smtp-outbound-1.vmware.com (smtp-outbound-1.vmware.com [208.91.2.12]) by gabe.freedesktop.org (Postfix) with ESMTPS id DE00D6EC96 for ; Thu, 3 Dec 2015 12:28:02 -0800 (PST) In-Reply-To: <87wpsv23bh.fsf@intel.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: Jani Nikula , dri-devel@lists.freedesktop.org, linux-graphics-maintainer@vmware.com Cc: pv-drivers@vmware.com, stable@vger.kernel.org List-Id: dri-devel@lists.freedesktop.org SGksCgpPbiAxMi8wMy8yMDE1IDEyOjEyIFBNLCBKYW5pIE5pa3VsYSB3cm90ZToKPiBPbiBXZWQs IDAyIERlYyAyMDE1LCBUaG9tYXMgSGVsbHN0cm9tIDx0aGVsbHN0cm9tQHZtd2FyZS5jb20+IHdy b3RlOgo+PiBBIGNsaWVudCBjYWxsaW5nIGRybVNldE1hc3RlcigpIHVzaW5nIGEgZmlsZSBkZXNj cmlwdG9yIHRoYXQgd2FzIG9wZW5lZAo+PiB3aGVuIGFub3RoZXIgY2xpZW50IHdhcyBtYXN0ZXIg d291bGQgaW5oZXJpdCB0aGUgbGF0dGVyIGNsaWVudCdzIG1hc3Rlcgo+PiBvYmplY3QgYW5kIGFs bCBpdHMgYXV0aGVudGljYXRlZCBjbGllbnRzLgo+Pgo+PiBUaGlzIGlzIHVud2FudGVkIGJlaGF2 aW91ciwgYW5kIHdoZW4gdGhpcyBoYXBwZW5zLCBpbnN0ZWFkIGFsbG9jYXRlIGEKPj4gYnJhbmQg bmV3IG1hc3RlciBvYmplY3QgZm9yIHRoZSBjbGllbnQgY2FsbGluZyBkcm1TZXRNYXN0ZXIoKS4K Pj4KPj4gRml4ZXMgYSBCVUcoKSB0aHJvdyBpbiB2bXdfbWFzdGVyX3NldCgpLgo+Pgo+PiBDYzog PHN0YWJsZUB2Z2VyLmtlcm5lbC5vcmc+Cj4+IFNpZ25lZC1vZmYtYnk6IFRob21hcyBIZWxsc3Ry b20gPHRoZWxsc3Ryb21Adm13YXJlLmNvbT4KPiBEcml2ZS1ieSBiaWtlc2hlZGRpbmcsIHRoZSBh Y3R1YWwgY2hhbmdlIG1pZ2h0IGxvb2sgbmVhdGVyIChhbmQgZWFzaWVyCj4gdG8gcmV2ZXJ0IGlm IHNvbWV0aGluZyBmYWxscyBhcGFydCkgaWYgeW91IGV4dHJhY3RlZCB0aGUKPiBkcm1fbmV3X3Nl dF9tYXN0ZXIoKSBhYnN0cmFjdGlvbiBhcyBhIHNlcGFyYXRlIG5vbi1mdW5jdGlvbmFsIHByZXAK PiBwYXRjaC4gTm90IGluc2lzdGluZywganVzdCBhIHRob3VnaHQuCj4KPiBCUiwKPiBKYW5pLgpX aGlsZSB5b3UncmUgcHJvYmFibHkgcmlnaHQsIEkgcHJlZmVyIHRvIGhhdmUgdGhpcyBhcyBhIHNp bmdsZSBwYXRjaCB0bwphdm9pZCBlbmRpbmcgdXAgaW4gYSBiYWNrcG9ydGluZyBuaWdodG1hcmUg Zm9yIHN0YWJsZS4KClRoYW5rcywKVGhvbWFzCgoKCgoKPgo+Cj4KPj4gLS0tCj4+ICBkcml2ZXJz L2dwdS9kcm0vZHJtX2Rydi5jICB8ICA1ICsrKwo+PiAgZHJpdmVycy9ncHUvZHJtL2RybV9mb3Bz LmMgfCA4NCArKysrKysrKysrKysrKysrKysrKysrKysrKysrKystLS0tLS0tLS0tLS0tLS0tCj4+ ICBpbmNsdWRlL2RybS9kcm1QLmggICAgICAgICB8ICA2ICsrKysKPj4gIDMgZmlsZXMgY2hhbmdl ZCwgNjcgaW5zZXJ0aW9ucygrKSwgMjggZGVsZXRpb25zKC0pCj4+Cj4+IGRpZmYgLS1naXQgYS9k cml2ZXJzL2dwdS9kcm0vZHJtX2Rydi5jIGIvZHJpdmVycy9ncHUvZHJtL2RybV9kcnYuYwo+PiBp bmRleCA5MzYyNjA5Li43ZGQ2NzI4IDEwMDY0NAo+PiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0vZHJt X2Rydi5jCj4+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fZHJ2LmMKPj4gQEAgLTE2MCw2ICsx NjAsMTEgQEAgaW50IGRybV9zZXRtYXN0ZXJfaW9jdGwoc3RydWN0IGRybV9kZXZpY2UgKmRldiwg dm9pZCAqZGF0YSwKPj4gIAkJZ290byBvdXRfdW5sb2NrOwo+PiAgCX0KPj4gIAo+PiArCWlmICgh ZmlsZV9wcml2LT5hbGxvd2VkX21hc3Rlcikgewo+PiArCQlyZXQgPSBkcm1fbmV3X3NldF9tYXN0 ZXIoZGV2LCBmaWxlX3ByaXYpOwo+PiArCQlnb3RvIG91dF91bmxvY2s7Cj4+ICsJfQo+PiArCj4+ ICAJZmlsZV9wcml2LT5taW5vci0+bWFzdGVyID0gZHJtX21hc3Rlcl9nZXQoZmlsZV9wcml2LT5t YXN0ZXIpOwo+PiAgCWZpbGVfcHJpdi0+aXNfbWFzdGVyID0gMTsKPj4gIAlpZiAoZGV2LT5kcml2 ZXItPm1hc3Rlcl9zZXQpIHsKPj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fZm9w cy5jIGIvZHJpdmVycy9ncHUvZHJtL2RybV9mb3BzLmMKPj4gaW5kZXggYzU5Y2U0ZC4uNmI1NjI1 ZSAxMDA2NDQKPj4gLS0tIGEvZHJpdmVycy9ncHUvZHJtL2RybV9mb3BzLmMKPj4gKysrIGIvZHJp dmVycy9ncHUvZHJtL2RybV9mb3BzLmMKPj4gQEAgLTEyNiw2ICsxMjYsNjAgQEAgc3RhdGljIGlu dCBkcm1fY3B1X3ZhbGlkKHZvaWQpCj4+ICB9Cj4+ICAKPj4gIC8qKgo+PiArICogZHJtX25ld19z ZXRfbWFzdGVyIC0gQWxsb2NhdGUgYSBuZXcgbWFzdGVyIG9iamVjdCBhbmQgYmVjb21lIG1hc3Rl ciBmb3IgdGhlCj4+ICsgKiBhc3NvY2lhdGVkIG1hc3RlciByZWFsbS4KPj4gKyAqCj4+ICsgKiBA ZGV2OiBUaGUgYXNzb2NpYXRlZCBkZXZpY2UuCj4+ICsgKiBAZnByaXY6IEZpbGUgcHJpdmF0ZSBp ZGVudGlmeWluZyB0aGUgY2xpZW50Lgo+PiArICoKPj4gKyAqIFRoaXMgZnVuY3Rpb24gbXVzdCBi ZSBjYWxsZWQgd2l0aCBkZXY6OnN0cnVjdF9tdXRleCBoZWxkLgo+PiArICogUmV0dXJucyBuZWdh dGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuIFplcm8gb24gc3VjY2Vzcy4KPj4gKyAqLwo+PiAr aW50IGRybV9uZXdfc2V0X21hc3RlcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZHJt X2ZpbGUgKmZwcml2KQo+PiArewo+PiArCXN0cnVjdCBkcm1fbWFzdGVyICpvbGRfbWFzdGVyOwo+ PiArCWludCByZXQ7Cj4+ICsKPj4gKwlsb2NrZGVwX2Fzc2VydF9oZWxkX29uY2UoJmRldi0+bWFz dGVyX211dGV4KTsKPj4gKwo+PiArCS8qIGNyZWF0ZSBhIG5ldyBtYXN0ZXIgKi8KPj4gKwlmcHJp di0+bWlub3ItPm1hc3RlciA9IGRybV9tYXN0ZXJfY3JlYXRlKGZwcml2LT5taW5vcik7Cj4+ICsJ aWYgKCFmcHJpdi0+bWlub3ItPm1hc3RlcikKPj4gKwkJcmV0dXJuIC1FTk9NRU07Cj4+ICsKPj4g KwkvKiB0YWtlIGFub3RoZXIgcmVmZXJlbmNlIGZvciB0aGUgY29weSBpbiB0aGUgbG9jYWwgZmls ZSBwcml2ICovCj4+ICsJb2xkX21hc3RlciA9IGZwcml2LT5tYXN0ZXI7Cj4+ICsJZnByaXYtPm1h c3RlciA9IGRybV9tYXN0ZXJfZ2V0KGZwcml2LT5taW5vci0+bWFzdGVyKTsKPj4gKwo+PiArCWlm IChkZXYtPmRyaXZlci0+bWFzdGVyX2NyZWF0ZSkgewo+PiArCQlyZXQgPSBkZXYtPmRyaXZlci0+ bWFzdGVyX2NyZWF0ZShkZXYsIGZwcml2LT5tYXN0ZXIpOwo+PiArCQlpZiAocmV0KQo+PiArCQkJ Z290byBvdXRfZXJyOwo+PiArCX0KPj4gKwlpZiAoZGV2LT5kcml2ZXItPm1hc3Rlcl9zZXQpIHsK Pj4gKwkJcmV0ID0gZGV2LT5kcml2ZXItPm1hc3Rlcl9zZXQoZGV2LCBmcHJpdiwgdHJ1ZSk7Cj4+ ICsJCWlmIChyZXQpCj4+ICsJCQlnb3RvIG91dF9lcnI7Cj4+ICsJfQo+PiArCj4+ICsJZnByaXYt PmlzX21hc3RlciA9IDE7Cj4+ICsJZnByaXYtPmFsbG93ZWRfbWFzdGVyID0gMTsKPj4gKwlmcHJp di0+YXV0aGVudGljYXRlZCA9IDE7Cj4+ICsJaWYgKG9sZF9tYXN0ZXIpCj4+ICsJCWRybV9tYXN0 ZXJfcHV0KCZvbGRfbWFzdGVyKTsKPj4gKwo+PiArCXJldHVybiAwOwo+PiArCj4+ICtvdXRfZXJy Ogo+PiArCS8qIGRyb3AgYm90aCByZWZlcmVuY2VzIGFuZCByZXN0b3JlIG9sZCBtYXN0ZXIgb24g ZmFpbHVyZSAqLwo+PiArCWRybV9tYXN0ZXJfcHV0KCZmcHJpdi0+bWlub3ItPm1hc3Rlcik7Cj4+ ICsJZHJtX21hc3Rlcl9wdXQoJmZwcml2LT5tYXN0ZXIpOwo+PiArCWZwcml2LT5tYXN0ZXIgPSBv bGRfbWFzdGVyOwo+PiArCj4+ICsJcmV0dXJuIHJldDsKPj4gK30KPj4gKwo+PiArLyoqCj4+ICAg KiBDYWxsZWQgd2hlbmV2ZXIgYSBwcm9jZXNzIG9wZW5zIC9kZXYvZHJtLgo+PiAgICoKPj4gICAq IFxwYXJhbSBmaWxwIGZpbGUgcG9pbnRlci4KPj4gQEAgLTE4OSwzNSArMjQzLDkgQEAgc3RhdGlj IGludCBkcm1fb3Blbl9oZWxwZXIoc3RydWN0IGZpbGUgKmZpbHAsIHN0cnVjdCBkcm1fbWlub3Ig Km1pbm9yKQo+PiAgCW11dGV4X2xvY2soJmRldi0+bWFzdGVyX211dGV4KTsKPj4gIAlpZiAoZHJt X2lzX3ByaW1hcnlfY2xpZW50KHByaXYpICYmICFwcml2LT5taW5vci0+bWFzdGVyKSB7Cj4+ICAJ CS8qIGNyZWF0ZSBhIG5ldyBtYXN0ZXIgKi8KPj4gLQkJcHJpdi0+bWlub3ItPm1hc3RlciA9IGRy bV9tYXN0ZXJfY3JlYXRlKHByaXYtPm1pbm9yKTsKPj4gLQkJaWYgKCFwcml2LT5taW5vci0+bWFz dGVyKSB7Cj4+IC0JCQlyZXQgPSAtRU5PTUVNOwo+PiArCQlyZXQgPSBkcm1fbmV3X3NldF9tYXN0 ZXIoZGV2LCBwcml2KTsKPj4gKwkJaWYgKHJldCkKPj4gIAkJCWdvdG8gb3V0X2Nsb3NlOwo+PiAt CQl9Cj4+IC0KPj4gLQkJcHJpdi0+aXNfbWFzdGVyID0gMTsKPj4gLQkJLyogdGFrZSBhbm90aGVy IHJlZmVyZW5jZSBmb3IgdGhlIGNvcHkgaW4gdGhlIGxvY2FsIGZpbGUgcHJpdiAqLwo+PiAtCQlw cml2LT5tYXN0ZXIgPSBkcm1fbWFzdGVyX2dldChwcml2LT5taW5vci0+bWFzdGVyKTsKPj4gLQkJ cHJpdi0+YXV0aGVudGljYXRlZCA9IDE7Cj4+IC0KPj4gLQkJaWYgKGRldi0+ZHJpdmVyLT5tYXN0 ZXJfY3JlYXRlKSB7Cj4+IC0JCQlyZXQgPSBkZXYtPmRyaXZlci0+bWFzdGVyX2NyZWF0ZShkZXYs IHByaXYtPm1hc3Rlcik7Cj4+IC0JCQlpZiAocmV0KSB7Cj4+IC0JCQkJLyogZHJvcCBib3RoIHJl ZmVyZW5jZXMgaWYgdGhpcyBmYWlscyAqLwo+PiAtCQkJCWRybV9tYXN0ZXJfcHV0KCZwcml2LT5t aW5vci0+bWFzdGVyKTsKPj4gLQkJCQlkcm1fbWFzdGVyX3B1dCgmcHJpdi0+bWFzdGVyKTsKPj4g LQkJCQlnb3RvIG91dF9jbG9zZTsKPj4gLQkJCX0KPj4gLQkJfQo+PiAtCQlpZiAoZGV2LT5kcml2 ZXItPm1hc3Rlcl9zZXQpIHsKPj4gLQkJCXJldCA9IGRldi0+ZHJpdmVyLT5tYXN0ZXJfc2V0KGRl diwgcHJpdiwgdHJ1ZSk7Cj4+IC0JCQlpZiAocmV0KSB7Cj4+IC0JCQkJLyogZHJvcCBib3RoIHJl ZmVyZW5jZXMgaWYgdGhpcyBmYWlscyAqLwo+PiAtCQkJCWRybV9tYXN0ZXJfcHV0KCZwcml2LT5t aW5vci0+bWFzdGVyKTsKPj4gLQkJCQlkcm1fbWFzdGVyX3B1dCgmcHJpdi0+bWFzdGVyKTsKPj4g LQkJCQlnb3RvIG91dF9jbG9zZTsKPj4gLQkJCX0KPj4gLQkJfQo+PiAgCX0gZWxzZSBpZiAoZHJt X2lzX3ByaW1hcnlfY2xpZW50KHByaXYpKSB7Cj4+ICAJCS8qIGdldCBhIHJlZmVyZW5jZSB0byB0 aGUgbWFzdGVyICovCj4+ICAJCXByaXYtPm1hc3RlciA9IGRybV9tYXN0ZXJfZ2V0KHByaXYtPm1p bm9yLT5tYXN0ZXIpOwo+PiBkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kcm0vZHJtUC5oIGIvaW5jbHVk ZS9kcm0vZHJtUC5oCj4+IGluZGV4IDBiOTIxYWUuLjQ0MWIyNmUgMTAwNjQ0Cj4+IC0tLSBhL2lu Y2x1ZGUvZHJtL2RybVAuaAo+PiArKysgYi9pbmNsdWRlL2RybS9kcm1QLmgKPj4gQEAgLTMwOSw2 ICszMDksMTEgQEAgc3RydWN0IGRybV9maWxlIHsKPj4gIAl1bnNpZ25lZCB1bml2ZXJzYWxfcGxh bmVzOjE7Cj4+ICAJLyogdHJ1ZSBpZiBjbGllbnQgdW5kZXJzdGFuZHMgYXRvbWljIHByb3BlcnRp ZXMgKi8KPj4gIAl1bnNpZ25lZCBhdG9taWM6MTsKPj4gKwkvKgo+PiArCSAqIFRoaXMgY2xpZW50 IGlzIGFsbG93ZWQgdG8gZ2FpbiBtYXN0ZXIgcHJpdmlsZWdlcyBmb3IgQG1hc3Rlci4KPj4gKwkg KiBQcm90ZWN0ZWQgYnkgc3RydWN0IGRybV9kZXZpY2U6Om1hc3Rlcl9tdXRleC4KPj4gKwkgKi8K Pj4gKwl1bnNpZ25lZCBhbGxvd2VkX21hc3RlcjoxOwo+PiAgCj4+ICAJc3RydWN0IHBpZCAqcGlk Owo+PiAgCWt1aWRfdCB1aWQ7Cj4+IEBAIC05MTAsNiArOTE1LDcgQEAgZXh0ZXJuIGludCBkcm1f b3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCk7Cj4+ICBleHRlcm4g c3NpemVfdCBkcm1fcmVhZChzdHJ1Y3QgZmlsZSAqZmlscCwgY2hhciBfX3VzZXIgKmJ1ZmZlciwK Pj4gIAkJCXNpemVfdCBjb3VudCwgbG9mZl90ICpvZmZzZXQpOwo+PiAgZXh0ZXJuIGludCBkcm1f cmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCk7Cj4+ICtleHRl cm4gaW50IGRybV9uZXdfc2V0X21hc3RlcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3Qg ZHJtX2ZpbGUgKmZwcml2KTsKPj4gIAo+PiAgCQkJCS8qIE1hcHBpbmcgc3VwcG9ydCAoZHJtX3Zt LmgpICovCj4+ICBleHRlcm4gdW5zaWduZWQgaW50IGRybV9wb2xsKHN0cnVjdCBmaWxlICpmaWxw LCBzdHJ1Y3QgcG9sbF90YWJsZV9zdHJ1Y3QgKndhaXQpOwoKX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX18KZHJpLWRldmVsIG1haWxpbmcgbGlzdApkcmktZGV2 ZWxAbGlzdHMuZnJlZWRlc2t0b3Aub3JnCmh0dHA6Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcvbWFp bG1hbi9saXN0aW5mby9kcmktZGV2ZWwK From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from smtp-outbound-1.vmware.com ([208.91.2.12]:47823 "EHLO smtp-outbound-1.vmware.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753914AbbLCU2D (ORCPT ); Thu, 3 Dec 2015 15:28:03 -0500 Subject: Re: [PATCH] drm: Fix an unwanted master inheritance v2 To: Jani Nikula , , References: <1449077086-3125-1-git-send-email-thellstrom@vmware.com> <87wpsv23bh.fsf@intel.com> CC: , From: Thomas Hellstrom Message-ID: <5660A5CB.1000702@vmware.com> Date: Thu, 3 Dec 2015 21:27:55 +0100 MIME-Version: 1.0 In-Reply-To: <87wpsv23bh.fsf@intel.com> Content-Type: text/plain; charset="windows-1252" Content-Transfer-Encoding: 7bit Sender: stable-owner@vger.kernel.org List-ID: Hi, On 12/03/2015 12:12 PM, Jani Nikula wrote: > On Wed, 02 Dec 2015, Thomas Hellstrom wrote: >> A client calling drmSetMaster() using a file descriptor that was opened >> when another client was master would inherit the latter client's master >> object and all its authenticated clients. >> >> This is unwanted behaviour, and when this happens, instead allocate a >> brand new master object for the client calling drmSetMaster(). >> >> Fixes a BUG() throw in vmw_master_set(). >> >> Cc: >> Signed-off-by: Thomas Hellstrom > Drive-by bikeshedding, the actual change might look neater (and easier > to revert if something falls apart) if you extracted the > drm_new_set_master() abstraction as a separate non-functional prep > patch. Not insisting, just a thought. > > BR, > Jani. While you're probably right, I prefer to have this as a single patch to avoid ending up in a backporting nightmare for stable. Thanks, Thomas > > > >> --- >> drivers/gpu/drm/drm_drv.c | 5 +++ >> drivers/gpu/drm/drm_fops.c | 84 ++++++++++++++++++++++++++++++---------------- >> include/drm/drmP.h | 6 ++++ >> 3 files changed, 67 insertions(+), 28 deletions(-) >> >> diff --git a/drivers/gpu/drm/drm_drv.c b/drivers/gpu/drm/drm_drv.c >> index 9362609..7dd6728 100644 >> --- a/drivers/gpu/drm/drm_drv.c >> +++ b/drivers/gpu/drm/drm_drv.c >> @@ -160,6 +160,11 @@ int drm_setmaster_ioctl(struct drm_device *dev, void *data, >> goto out_unlock; >> } >> >> + if (!file_priv->allowed_master) { >> + ret = drm_new_set_master(dev, file_priv); >> + goto out_unlock; >> + } >> + >> file_priv->minor->master = drm_master_get(file_priv->master); >> file_priv->is_master = 1; >> if (dev->driver->master_set) { >> diff --git a/drivers/gpu/drm/drm_fops.c b/drivers/gpu/drm/drm_fops.c >> index c59ce4d..6b5625e 100644 >> --- a/drivers/gpu/drm/drm_fops.c >> +++ b/drivers/gpu/drm/drm_fops.c >> @@ -126,6 +126,60 @@ static int drm_cpu_valid(void) >> } >> >> /** >> + * drm_new_set_master - Allocate a new master object and become master for the >> + * associated master realm. >> + * >> + * @dev: The associated device. >> + * @fpriv: File private identifying the client. >> + * >> + * This function must be called with dev::struct_mutex held. >> + * Returns negative error code on failure. Zero on success. >> + */ >> +int drm_new_set_master(struct drm_device *dev, struct drm_file *fpriv) >> +{ >> + struct drm_master *old_master; >> + int ret; >> + >> + lockdep_assert_held_once(&dev->master_mutex); >> + >> + /* create a new master */ >> + fpriv->minor->master = drm_master_create(fpriv->minor); >> + if (!fpriv->minor->master) >> + return -ENOMEM; >> + >> + /* take another reference for the copy in the local file priv */ >> + old_master = fpriv->master; >> + fpriv->master = drm_master_get(fpriv->minor->master); >> + >> + if (dev->driver->master_create) { >> + ret = dev->driver->master_create(dev, fpriv->master); >> + if (ret) >> + goto out_err; >> + } >> + if (dev->driver->master_set) { >> + ret = dev->driver->master_set(dev, fpriv, true); >> + if (ret) >> + goto out_err; >> + } >> + >> + fpriv->is_master = 1; >> + fpriv->allowed_master = 1; >> + fpriv->authenticated = 1; >> + if (old_master) >> + drm_master_put(&old_master); >> + >> + return 0; >> + >> +out_err: >> + /* drop both references and restore old master on failure */ >> + drm_master_put(&fpriv->minor->master); >> + drm_master_put(&fpriv->master); >> + fpriv->master = old_master; >> + >> + return ret; >> +} >> + >> +/** >> * Called whenever a process opens /dev/drm. >> * >> * \param filp file pointer. >> @@ -189,35 +243,9 @@ static int drm_open_helper(struct file *filp, struct drm_minor *minor) >> mutex_lock(&dev->master_mutex); >> if (drm_is_primary_client(priv) && !priv->minor->master) { >> /* create a new master */ >> - priv->minor->master = drm_master_create(priv->minor); >> - if (!priv->minor->master) { >> - ret = -ENOMEM; >> + ret = drm_new_set_master(dev, priv); >> + if (ret) >> goto out_close; >> - } >> - >> - priv->is_master = 1; >> - /* take another reference for the copy in the local file priv */ >> - priv->master = drm_master_get(priv->minor->master); >> - priv->authenticated = 1; >> - >> - if (dev->driver->master_create) { >> - ret = dev->driver->master_create(dev, priv->master); >> - if (ret) { >> - /* drop both references if this fails */ >> - drm_master_put(&priv->minor->master); >> - drm_master_put(&priv->master); >> - goto out_close; >> - } >> - } >> - if (dev->driver->master_set) { >> - ret = dev->driver->master_set(dev, priv, true); >> - if (ret) { >> - /* drop both references if this fails */ >> - drm_master_put(&priv->minor->master); >> - drm_master_put(&priv->master); >> - goto out_close; >> - } >> - } >> } else if (drm_is_primary_client(priv)) { >> /* get a reference to the master */ >> priv->master = drm_master_get(priv->minor->master); >> diff --git a/include/drm/drmP.h b/include/drm/drmP.h >> index 0b921ae..441b26e 100644 >> --- a/include/drm/drmP.h >> +++ b/include/drm/drmP.h >> @@ -309,6 +309,11 @@ struct drm_file { >> unsigned universal_planes:1; >> /* true if client understands atomic properties */ >> unsigned atomic:1; >> + /* >> + * This client is allowed to gain master privileges for @master. >> + * Protected by struct drm_device::master_mutex. >> + */ >> + unsigned allowed_master:1; >> >> struct pid *pid; >> kuid_t uid; >> @@ -910,6 +915,7 @@ extern int drm_open(struct inode *inode, struct file *filp); >> extern ssize_t drm_read(struct file *filp, char __user *buffer, >> size_t count, loff_t *offset); >> extern int drm_release(struct inode *inode, struct file *filp); >> +extern int drm_new_set_master(struct drm_device *dev, struct drm_file *fpriv); >> >> /* Mapping support (drm_vm.h) */ >> extern unsigned int drm_poll(struct file *filp, struct poll_table_struct *wait);