From: Masahiro Yamada <masahiroy@kernel.org>
To: linux-kbuild@vger.kernel.org
Cc: Masahiro Yamada <masahiroy@kernel.org>, linux-kernel@vger.kernel.org
Subject: [PATCH 47/66] kconfig: gconf: inline fill_row() into set_node()
Date: Wed, 25 Jun 2025 00:05:35 +0900 [thread overview]
Message-ID: <20250624150645.1107002-48-masahiroy@kernel.org> (raw)
In-Reply-To: <20250624150645.1107002-1-masahiroy@kernel.org>
The row[] array is used to prepare data passed to set_node(), but this
indirection is unnecessary. Squash fill_row() into set_node() and call
gtk_tree_store_set() directly.
Also, calling gdk_pixbuf_new_from_xpm_data() for every row is
inefficient. Call it once and store the resulting pixbuf in a global
variable.
Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
---
scripts/kconfig/gconf.c | 272 ++++++++++++++++------------------------
1 file changed, 106 insertions(+), 166 deletions(-)
diff --git a/scripts/kconfig/gconf.c b/scripts/kconfig/gconf.c
index 0977d906bea6..0b73ba9eca14 100644
--- a/scripts/kconfig/gconf.c
+++ b/scripts/kconfig/gconf.c
@@ -44,6 +44,7 @@ static GtkWidget *save_menu_item;
static GtkTextTag *tag1, *tag2;
static GtkTreeStore *tree1, *tree2;
+static GdkPixbuf *pix_menu;
static struct menu *browsed; // browsed menu for SINGLE/SPLIT view
static struct menu *selected; // selected entry
@@ -58,9 +59,6 @@ enum {
static void display_list(void);
static void display_tree(GtkTreeStore *store, struct menu *menu);
static void display_tree_part(void);
-static gchar **fill_row(struct menu *menu);
-static void set_node(GtkTreeStore *tree, GtkTreeIter *node,
- struct menu *menu, gchar **row);
static void conf_changed(bool dirty)
{
@@ -125,6 +123,104 @@ static void update_row_visibility(void)
_update_row_visibility(GTK_TREE_VIEW(tree2_w));
}
+static void set_node(GtkTreeStore *tree, GtkTreeIter *node, struct menu *menu)
+{
+ struct symbol *sym = menu->sym;
+ tristate val;
+ gchar *option;
+ const gchar *_no = "";
+ const gchar *_mod = "";
+ const gchar *_yes = "";
+ const gchar *value = "";
+ GdkColor color;
+ gboolean editable = FALSE;
+ gboolean btnvis = FALSE;
+
+ option = g_strdup_printf("%s %s %s %s",
+ menu->type == M_COMMENT ? "***" : "",
+ menu_get_prompt(menu),
+ menu->type == M_COMMENT ? "***" : "",
+ sym && !sym_has_value(sym) ? "(NEW)" : "");
+
+ gdk_color_parse(menu_is_visible(menu) ? "Black" : "DarkGray", &color);
+
+ if (!sym)
+ goto set;
+
+ sym_calc_value(sym);
+
+ if (menu->type == M_CHOICE) { // parse children to get a final value
+ struct symbol *def_sym = sym_calc_choice(menu);
+ struct menu *def_menu = NULL;
+
+ for (struct menu *child = menu->list; child; child = child->next) {
+ if (menu_is_visible(child) && child->sym == def_sym)
+ def_menu = child;
+ }
+
+ if (def_menu)
+ value = menu_get_prompt(def_menu);
+
+ goto set;
+ }
+
+ switch (sym_get_type(sym)) {
+ case S_BOOLEAN:
+ case S_TRISTATE:
+
+ btnvis = TRUE;
+
+ val = sym_get_tristate_value(sym);
+ switch (val) {
+ case no:
+ _no = "N";
+ value = "N";
+ break;
+ case mod:
+ _mod = "M";
+ value = "M";
+ break;
+ case yes:
+ _yes = "Y";
+ value = "Y";
+ break;
+ }
+
+ if (val != no && sym_tristate_within_range(sym, no))
+ _no = "_";
+ if (val != mod && sym_tristate_within_range(sym, mod))
+ _mod = "_";
+ if (val != yes && sym_tristate_within_range(sym, yes))
+ _yes = "_";
+ break;
+ default:
+ value = sym_get_string_value(sym);
+ editable = TRUE;
+ break;
+ }
+
+set:
+ gtk_tree_store_set(tree, node,
+ COL_OPTION, option,
+ COL_NAME, sym ? sym->name : "",
+ COL_NO, _no,
+ COL_MOD, _mod,
+ COL_YES, _yes,
+ COL_VALUE, value,
+ COL_MENU, (gpointer) menu,
+ COL_COLOR, &color,
+ COL_EDIT, editable,
+ COL_PIXBUF, pix_menu,
+ COL_PIXVIS, view_mode == SINGLE_VIEW && menu->type == M_MENU,
+ COL_BTNVIS, btnvis,
+ COL_BTNACT, _yes[0] == 'Y',
+ COL_BTNINC, _mod[0] == 'M',
+ COL_BTNRAD, sym && sym_is_choice_value(sym),
+ -1);
+
+ g_free(option);
+}
+
static void _update_tree(GtkTreeStore *store, GtkTreeIter *parent)
{
GtkTreeModel *model = GTK_TREE_MODEL(store);
@@ -138,7 +234,7 @@ static void _update_tree(GtkTreeStore *store, GtkTreeIter *parent)
gtk_tree_model_get(model, &iter, COL_MENU, &menu, -1);
if (menu)
- set_node(store, &iter, menu, fill_row(menu));
+ set_node(store, &iter, menu);
_update_tree(store, &iter);
@@ -563,6 +659,9 @@ static gboolean on_window1_delete_event(GtkWidget *widget, GdkEvent *event,
gtk_widget_destroy(dialog);
+ if (!ret)
+ g_object_unref(pix_menu);
+
return ret;
}
@@ -824,167 +923,6 @@ static gboolean on_treeview1_button_press_event(GtkWidget *widget,
return FALSE;
}
-
-/* Fill a row of strings */
-static gchar **fill_row(struct menu *menu)
-{
- static gchar *row[COL_NUMBER];
- struct symbol *sym = menu->sym;
- const char *def;
- int stype;
- tristate val;
- enum prop_type ptype;
- int i;
-
- for (i = COL_OPTION; i <= COL_COLOR; i++)
- g_free(row[i]);
- bzero(row, sizeof(row));
-
- ptype = menu->prompt ? menu->prompt->type : P_UNKNOWN;
-
- row[COL_OPTION] =
- g_strdup_printf("%s %s %s %s",
- ptype == P_COMMENT ? "***" : "",
- menu_get_prompt(menu),
- ptype == P_COMMENT ? "***" : "",
- sym && !sym_has_value(sym) ? "(NEW)" : "");
-
- if (opt_mode == OPT_ALL && !menu_is_visible(menu))
- row[COL_COLOR] = g_strdup("DarkGray");
- else if (opt_mode == OPT_PROMPT &&
- menu_has_prompt(menu) && !menu_is_visible(menu))
- row[COL_COLOR] = g_strdup("DarkGray");
- else
- row[COL_COLOR] = g_strdup("Black");
-
- switch (ptype) {
- case P_MENU:
- row[COL_PIXBUF] = (gchar *) xpm_menu;
- if (view_mode == SINGLE_VIEW)
- row[COL_PIXVIS] = GINT_TO_POINTER(TRUE);
- row[COL_BTNVIS] = GINT_TO_POINTER(FALSE);
- break;
- case P_COMMENT:
- row[COL_PIXBUF] = (gchar *) xpm_void;
- row[COL_PIXVIS] = GINT_TO_POINTER(FALSE);
- row[COL_BTNVIS] = GINT_TO_POINTER(FALSE);
- break;
- default:
- row[COL_PIXBUF] = (gchar *) xpm_void;
- row[COL_PIXVIS] = GINT_TO_POINTER(FALSE);
- row[COL_BTNVIS] = GINT_TO_POINTER(TRUE);
- break;
- }
-
- if (!sym)
- return row;
- row[COL_NAME] = g_strdup(sym->name);
-
- sym_calc_value(sym);
-
- if (sym_is_choice(sym)) { // parse childs for getting final value
- struct menu *child;
- struct symbol *def_sym = sym_calc_choice(menu);
- struct menu *def_menu = NULL;
-
- for (child = menu->list; child; child = child->next) {
- if (menu_is_visible(child)
- && child->sym == def_sym)
- def_menu = child;
- }
-
- if (def_menu)
- row[COL_VALUE] =
- g_strdup(menu_get_prompt(def_menu));
-
- row[COL_BTNVIS] = GINT_TO_POINTER(FALSE);
- return row;
- }
- if (sym_is_choice_value(sym))
- row[COL_BTNRAD] = GINT_TO_POINTER(TRUE);
-
- stype = sym_get_type(sym);
- switch (stype) {
- case S_BOOLEAN:
- case S_TRISTATE:
- val = sym_get_tristate_value(sym);
- switch (val) {
- case no:
- row[COL_NO] = g_strdup("N");
- row[COL_VALUE] = g_strdup("N");
- row[COL_BTNACT] = GINT_TO_POINTER(FALSE);
- row[COL_BTNINC] = GINT_TO_POINTER(FALSE);
- break;
- case mod:
- row[COL_MOD] = g_strdup("M");
- row[COL_VALUE] = g_strdup("M");
- row[COL_BTNINC] = GINT_TO_POINTER(TRUE);
- break;
- case yes:
- row[COL_YES] = g_strdup("Y");
- row[COL_VALUE] = g_strdup("Y");
- row[COL_BTNACT] = GINT_TO_POINTER(TRUE);
- row[COL_BTNINC] = GINT_TO_POINTER(FALSE);
- break;
- }
-
- if (val != no && sym_tristate_within_range(sym, no))
- row[COL_NO] = g_strdup("_");
- if (val != mod && sym_tristate_within_range(sym, mod))
- row[COL_MOD] = g_strdup("_");
- if (val != yes && sym_tristate_within_range(sym, yes))
- row[COL_YES] = g_strdup("_");
- break;
- case S_INT:
- case S_HEX:
- case S_STRING:
- def = sym_get_string_value(sym);
- row[COL_VALUE] = g_strdup(def);
- row[COL_EDIT] = GINT_TO_POINTER(TRUE);
- row[COL_BTNVIS] = GINT_TO_POINTER(FALSE);
- break;
- }
-
- return row;
-}
-
-
-/* Set the node content with a row of strings */
-static void set_node(GtkTreeStore *tree, GtkTreeIter *node,
- struct menu *menu, gchar **row)
-{
- GdkColor color;
- gboolean success;
- GdkPixbuf *pix;
-
- pix = gdk_pixbuf_new_from_xpm_data((const char **)
- row[COL_PIXBUF]);
-
- gdk_color_parse(row[COL_COLOR], &color);
- gdk_colormap_alloc_colors(gdk_colormap_get_system(), &color, 1,
- FALSE, FALSE, &success);
-
- gtk_tree_store_set(tree, node,
- COL_OPTION, row[COL_OPTION],
- COL_NAME, row[COL_NAME],
- COL_NO, row[COL_NO],
- COL_MOD, row[COL_MOD],
- COL_YES, row[COL_YES],
- COL_VALUE, row[COL_VALUE],
- COL_MENU, (gpointer) menu,
- COL_COLOR, &color,
- COL_EDIT, GPOINTER_TO_INT(row[COL_EDIT]),
- COL_PIXBUF, pix,
- COL_PIXVIS, GPOINTER_TO_INT(row[COL_PIXVIS]),
- COL_BTNVIS, GPOINTER_TO_INT(row[COL_BTNVIS]),
- COL_BTNACT, GPOINTER_TO_INT(row[COL_BTNACT]),
- COL_BTNINC, GPOINTER_TO_INT(row[COL_BTNINC]),
- COL_BTNRAD, GPOINTER_TO_INT(row[COL_BTNRAD]),
- -1);
-
- g_object_unref(pix);
-}
-
/* Display the whole tree (single/split/full view) */
static void _display_tree(GtkTreeStore *tree, struct menu *menu,
GtkTreeIter *parent)
@@ -1016,7 +954,7 @@ static void _display_tree(GtkTreeStore *tree, struct menu *menu,
continue;
gtk_tree_store_append(tree, &iter, parent);
- set_node(tree, &iter, child, fill_row(child));
+ set_node(tree, &iter, child);
if ((view_mode != FULL_VIEW) && (ptype == P_MENU)
&& (tree == tree2))
@@ -1384,6 +1322,8 @@ static void init_right_tree(void)
g_signal_connect(G_OBJECT(renderer), "edited",
G_CALLBACK(renderer_edited), tree2_w);
+ pix_menu = gdk_pixbuf_new_from_xpm_data((const char **)xpm_menu);
+
for (i = 0; i < COL_VALUE; i++) {
column = gtk_tree_view_get_column(view, i);
gtk_tree_view_column_set_resizable(column, TRUE);
--
2.43.0
next prev parent reply other threads:[~2025-06-24 15:08 UTC|newest]
Thread overview: 104+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-06-24 15:04 [PATCH 00/66] kconfig: improve xconfig and gconfig Masahiro Yamada
2025-06-24 15:04 ` [PATCH 01/66] kconfig: set MENU_CHANGED to choice when the selected member is changed Masahiro Yamada
2025-06-30 6:34 ` Randy Dunlap
2025-07-02 13:23 ` Masahiro Yamada
2025-07-02 22:02 ` Randy Dunlap
2025-06-24 15:04 ` [PATCH 02/66] kconfig: qconf: do not show checkbox icon for choice Masahiro Yamada
2025-06-29 20:15 ` Randy Dunlap
2025-06-30 3:36 ` Masahiro Yamada
2025-06-30 0:51 ` Randy Dunlap
2025-06-30 0:54 ` Randy Dunlap
2025-06-24 15:04 ` [PATCH 03/66] kconfig: qconf: show selected choice in the Value column Masahiro Yamada
2025-06-30 0:56 ` Randy Dunlap
2025-06-24 15:04 ` [PATCH 04/66] kconfig: rename menu_get_parent_menu() to menu_get_menu_or_parent_menu() Masahiro Yamada
2025-06-30 0:58 ` Randy Dunlap
2025-06-24 15:04 ` [PATCH 05/66] kconfig: re-add menu_get_parent_menu() that returns parent menu Masahiro Yamada
2025-06-30 0:59 ` Randy Dunlap
2025-06-24 15:04 ` [PATCH 06/66] kconfig: gconf: make columns resizable Masahiro Yamada
2025-06-30 2:18 ` Randy Dunlap
2025-06-24 15:04 ` [PATCH 07/66] kconfig: gconf: fix potential memory leak in renderer_edited() Masahiro Yamada
2025-06-30 2:21 ` Randy Dunlap
2025-06-24 15:04 ` [PATCH 08/66] kconfig: gconf: always destroy dialog in on_window1_delete_event() Masahiro Yamada
2025-06-30 2:23 ` Randy Dunlap
2025-06-24 15:04 ` [PATCH 09/66] kconfig: gconf: remove old #ifdef GTK_CHECK_VERSION Masahiro Yamada
2025-06-24 15:04 ` [PATCH 10/66] kconfig: gconf: remove empty if-block Masahiro Yamada
2025-06-30 2:25 ` Randy Dunlap
2025-06-24 15:04 ` [PATCH 11/66] kconfig: gconf: remove meaningless code in init_main_window() Masahiro Yamada
2025-06-30 2:25 ` Randy Dunlap
2025-06-24 15:05 ` [PATCH 12/66] kconfig: gconf: remove unneeded gtk_tree_view_set_headers_visible() calls Masahiro Yamada
2025-06-24 15:05 ` [PATCH 13/66] kconfig: gconf: remove gtk_tree_view_column_set_visible() calls Masahiro Yamada
2025-06-24 15:05 ` [PATCH 14/66] kconfig: gconf: remove gtk_widget_realize() calls Masahiro Yamada
2025-06-24 15:05 ` [PATCH 15/66] kconfig: gconf: remove gtk_tree_view_set_rules_hint() calls Masahiro Yamada
2025-06-24 15:05 ` [PATCH 16/66] kconfig: gconf: remove unnecessary gtk_set_locale() call Masahiro Yamada
2025-06-24 15:05 ` [PATCH 17/66] kconfig: gconf: remove internal-child="image" nodes from glade Masahiro Yamada
2025-06-24 15:05 ` [PATCH 18/66] kconfig: gconf: remove parents[] array and indent variable Masahiro Yamada
2025-06-24 15:05 ` [PATCH 19/66] kconfig: gconf: remove unnecessary NULL checks for tree1 and tree2 Masahiro Yamada
2025-06-24 15:05 ` [PATCH 20/66] kconfig: gconf: remove unneeded variable in on_split_clicked() Masahiro Yamada
2025-06-24 15:05 ` [PATCH 21/66] kconfig: gconf: remove unneeded variables in on_treeview*_button_press_event() Masahiro Yamada
2025-06-30 2:40 ` Randy Dunlap
2025-06-30 4:22 ` Masahiro Yamada
2025-06-24 15:05 ` [PATCH 22/66] kconfig: gconf: remove unused 'color' variable Masahiro Yamada
2025-06-24 15:05 ` [PATCH 23/66] kconfig: gconf: add static qualifiers to variables Masahiro Yamada
2025-06-24 15:05 ` [PATCH 24/66] kconfig: gconf: move init_*() functions below Masahiro Yamada
2025-06-24 15:05 ` [PATCH 25/66] kconfig: gconf: refactor view setting code Masahiro Yamada
2025-06-30 2:51 ` Randy Dunlap
2025-06-24 15:05 ` [PATCH 26/66] kconfig: gconf: grey out button for current view Masahiro Yamada
2025-06-30 2:53 ` Randy Dunlap
2025-06-24 15:05 ` [PATCH 27/66] kconfig: gconf: move the main window event handlers below Masahiro Yamada
2025-06-24 15:05 ` [PATCH 28/66] kconfig: gconf: move button1 initialization below Masahiro Yamada
2025-06-24 15:05 ` [PATCH 29/66] kconfig: gconf: add static qualifiers to event handlers Masahiro Yamada
2025-06-30 2:55 ` Randy Dunlap
2025-06-24 15:05 ` [PATCH 30/66] kconfig: gconf: remove glade_xml_signal_autoconnect() call Masahiro Yamada
2025-06-30 2:58 ` Randy Dunlap
2025-06-30 4:14 ` Masahiro Yamada
2025-06-24 15:05 ` [PATCH 31/66] kconfig: gconf: make key_press_event work in left pane too Masahiro Yamada
2025-06-24 15:05 ` [PATCH 32/66] kconfig: gconf: avoid hardcoding model2 in on_treeview2_cursor_changed() Masahiro Yamada
2025-06-24 15:05 ` [PATCH 33/66] kconfig: gconf: avoid hardcoding model2 in renderer_edited() Masahiro Yamada
2025-06-24 15:05 ` [PATCH 34/66] kconfig: gconf: avoid hardcoding model* in on_treeview*_button_press_event() Masahiro Yamada
2025-06-24 15:05 ` [PATCH 35/66] kconfig: gconf: add on_save_clicked() event handler Masahiro Yamada
2025-06-24 15:05 ` [PATCH 36/66] kconfig: gconf: use GtkFileChooser in on_load1_activate() Masahiro Yamada
2025-06-30 3:14 ` Randy Dunlap
2025-06-24 15:05 ` [PATCH 37/66] kconfig: gconf: use GtkFileChooser in on_save_as1_activate() Masahiro Yamada
2025-06-30 3:20 ` Randy Dunlap
2025-06-24 15:05 ` [PATCH 38/66] kconfig: gconf: use GdkPixbuf in replace_button_icon() Masahiro Yamada
2025-06-24 15:05 ` [PATCH 39/66] kconfig: gconf: refactor replace_button_icon() Masahiro Yamada
2025-06-24 15:05 ` [PATCH 40/66] kconfig: gconf: make introduction, about, license dialogs modal Masahiro Yamada
2025-06-30 4:09 ` Randy Dunlap
2025-06-24 15:05 ` [PATCH 41/66] kconfig: gconf: remove global 'tree' variable Masahiro Yamada
2025-06-24 15:05 ` [PATCH 42/66] kconfig: gconf: merge 'current' and 'browsed' global variables Masahiro Yamada
2025-06-24 15:05 ` [PATCH 43/66] kconfig: gconf: preserve menu selection when switching view mode Masahiro Yamada
2025-06-30 5:42 ` Masahiro Yamada
2025-06-24 15:05 ` [PATCH 44/66] kconfig: gconf: use GtkTreeModelFilter to control row visibility Masahiro Yamada
2025-06-24 15:05 ` [PATCH 45/66] kconfig: gconf: remove global 'model1' and 'model2' variables Masahiro Yamada
2025-06-30 4:10 ` Randy Dunlap
2025-06-24 15:05 ` [PATCH 46/66] kconfig: gconf: remove init_tree_model() Masahiro Yamada
2025-06-24 15:05 ` Masahiro Yamada [this message]
2025-06-24 15:05 ` [PATCH 48/66] kconfig: gconf: do not reconstruct tree store when a symbol is changed Masahiro Yamada
2025-06-24 15:05 ` [PATCH 49/66] kconfig: gconf: inline display_list() into set_view_mode() Masahiro Yamada
2025-06-24 15:05 ` [PATCH 50/66] kconfig: gconf: remove dead code in display_tree_part() Masahiro Yamada
2025-06-24 15:05 ` [PATCH 51/66] kconfig: gconf: rename display_tree_part() Masahiro Yamada
2025-06-24 15:05 ` [PATCH 52/66] kconfig: gconf: remove fixup_rootmenu() Masahiro Yamada
2025-06-27 12:46 ` Masahiro Yamada
2025-06-24 15:05 ` [PATCH 53/66] kconfig: gconf: use size_allocate event handler Masahiro Yamada
2025-06-29 17:56 ` Masahiro Yamada
2025-06-30 5:23 ` Randy Dunlap
2025-06-30 5:30 ` Masahiro Yamada
2025-06-24 15:05 ` [PATCH 54/66] kconfig: gconf: replace GDK_space with GDK_KEY_space Masahiro Yamada
2025-06-24 15:05 ` [PATCH 55/66] kconfig: gconf: replace GTK_STOCK_{OK,NO,CANCEL} Masahiro Yamada
2025-06-30 5:26 ` Randy Dunlap
2025-06-24 15:05 ` [PATCH 56/66] kconfig: gconf: remove "tooltips" property from glade Masahiro Yamada
2025-06-24 15:05 ` [PATCH 57/66] kconfig: gconf: replace "tooltip" property with "tooltip-text" Masahiro Yamada
2025-06-30 5:36 ` Randy Dunlap
2025-06-24 15:05 ` [PATCH 58/66] kconfig: gconf: remove unnecessary default message in text view Masahiro Yamada
2025-06-24 15:05 ` [PATCH 59/66] kconfig: gconf: use gtk_check_menu_item_get_active() accessor Masahiro Yamada
2025-06-24 15:05 ` [PATCH 60/66] kconfig: gconf: use gtk_dialog_get_content_area() accessor Masahiro Yamada
2025-06-24 15:05 ` [PATCH 61/66] kconfig: gconf: remove GtkHandleBox from glade Masahiro Yamada
2025-06-24 15:05 ` [PATCH 62/66] kconfig: gconf: rename gconf.glade to gconf.ui Masahiro Yamada
2025-06-24 15:05 ` [PATCH 63/66] kconfig: gconf: migrate to GTK 3 Masahiro Yamada
2025-06-24 15:05 ` [PATCH 64/66] kconfig: gconf: replace GtkVbox with GtkBox Masahiro Yamada
2025-06-24 15:05 ` [PATCH 65/66] kconfig: gconf: replace GdkColor with GdkRGBA Masahiro Yamada
2025-06-24 15:05 ` [PATCH 66/66] kconfig: gconf: show GTK version in About dialog Masahiro Yamada
2025-06-30 6:06 ` Randy Dunlap
2025-06-30 6:55 ` [PATCH 00/66] kconfig: improve xconfig and gconfig Randy Dunlap
2025-06-30 15:48 ` Masahiro Yamada
2025-06-30 23:43 ` Randy Dunlap
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20250624150645.1107002-48-masahiroy@kernel.org \
--to=masahiroy@kernel.org \
--cc=linux-kbuild@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®