Return-path: Received: from emh04.mail.saunalahti.fi ([62.142.5.110]:32912 "EHLO emh04.mail.saunalahti.fi" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753824AbaCCKhw (ORCPT ); Mon, 3 Mar 2014 05:37:52 -0500 Message-ID: <1393843069.13669.86.camel@dubbel> (sfid-20140303_113756_270712_4502268C) Subject: Re: [RFC v2 3/4] mac80211: allow reservation of a running chanctx From: Luca Coelho To: Michal Kazior Cc: linux-wireless , Johannes Berg , sw@simonwunderlich.de, "Otcheretianski, Andrei" Date: Mon, 03 Mar 2014 12:37:49 +0200 In-Reply-To: <1393840630.13669.82.camel@dubbel> References: <1393512081-31453-1-git-send-email-luca@coelho.fi> <1393512081-31453-4-git-send-email-luca@coelho.fi> <1393589841.13669.32.camel@dubbel> <1393594886.13669.47.camel@dubbel> <1393597923.13669.65.camel@dubbel> <5cdea7fa-8919-48b0-898a-a03cbd26123d@email.android.com> <1393840630.13669.82.camel@dubbel> Content-Type: text/plain; charset="UTF-8" Mime-Version: 1.0 Sender: linux-wireless-owner@vger.kernel.org List-ID: On Mon, 2014-03-03 at 11:57 +0200, Luca Coelho wrote: > Hi MichaƂ, > > I had a new idea. > > > On Fri, 2014-02-28 at 17:31 +0200, Luca Coelho wrote: > > But seriously, I'm almost fully convinced your approach is better. I'll try to spin without the RESERVED mode. > > > > But that probably will only happened Monday, because I'm already spinning down for the weekend. > > What about this: when we are reserving the chanctx, even if we're the > only ones in it (and thus will change it on-the-fly), we increase the > refcount. This means that we would have refcount == 2, even though > we're the only users, but that's aligned with what happens when we > reserve a different chanctx. > > When we use the reservation, we do exactly the same thing as if we were > moving to a new chanctx, but add a intermediate step where we check if > the old ctx has refcount 0, in which case we change its channel: > > Reserving our own chanctx for future change: > > 1. new_ctx = old_ctx; > 2. increase new_ctx.refcount (new.refcount == 2, old.refcount == 2); > > > Using the reservation: > > 1. unassign the vif from the old chanctx (old.refcount == 1, > new.refcount == 1); > 2. we decrease the refcount of the new chanctx (new.refcount == 0, > old.refcount == 0); > 3. if (old.refcount == 0) means we were the only user, change channel; > 4. we assign ourselves to the new chanctx (new.refcount == 1 again); > > > This would make this whole thing pretty generic with only one extra if > for the on-the-fly chanctx change case. > > If more vifs came and are changing the chanctx at the same time, it will > be fine too because the channel will only change when the last reserver > uses the reservation. > > Does this make sense? Oh wait, this last part won't work with multiple vifs changing at the same time, because in that case the refcount will never be 0. I guess instead of checking if old.refcount == 0, we should check if the old_ctx and new_ctx are identical. The first vif to get here will change the channel and the other ones will NOP because the channel they want is already the current channel of the chanctx. Let me try to do this. -- Luca.