The "driver" struct for a gadget driver is named *_driver. On module
load, the gadget expects a UDC driver to be loaded and avaiable. If this
is not the case => -ENODEV and bye bye. That means that the gadget
driver is initialized immediately. The initialization process includes
calling ->bind() for the gadget driver. Therefore it is okay to put this
in __init. It will never be called again, we don't (yet) allow two
gadgets of the same kind to be ->bind() again.

Commit 07a18bd716 ("usb gadget: don't save bind callback in struct
usb_composite_driver") move the ->bind() member from the struct to an
argument.
I'm reverting this and adding this exception. For g_zero we save around
400bytes. I'm not having the conversion about how important it is to
save 400 bytes. I wait for configfs interface for the gadget subsystem.
This will remove the __init from the ->bind() because we will be able to
call ->bind() more than once and _after_ the init has been dropped.

Cc: linux-kernel@vger.kernel.org
Signed-off-by: Sebastian Andrzej Siewior <bige...@linutronix.de>
---
 scripts/mod/modpost.c |   10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git a/scripts/mod/modpost.c b/scripts/mod/modpost.c
index 68e9f5e..5e30776 100644
--- a/scripts/mod/modpost.c
+++ b/scripts/mod/modpost.c
@@ -920,6 +920,9 @@ static const char *head_sections[] = { ".head.text*", NULL 
};
 static const char *linker_symbols[] =
        { "__init_begin", "_sinittext", "_einittext", NULL };
 
+static const char *const driver_sym[] = { "*_driver", NULL };
+static const char *const gadget_bind[] = { "*_bind", NULL };
+
 enum mismatch {
        TEXT_TO_ANY_INIT,
        DATA_TO_ANY_INIT,
@@ -1129,6 +1132,13 @@ static int secref_whitelist(const struct sectioncheck 
*mismatch,
            match(fromsym, mismatch->symbol_white_list))
                return 0;
 
+       /* Check for pattern 2a */
+       if (match(tosec, init_exit_sections) &&
+           match(fromsec, data_sections) &&
+           match(fromsym, driver_sym) &&
+           match(tosym, gadget_bind))
+               return 0;
+
        /* Check for pattern 3 */
        if (match(fromsec, head_sections) &&
            match(tosec, init_sections))
-- 
1.7.10.4

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to