> On Sep 13, 2018, at 6:52 AM, Jason A. Donenfeld <Jason@xxxxxxxxx> wrote: > >> On Thu, Sep 13, 2018 at 7:03 AM Kevin Easton <kevin@xxxxxxxxxxx> wrote: >> Yes. It's also how most get/put APIs already work in the kernel, eg >> kref_get/put (mostly because they tend to be 'getting/putting' an >> already-initialized object, though). > > Right; in this case the object wouldn't be initialized yet, which > might defeat the purpose, since one advantage of the & way you > mentioned is _put modifies the context. > > Andy - any opinions on this? The tl;dr is: > > 1) what we have now: > > simd_context_t simd_context = simd_get(); > for (item in items) { > do_something(item); > simd_context = simd_relax(simd_context); > } > simd_put(); > > 2) what kevin is proposing: > > simd_context_t simd_context; > > simd_get(&simd_context); > for (item in items) { > do_something(item); > simd_relax(&simd_context); > } > simd_put(&simd_context); > > I can see pros and cons of each approach. I have no strong opinion, except that, if you paint the bikeshed “pass by value”, then simd_get and simd_relax should probably have warn_unused_result set.