From mboxrd@z Thu Jan 1 00:00:00 1970 From: Dan Magenheimer Subject: [PATCH] tmem: fix domain shutdown problem/race Date: Fri, 13 Nov 2009 16:54:18 -0800 (PST) Message-ID: <03707bb2-cbca-463f-a6c1-8a4e4e1d9eff@default> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="__125816010086522207abhmt015.oracle.com" Return-path: List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xensource.com Errors-To: xen-devel-bounces@lists.xensource.com To: "Xen-Devel (E-mail)" List-Id: xen-devel@lists.xenproject.org --__125816010086522207abhmt015.oracle.com Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Tmem fails to put_domain so a dying domain never gets properly shut down. Also, fix race condition when domain is dying by not allowing any new ops to succeed. Signed-off-by: Dan Magenheimer diff -r accded2f185f xen/common/tmem.c --- a/xen/common/tmem.c=09Thu Nov 12 13:15:40 2009 +0000 +++ b/xen/common/tmem.c=09Fri Nov 13 17:46:24 2009 -0700 @@ -2229,6 +2229,12 @@ EXPORT long do_tmem_op(tmem_cli_op_t uop DUP_START_CYC_COUNTER(flush,succ_get); DUP_START_CYC_COUNTER(flush_obj,succ_get); =20 + if ( client !=3D NULL && tmh_client_is_dying(client) ) + { + rc =3D -ENODEV; + goto out; + } + if ( unlikely(tmh_get_tmemop_from_client(&op, uops) !=3D 0) ) { printk("tmem: can't get tmem struct from %s\n",client_str); @@ -2392,6 +2398,12 @@ EXPORT void tmem_destroy(void *v) if ( client =3D=3D NULL ) return; =20 + if ( !tmh_client_is_dying(client) ) + { + printk("tmem: tmem_destroy can only destroy dying client\n"); + return; + } + if ( tmh_lock_all ) spin_lock(&tmem_spinlock); else diff -r accded2f185f xen/common/tmem_xen.c --- a/xen/common/tmem_xen.c=09Thu Nov 12 13:15:40 2009 +0000 +++ b/xen/common/tmem_xen.c=09Fri Nov 13 17:46:24 2009 -0700 @@ -314,6 +314,7 @@ EXPORT void tmh_client_destroy(tmh_clien #ifndef __i386__ xmem_pool_destroy(tmh->persistent_pool); #endif + put_domain(tmh->domain); xfree(tmh); } =20 diff -r accded2f185f xen/include/xen/tmem_xen.h --- a/xen/include/xen/tmem_xen.h=09Thu Nov 12 13:15:40 2009 +0000 +++ b/xen/include/xen/tmem_xen.h=09Fri Nov 13 17:46:24 2009 -0700 @@ -280,7 +280,7 @@ typedef struct page_info pfp_t; /* this appears to be unreliable when a domain is being shut down */ static inline struct client *tmh_client_from_cli_id(cli_id_t cli_id) { - struct domain *d =3D get_domain_by_id(cli_id); + struct domain *d =3D get_domain_by_id(cli_id); /* incs d->refcnt! */ if (d =3D=3D NULL) return NULL; return (struct client *)(d->tmem); @@ -290,6 +290,8 @@ static inline struct client *tmh_client_ { return (struct client *)(current->domain->tmem); } + +#define tmh_client_is_dying(_client) (!!_client->tmh->domain->is_dying) =20 static inline cli_id_t tmh_get_cli_id_from_current(void) { --__125816010086522207abhmt015.oracle.com Content-Type: application/octet-stream; name="tmem-race.patch" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="tmem-race.patch" ZGlmZiAtciBhY2NkZWQyZjE4NWYgeGVuL2NvbW1vbi90bWVtLmMKLS0tIGEveGVuL2NvbW1vbi90 bWVtLmMJVGh1IE5vdiAxMiAxMzoxNTo0MCAyMDA5ICswMDAwCisrKyBiL3hlbi9jb21tb24vdG1l bS5jCUZyaSBOb3YgMTMgMTc6NDY6MjQgMjAwOSAtMDcwMApAQCAtMjIyOSw2ICsyMjI5LDEyIEBA IEVYUE9SVCBsb25nIGRvX3RtZW1fb3AodG1lbV9jbGlfb3BfdCB1b3AKICAgICBEVVBfU1RBUlRf Q1lDX0NPVU5URVIoZmx1c2gsc3VjY19nZXQpOwogICAgIERVUF9TVEFSVF9DWUNfQ09VTlRFUihm bHVzaF9vYmosc3VjY19nZXQpOwogCisgICAgaWYgKCBjbGllbnQgIT0gTlVMTCAmJiB0bWhfY2xp ZW50X2lzX2R5aW5nKGNsaWVudCkgKQorICAgIHsKKyAgICAgICAgcmMgPSAtRU5PREVWOworICAg ICAgICBnb3RvIG91dDsKKyAgICB9CisKICAgICBpZiAoIHVubGlrZWx5KHRtaF9nZXRfdG1lbW9w X2Zyb21fY2xpZW50KCZvcCwgdW9wcykgIT0gMCkgKQogICAgIHsKICAgICAgICAgcHJpbnRrKCJ0 bWVtOiBjYW4ndCBnZXQgdG1lbSBzdHJ1Y3QgZnJvbSAlc1xuIixjbGllbnRfc3RyKTsKQEAgLTIz OTIsNiArMjM5OCwxMiBAQCBFWFBPUlQgdm9pZCB0bWVtX2Rlc3Ryb3kodm9pZCAqdikKICAgICBp ZiAoIGNsaWVudCA9PSBOVUxMICkKICAgICAgICAgcmV0dXJuOwogCisgICAgaWYgKCAhdG1oX2Ns aWVudF9pc19keWluZyhjbGllbnQpICkKKyAgICB7CisgICAgICAgIHByaW50aygidG1lbTogdG1l bV9kZXN0cm95IGNhbiBvbmx5IGRlc3Ryb3kgZHlpbmcgY2xpZW50XG4iKTsKKyAgICAgICAgcmV0 dXJuOworICAgIH0KKwogICAgIGlmICggdG1oX2xvY2tfYWxsICkKICAgICAgICAgc3Bpbl9sb2Nr KCZ0bWVtX3NwaW5sb2NrKTsKICAgICBlbHNlCmRpZmYgLXIgYWNjZGVkMmYxODVmIHhlbi9jb21t b24vdG1lbV94ZW4uYwotLS0gYS94ZW4vY29tbW9uL3RtZW1feGVuLmMJVGh1IE5vdiAxMiAxMzox NTo0MCAyMDA5ICswMDAwCisrKyBiL3hlbi9jb21tb24vdG1lbV94ZW4uYwlGcmkgTm92IDEzIDE3 OjQ2OjI0IDIwMDkgLTA3MDAKQEAgLTMxNCw2ICszMTQsNyBAQCBFWFBPUlQgdm9pZCB0bWhfY2xp ZW50X2Rlc3Ryb3kodG1oX2NsaWVuCiAjaWZuZGVmIF9faTM4Nl9fCiAgICAgeG1lbV9wb29sX2Rl c3Ryb3kodG1oLT5wZXJzaXN0ZW50X3Bvb2wpOwogI2VuZGlmCisgICAgcHV0X2RvbWFpbih0bWgt PmRvbWFpbik7CiAgICAgeGZyZWUodG1oKTsKIH0KIApkaWZmIC1yIGFjY2RlZDJmMTg1ZiB4ZW4v aW5jbHVkZS94ZW4vdG1lbV94ZW4uaAotLS0gYS94ZW4vaW5jbHVkZS94ZW4vdG1lbV94ZW4uaAlU aHUgTm92IDEyIDEzOjE1OjQwIDIwMDkgKzAwMDAKKysrIGIveGVuL2luY2x1ZGUveGVuL3RtZW1f eGVuLmgJRnJpIE5vdiAxMyAxNzo0NjoyNCAyMDA5IC0wNzAwCkBAIC0yODAsNyArMjgwLDcgQEAg dHlwZWRlZiBzdHJ1Y3QgcGFnZV9pbmZvIHBmcF90OwogLyogdGhpcyBhcHBlYXJzIHRvIGJlIHVu cmVsaWFibGUgd2hlbiBhIGRvbWFpbiBpcyBiZWluZyBzaHV0IGRvd24gKi8KIHN0YXRpYyBpbmxp bmUgc3RydWN0IGNsaWVudCAqdG1oX2NsaWVudF9mcm9tX2NsaV9pZChjbGlfaWRfdCBjbGlfaWQp CiB7Ci0gICAgc3RydWN0IGRvbWFpbiAqZCA9IGdldF9kb21haW5fYnlfaWQoY2xpX2lkKTsKKyAg ICBzdHJ1Y3QgZG9tYWluICpkID0gZ2V0X2RvbWFpbl9ieV9pZChjbGlfaWQpOyAvKiBpbmNzIGQt PnJlZmNudCEgKi8KICAgICBpZiAoZCA9PSBOVUxMKQogICAgICAgICByZXR1cm4gTlVMTDsKICAg ICByZXR1cm4gKHN0cnVjdCBjbGllbnQgKikoZC0+dG1lbSk7CkBAIC0yOTAsNiArMjkwLDggQEAg c3RhdGljIGlubGluZSBzdHJ1Y3QgY2xpZW50ICp0bWhfY2xpZW50XwogewogICAgIHJldHVybiAo c3RydWN0IGNsaWVudCAqKShjdXJyZW50LT5kb21haW4tPnRtZW0pOwogfQorCisjZGVmaW5lIHRt aF9jbGllbnRfaXNfZHlpbmcoX2NsaWVudCkgKCEhX2NsaWVudC0+dG1oLT5kb21haW4tPmlzX2R5 aW5nKQogCiBzdGF0aWMgaW5saW5lIGNsaV9pZF90IHRtaF9nZXRfY2xpX2lkX2Zyb21fY3VycmVu dCh2b2lkKQogewo= --__125816010086522207abhmt015.oracle.com Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel --__125816010086522207abhmt015.oracle.com--