From mboxrd@z Thu Jan 1 00:00:00 1970 From: Alexey Brodkin Subject: Re: arc_usr_cmpxchg and preemption Date: Thu, 15 Mar 2018 09:12:09 +0000 Message-ID: <1521105128.11552.64.camel@synopsys.com> References: <1521045375.11552.27.camel@synopsys.com> <20180314175352.GP4064@hirez.programming.kicks-ass.net> <1521059931.11552.51.camel@synopsys.com> <20180315081845.GS4064@hirez.programming.kicks-ass.net> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <20180315081845.GS4064@hirez.programming.kicks-ass.net> Content-Language: en-US Content-ID: <5373E3962868F54486F8E6ED3D0ADF5F@internal.synopsys.com> Sender: linux-kernel-owner@vger.kernel.org To: "peterz@infradead.org" Cc: "Vineet.Gupta1@synopsys.com" , "linux-kernel@vger.kernel.org" , "linux-arch@vger.kernel.org" , "linux-snps-arc@lists.infradead.org" List-Id: linux-arch.vger.kernel.org SGkgUGV0ZXIsDQoNCk9uIFRodSwgMjAxOC0wMy0xNSBhdCAwOToxOCArMDEwMCwgUGV0ZXIgWmlq bHN0cmEgd3JvdGU6DQo+IE9uIFdlZCwgTWFyIDE0LCAyMDE4IGF0IDA4OjM4OjUzUE0gKzAwMDAs IEFsZXhleSBCcm9ka2luIHdyb3RlOg0KPiA+ID4gaW50IHN5c19jbXB4Y2hnKHUzMiBfX3VzZXIg KnVzZXJfcHRyLCB1MzIgb2xkLCB1MzIgbmV3KQ0KPiA+ID4gew0KPiA+ID4gCXUzMiB2YWw7DQo+ ID4gPiAJaW50IHJldDsNCj4gPiA+IA0KPiA+ID4gYWdhaW46DQo+ID4gPiAJcmV0ID0gMDsNCj4g PiA+IA0KPiA+ID4gCXByZWVtcHRfZGlzYWJsZSgpOw0KPiA+ID4gCXZhbCA9IGdldF91c2VyKHVz ZXJfcHRyKTsNCj4gPiA+IAlpZiAodmFsID09IG9sZCkNCj4gPiA+IAkJcmV0ID0gcHV0X3VzZXIo bmV3LCB1c2VyX3B0cik7DQo+ID4gPiAJcHJlZW1wdF9lbmFibGUoKTsNCj4gPiA+IA0KPiA+ID4g CWlmIChyZXQgPT0gLUVGQVVMVCkgew0KPiA+ID4gCQlzdHJ1Y3QgcGFnZSAqcGFnZTsNCj4gPiA+ IAkJcmV0ID0gZ2V0X3VzZXJfcGFnZXNfZmFzdCgodW5zaWduZWQgbG9uZyl1c2VyX3B0ciwgMSwg MSwgJnBhZ2UpOw0KPiA+ID4gCQlpZiAocmV0IDwgMCkNCj4gPiA+IAkJCXJldHVybiByZXQ7DQo+ ID4gPiAJCXB1dF9wYWdlKHBhZ2UpOw0KPiA+ID4gCQlnb3RvIGFnYWluOw0KPiA+IA0KPiA+IEkg Z3Vlc3MgdGhpcyBqdW1wIHdlIG5lZWQgdG8gZG8gb25seSBvbmNlLCByaWdodD8NCj4gDQo+IFR5 cGljYWxseSwgeWVzLiBJdCBpcyB0aGVvcmV0aWNhbGx5IHBvc3NpYmxlIGZvciB0aGUgcGFnZSB0 byBnZXQNCj4gcGFnZWQtb3V0IHJpZ2h0IGFmdGVyIHdlIGRvIHB1dF9wYWdlKCkgYW5kIGJlZm9y ZSB3ZSBkbyBnZXQvcHV0X3VzZXIoKSwNCj4gQnV0IGlmIHRoYXQgaGFwcGVucyB0aGUgbWFjaGlu ZSBsaWtlbHkgaGFzIGJpZ2dlciBwcm9ibGVtcyB0aGFuIGhhdmluZw0KPiB0byBkbyB0aGlzIGxv b3AgYWdhaW4uDQo+IA0KPiBGV0lXLCBsb29rIGF0IGtlcm5lbC9mdXRleC5jIGZvciB3b3JraW5n IGV4YW1wbGVzIG9mIHRoaXMgcGF0dGVybiwgdGhlDQo+IGFib3ZlIHdhcyB3cml0dGVuIHB1cmVs eSBmcm9tIG1lbW9yeSBhbmQgY291bGQgY29udGFpbiBhIGZhaWwgb3IgdHdvIDstKQ0KDQpUaGFu a3MgZm9yIHRoZSBwb2ludGVyIQ0KDQo+IEFsc28sIGl0IG1pZ2h0IG1ha2Ugc2Vuc2UgdG8gc3R1 ZmYgdGhpcyBpbXBsZW1lbnRhdGlvbiBpbiBzb21lIGxpYi8gZmlsZQ0KPiBzb21ld2hlcmUgYW5k IG1ha2UgYWxsIHBsYXRmb3JtcyB0aGF0IG5lZWQgaXQgdXNlIHRoZSBzYW1lIGNvZGUsIGFmYWlj dA0KPiB0aGVyZSByZWFsbHkgaXNuJ3QgYW55dGhpbmcgcGxhdGZvcm0gc3BlY2lmaWMgdG8gaXQu DQoNCk5vdCBjbGVhciB3aGljaCBwYXJ0IGRvIHlvdSBtZWFuIGhlcmUuDQpBcmUgeW91IHRhbGtp bmcgYWJvdXQgZW50aXJlIGNtcHhjaGcgc3lzY2FsbCBpbXBsZW1lbnRhdGlvbj8NCg0KRG8geW91 IHRoaW5rIHRoZXJlJ3JlIG1hbnkgdXNlcnMgb2YgdGhhdCBxdWl0ZSBhbiBpbmVmZmljaWVudA0K W2NvbXBhcmVkIHRvIHByb3BlciBIVyB2ZXJzaW9uXSBhdG9taWMgZXhjaGFuZ2U/DQoNCi1BbGV4 ZXk= From mboxrd@z Thu Jan 1 00:00:00 1970 From: Alexey.Brodkin@synopsys.com (Alexey Brodkin) Date: Thu, 15 Mar 2018 09:12:09 +0000 Subject: arc_usr_cmpxchg and preemption In-Reply-To: <20180315081845.GS4064@hirez.programming.kicks-ass.net> References: <1521045375.11552.27.camel@synopsys.com> <20180314175352.GP4064@hirez.programming.kicks-ass.net> <1521059931.11552.51.camel@synopsys.com> <20180315081845.GS4064@hirez.programming.kicks-ass.net> List-ID: Message-ID: <1521105128.11552.64.camel@synopsys.com> To: linux-snps-arc@lists.infradead.org Hi Peter, On Thu, 2018-03-15@09:18 +0100, Peter Zijlstra wrote: > On Wed, Mar 14, 2018@08:38:53PM +0000, Alexey Brodkin wrote: > > > int sys_cmpxchg(u32 __user *user_ptr, u32 old, u32 new) > > > { > > > u32 val; > > > int ret; > > > > > > again: > > > ret = 0; > > > > > > preempt_disable(); > > > val = get_user(user_ptr); > > > if (val == old) > > > ret = put_user(new, user_ptr); > > > preempt_enable(); > > > > > > if (ret == -EFAULT) { > > > struct page *page; > > > ret = get_user_pages_fast((unsigned long)user_ptr, 1, 1, &page); > > > if (ret < 0) > > > return ret; > > > put_page(page); > > > goto again; > > > > I guess this jump we need to do only once, right? > > Typically, yes. It is theoretically possible for the page to get > paged-out right after we do put_page() and before we do get/put_user(), > But if that happens the machine likely has bigger problems than having > to do this loop again. > > FWIW, look at kernel/futex.c for working examples of this pattern, the > above was written purely from memory and could contain a fail or two ;-) Thanks for the pointer! > Also, it might make sense to stuff this implementation in some lib/ file > somewhere and make all platforms that need it use the same code, afaict > there really isn't anything platform specific to it. Not clear which part do you mean here. Are you talking about entire cmpxchg syscall implementation? Do you think there're many users of that quite an inefficient [compared to proper HW version] atomic exchange? -Alexey