Merge be42a09fe8 ("bpf: Send signals asynchronously if !preemptible") into android14-6.1-lts

Steps on the way to 6.1.129

Change-Id: Ibd1adb3cc93660336fe0bd65b91d65f4ca1e0fcb
Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
This commit is contained in:
Greg Kroah-Hartman
2025-03-07 08:04:25 +00:00
2 changed files with 75 additions and 30 deletions

View File

@@ -85,7 +85,6 @@ struct stm32_pinctrl_group {
struct stm32_gpio_bank { struct stm32_gpio_bank {
void __iomem *base; void __iomem *base;
struct clk *clk;
struct reset_control *rstc; struct reset_control *rstc;
spinlock_t lock; spinlock_t lock;
struct gpio_chip gpio_chip; struct gpio_chip gpio_chip;
@@ -107,6 +106,7 @@ struct stm32_pinctrl {
unsigned ngroups; unsigned ngroups;
const char **grp_names; const char **grp_names;
struct stm32_gpio_bank *banks; struct stm32_gpio_bank *banks;
struct clk_bulk_data *clks;
unsigned nbanks; unsigned nbanks;
const struct stm32_pinctrl_match_data *match_data; const struct stm32_pinctrl_match_data *match_data;
struct irq_domain *domain; struct irq_domain *domain;
@@ -1273,6 +1273,28 @@ static const struct pinconf_ops stm32_pconf_ops = {
.pin_config_dbg_show = stm32_pconf_dbg_show, .pin_config_dbg_show = stm32_pconf_dbg_show,
}; };
static struct stm32_desc_pin *stm32_pctrl_get_desc_pin_from_gpio(struct stm32_pinctrl *pctl,
struct stm32_gpio_bank *bank,
unsigned int offset)
{
unsigned int stm32_pin_nb = bank->bank_nr * STM32_GPIO_PINS_PER_BANK + offset;
struct stm32_desc_pin *pin_desc;
int i;
/* With few exceptions (e.g. bank 'Z'), pin number matches with pin index in array */
pin_desc = pctl->pins + stm32_pin_nb;
if (pin_desc->pin.number == stm32_pin_nb)
return pin_desc;
/* Otherwise, loop all array to find the pin with the right number */
for (i = 0; i < pctl->npins; i++) {
pin_desc = pctl->pins + i;
if (pin_desc->pin.number == stm32_pin_nb)
return pin_desc;
}
return NULL;
}
static int stm32_gpiolib_register_bank(struct stm32_pinctrl *pctl, struct fwnode_handle *fwnode) static int stm32_gpiolib_register_bank(struct stm32_pinctrl *pctl, struct fwnode_handle *fwnode)
{ {
struct stm32_gpio_bank *bank = &pctl->banks[pctl->nbanks]; struct stm32_gpio_bank *bank = &pctl->banks[pctl->nbanks];
@@ -1283,6 +1305,8 @@ static int stm32_gpiolib_register_bank(struct stm32_pinctrl *pctl, struct fwnode
struct resource res; struct resource res;
int npins = STM32_GPIO_PINS_PER_BANK; int npins = STM32_GPIO_PINS_PER_BANK;
int bank_nr, err, i = 0; int bank_nr, err, i = 0;
struct stm32_desc_pin *stm32_pin;
char **names;
if (!IS_ERR(bank->rstc)) if (!IS_ERR(bank->rstc))
reset_control_deassert(bank->rstc); reset_control_deassert(bank->rstc);
@@ -1294,12 +1318,6 @@ static int stm32_gpiolib_register_bank(struct stm32_pinctrl *pctl, struct fwnode
if (IS_ERR(bank->base)) if (IS_ERR(bank->base))
return PTR_ERR(bank->base); return PTR_ERR(bank->base);
err = clk_prepare_enable(bank->clk);
if (err) {
dev_err(dev, "failed to prepare_enable clk (%d)\n", err);
return err;
}
bank->gpio_chip = stm32_gpio_template; bank->gpio_chip = stm32_gpio_template;
fwnode_property_read_string(fwnode, "st,bank-name", &bank->gpio_chip.label); fwnode_property_read_string(fwnode, "st,bank-name", &bank->gpio_chip.label);
@@ -1346,24 +1364,35 @@ static int stm32_gpiolib_register_bank(struct stm32_pinctrl *pctl, struct fwnode
bank->fwnode, &stm32_gpio_domain_ops, bank->fwnode, &stm32_gpio_domain_ops,
bank); bank);
if (!bank->domain) { if (!bank->domain)
err = -ENODEV; return -ENODEV;
goto err_clk; }
names = devm_kcalloc(dev, npins, sizeof(char *), GFP_KERNEL);
if (!names)
return -ENOMEM;
for (i = 0; i < npins; i++) {
stm32_pin = stm32_pctrl_get_desc_pin_from_gpio(pctl, bank, i);
if (stm32_pin && stm32_pin->pin.name) {
names[i] = devm_kasprintf(dev, GFP_KERNEL, "%s", stm32_pin->pin.name);
if (!names[i])
return -ENOMEM;
} else {
names[i] = NULL;
} }
} }
bank->gpio_chip.names = (const char * const *)names;
err = gpiochip_add_data(&bank->gpio_chip, bank); err = gpiochip_add_data(&bank->gpio_chip, bank);
if (err) { if (err) {
dev_err(dev, "Failed to add gpiochip(%d)!\n", bank_nr); dev_err(dev, "Failed to add gpiochip(%d)!\n", bank_nr);
goto err_clk; return err;
} }
dev_info(dev, "%s bank added\n", bank->gpio_chip.label); dev_info(dev, "%s bank added\n", bank->gpio_chip.label);
return 0; return 0;
err_clk:
clk_disable_unprepare(bank->clk);
return err;
} }
static struct irq_domain *stm32_pctrl_get_irq_domain(struct platform_device *pdev) static struct irq_domain *stm32_pctrl_get_irq_domain(struct platform_device *pdev)
@@ -1591,6 +1620,11 @@ int stm32_pctl_probe(struct platform_device *pdev)
if (!pctl->banks) if (!pctl->banks)
return -ENOMEM; return -ENOMEM;
pctl->clks = devm_kcalloc(dev, banks, sizeof(*pctl->clks),
GFP_KERNEL);
if (!pctl->clks)
return -ENOMEM;
i = 0; i = 0;
for_each_gpiochip_node(dev, child) { for_each_gpiochip_node(dev, child) {
struct stm32_gpio_bank *bank = &pctl->banks[i]; struct stm32_gpio_bank *bank = &pctl->banks[i];
@@ -1602,24 +1636,27 @@ int stm32_pctl_probe(struct platform_device *pdev)
return -EPROBE_DEFER; return -EPROBE_DEFER;
} }
bank->clk = of_clk_get_by_name(np, NULL); pctl->clks[i].clk = of_clk_get_by_name(np, NULL);
if (IS_ERR(bank->clk)) { if (IS_ERR(pctl->clks[i].clk)) {
fwnode_handle_put(child); fwnode_handle_put(child);
return dev_err_probe(dev, PTR_ERR(bank->clk), return dev_err_probe(dev, PTR_ERR(pctl->clks[i].clk),
"failed to get clk\n"); "failed to get clk\n");
} }
pctl->clks[i].id = "pctl";
i++; i++;
} }
ret = clk_bulk_prepare_enable(banks, pctl->clks);
if (ret) {
dev_err(dev, "failed to prepare_enable clk (%d)\n", ret);
return ret;
}
for_each_gpiochip_node(dev, child) { for_each_gpiochip_node(dev, child) {
ret = stm32_gpiolib_register_bank(pctl, child); ret = stm32_gpiolib_register_bank(pctl, child);
if (ret) { if (ret) {
fwnode_handle_put(child); fwnode_handle_put(child);
goto err_register;
for (i = 0; i < pctl->nbanks; i++)
clk_disable_unprepare(pctl->banks[i].clk);
return ret;
} }
pctl->nbanks++; pctl->nbanks++;
@@ -1628,6 +1665,15 @@ int stm32_pctl_probe(struct platform_device *pdev)
dev_info(dev, "Pinctrl STM32 initialized\n"); dev_info(dev, "Pinctrl STM32 initialized\n");
return 0; return 0;
err_register:
for (i = 0; i < pctl->nbanks; i++) {
struct stm32_gpio_bank *bank = &pctl->banks[i];
gpiochip_remove(&bank->gpio_chip);
}
clk_bulk_disable_unprepare(banks, pctl->clks);
return ret;
} }
static int __maybe_unused stm32_pinctrl_restore_gpio_regs( static int __maybe_unused stm32_pinctrl_restore_gpio_regs(
@@ -1696,10 +1742,8 @@ static int __maybe_unused stm32_pinctrl_restore_gpio_regs(
int __maybe_unused stm32_pinctrl_suspend(struct device *dev) int __maybe_unused stm32_pinctrl_suspend(struct device *dev)
{ {
struct stm32_pinctrl *pctl = dev_get_drvdata(dev); struct stm32_pinctrl *pctl = dev_get_drvdata(dev);
int i;
for (i = 0; i < pctl->nbanks; i++) clk_bulk_disable(pctl->nbanks, pctl->clks);
clk_disable(pctl->banks[i].clk);
return 0; return 0;
} }
@@ -1708,10 +1752,11 @@ int __maybe_unused stm32_pinctrl_resume(struct device *dev)
{ {
struct stm32_pinctrl *pctl = dev_get_drvdata(dev); struct stm32_pinctrl *pctl = dev_get_drvdata(dev);
struct stm32_pinctrl_group *g = pctl->groups; struct stm32_pinctrl_group *g = pctl->groups;
int i; int i, ret;
for (i = 0; i < pctl->nbanks; i++) ret = clk_bulk_enable(pctl->nbanks, pctl->clks);
clk_enable(pctl->banks[i].clk); if (ret)
return ret;
for (i = 0; i < pctl->ngroups; i++, g++) for (i = 0; i < pctl->ngroups; i++, g++)
stm32_pinctrl_restore_gpio_regs(pctl, g->pin); stm32_pinctrl_restore_gpio_regs(pctl, g->pin);

View File

@@ -857,7 +857,7 @@ static int bpf_send_signal_common(u32 sig, enum pid_type type)
if (unlikely(is_global_init(current))) if (unlikely(is_global_init(current)))
return -EPERM; return -EPERM;
if (irqs_disabled()) { if (!preemptible()) {
/* Do an early check on signal validity. Otherwise, /* Do an early check on signal validity. Otherwise,
* the error is lost in deferred irq_work. * the error is lost in deferred irq_work.
*/ */