[PATCH] broadband-modem: don't create sim hot swap ports context multiple times
Carlo Lobrano
c.lobrano at gmail.com
Tue May 23 15:58:44 UTC 2017
Ciao Aleksander,
On 22 May 2017 at 13:18, Aleksander Morgado <aleksander at aleksander.es>
wrote:
> ---
>
> Hey Carlo,
>
> It's never too late :)
>
> I couldn't reproduce the issue with the SIM hot swap changes you were
> trying, because none of my Telit modems here were able to support it
> properly, so I ended up re-reviewing the logs you sent and I believe I
> found the issue.
>
> When the SIM is already unlocked, the "initialization" sequence is run
> only once. When the SIM is locked, though, the "initialization" sequence is
> run twice: one until it detects that the SIM is locked, and the second one
> after the SIM is unlocked. The INITIALIZE_STEP_SIM_HOT_SWAP step was
> therefore running twice and unconditionally creating a new PortsContext
> each time, and that would have a nice side-effect apart from the memleak:
> the "port open count" was incorrectly increased by one for the TTYs...
>
> When SIM was removed ModemManager would close and remove all ports. These
> are the logs when we have run the initialization sequence only once, you
> can see that the open count goes to 0 for both ttyACM0 and ttyACM3:
> <debug> (ttyACM3) device open count is 1 (close)
> <debug> (ttyACM0) device open count is 0 (close)
> <debug> (ttyACM0) closing serial port...
> <debug> (ttyACM0) serial port closed
> <debug> (ttyACM3) device open count is 0 (close)
> <debug> (ttyACM3) closing serial port...
> <debug> (ttyACM3) serial port closed
> <info> Modem /org/freedesktop/ModemManager1/Modem/0: state changed
> (disabling -> disabled)
> <debug> [device /sys/devices/pci0000:00/0000:00:1a.7/usb1/1-3]
> unexported modem from path '/org/freedesktop/ModemManager1/Modem/0'
> <debug> (ttyACM3) forced to close port
> <debug> (ttyACM0) forced to close port
>
> These are the logs when we have run the initialization sequence twice and
> the PortsContext was created twice, you can see how the open count didn't
> go to 0:
> <info> Modem /org/freedesktop/ModemManager1/Modem/0: 3GPP
> Registration state changed (home -> unknown)
> <debug> (ttyACM3) device open count is 2 (close)
> <debug> (ttyACM0) device open count is 1 (close)
> <debug> (ttyACM3) device open count is 1 (close)
> <info> Modem /org/freedesktop/ModemManager1/Modem/0: state changed
> (disabling -> disabled)
> <debug> [device /sys/devices/pci0000:00/0000:00:1a.7/usb1/1-3]
> unexported modem from path '/org/freedesktop/ModemManager1/Modem/0'
>
> When the modem was re-created you said you would get NULL strings as
> response in the AT commands sent, even if you saw the responses in the
> logs.. well, it was the port objects from the previous modem run, which
> were not fully closed, the ones receiving the responses :) Your new serial
> port objects in the new modem run would fail and get NULL strings as
> response as you said.
>
> Could you take a look at the patch, which just avoids to re-create the
> ports context, and see if it really fixes the issue you were seeing in your
> tests?
>
> Cheers!
>
This is weird, but I couldn't reproduce the "modem not recognized" part
myself.
What I can reproduce is the crash, and I can also confirm that this patch
fix it very well. Thank you!
>
> ---
> src/mm-broadband-modem.c | 10 +++++++---
> 1 file changed, 7 insertions(+), 3 deletions(-)
>
> diff --git a/src/mm-broadband-modem.c b/src/mm-broadband-modem.c
> index 4a14d33d..68242e5c 100644
> --- a/src/mm-broadband-modem.c
> +++ b/src/mm-broadband-modem.c
> @@ -10154,7 +10154,9 @@ initialize_step (InitializeContext *ctx)
> return;
>
> case INITIALIZE_STEP_SIM_HOT_SWAP:
> - {
> + /* Create the SIM hot swap ports context only if not already done
> before
> + * (we may be re-running the initialization step after SIM-PIN
> unlock) */
> + if (!ctx->self->priv->sim_hot_swap_ports_ctx) {
> gboolean is_sim_hot_swap_supported = FALSE;
>
> g_object_get (ctx->self,
> @@ -10165,7 +10167,7 @@ initialize_step (InitializeContext *ctx)
> PortsContext *ports;
> GError *error = NULL;
>
> - mm_dbg ("Creating PortsContext for SIM hot swap.");
> + mm_dbg ("Creating ports context for SIM hot swap");
>
> ports = g_new0 (PortsContext, 1);
> ports->ref_count = 1;
> @@ -10178,7 +10180,9 @@ initialize_step (InitializeContext *ctx)
>
> ports_context_unref (ports);
> }
> - }
> + } else
> + mm_dbg ("Ports context for SIM hot swap already available");
> +
> /* Fall down to next step */
> ctx->step++;
>
> --
> 2.12.2
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/modemmanager-devel/attachments/20170523/94c7708e/attachment.html>
More information about the ModemManager-devel
mailing list