Import of kernel-4.18.0-553.70.1.el8_10

This commit is contained in:
eabdullin 2025-09-05 13:23:44 +00:00
parent 249be1f988
commit eabbd11c5f
7 changed files with 68 additions and 18 deletions

View File

@ -12,7 +12,7 @@ RHEL_MINOR = 10
# #
# Use this spot to avoid future merge conflicts. # Use this spot to avoid future merge conflicts.
# Do not trim this comment. # Do not trim this comment.
RHEL_RELEASE = 553.69.1 RHEL_RELEASE = 553.70.1
# #
# ZSTREAM # ZSTREAM

View File

@ -98,6 +98,10 @@ static pci_ers_result_t zpci_event_do_error_state_clear(struct pci_dev *pdev,
struct zpci_dev *zdev = to_zpci(pdev); struct zpci_dev *zdev = to_zpci(pdev);
int rc; int rc;
/* The underlying device may have been disabled by the event */
if (!zdev_enabled(zdev))
return PCI_ERS_RESULT_NEED_RESET;
pr_info("%s: Unblocking device access for examination\n", pci_name(pdev)); pr_info("%s: Unblocking device access for examination\n", pci_name(pdev));
rc = zpci_reset_load_store_blocked(zdev); rc = zpci_reset_load_store_blocked(zdev);
if (rc) { if (rc) {
@ -253,6 +257,8 @@ static void __zpci_event_error(struct zpci_ccdf_err *ccdf)
struct zpci_dev *zdev = get_zdev_by_fid(ccdf->fid); struct zpci_dev *zdev = get_zdev_by_fid(ccdf->fid);
struct pci_dev *pdev = NULL; struct pci_dev *pdev = NULL;
pci_ers_result_t ers_res; pci_ers_result_t ers_res;
u32 fh = 0;
int rc;
zpci_dbg(3, "err fid:%x, fh:%x, pec:%x\n", zpci_dbg(3, "err fid:%x, fh:%x, pec:%x\n",
ccdf->fid, ccdf->fh, ccdf->pec); ccdf->fid, ccdf->fh, ccdf->pec);
@ -261,6 +267,15 @@ static void __zpci_event_error(struct zpci_ccdf_err *ccdf)
if (zdev) { if (zdev) {
mutex_lock(&zdev->state_lock); mutex_lock(&zdev->state_lock);
rc = clp_refresh_fh(zdev->fid, &fh);
if (rc)
goto no_pdev;
if (!fh || ccdf->fh != fh) {
/* Ignore events with stale handles */
zpci_dbg(3, "err fid:%x, fh:%x (stale %x)\n",
ccdf->fid, fh, ccdf->fh);
goto no_pdev;
}
zpci_update_fh(zdev, ccdf->fh); zpci_update_fh(zdev, ccdf->fh);
if (zdev->zbus->bus) if (zdev->zbus->bus)
pdev = pci_get_slot(zdev->zbus->bus, zdev->devfn); pdev = pci_get_slot(zdev->zbus->bus, zdev->devfn);

View File

@ -221,17 +221,19 @@ static int __init vkms_init(void)
if (!config) if (!config)
return -ENOMEM; return -ENOMEM;
default_config = config;
config->cursor = enable_cursor; config->cursor = enable_cursor;
config->writeback = enable_writeback; config->writeback = enable_writeback;
config->overlay = enable_overlay; config->overlay = enable_overlay;
ret = vkms_create(config); ret = vkms_create(config);
if (ret) if (ret) {
kfree(config); kfree(config);
return ret; return ret;
}
default_config = config;
return 0;
} }
static void vkms_destroy(struct vkms_config *config) static void vkms_destroy(struct vkms_config *config)
@ -255,9 +257,10 @@ static void vkms_destroy(struct vkms_config *config)
static void __exit vkms_exit(void) static void __exit vkms_exit(void)
{ {
if (default_config->dev) if (!default_config)
vkms_destroy(default_config); return;
vkms_destroy(default_config);
kfree(default_config); kfree(default_config);
} }

View File

@ -298,6 +298,7 @@ static int amd_i2c_dw_xfer_quirk(struct i2c_adapter *adap, struct i2c_msg *msgs,
dev->msgs = msgs; dev->msgs = msgs;
dev->msgs_num = num_msgs; dev->msgs_num = num_msgs;
dev->msg_write_idx = 0;
i2c_dw_xfer_init(dev); i2c_dw_xfer_init(dev);
i2c_dw_disable_int(dev); i2c_dw_disable_int(dev);

View File

@ -28,6 +28,7 @@
#include <linux/idr.h> #include <linux/idr.h>
#include <linux/leds.h> #include <linux/leds.h>
#include <linux/rculist.h> #include <linux/rculist.h>
#include <linux/srcu.h>
#include <net/bluetooth/hci.h> #include <net/bluetooth/hci.h>
#include <net/bluetooth/hci_sync.h> #include <net/bluetooth/hci_sync.h>
@ -321,6 +322,7 @@ struct amp_assoc {
struct hci_dev { struct hci_dev {
struct list_head list; struct list_head list;
struct srcu_struct srcu;
struct mutex lock; struct mutex lock;
char name[8]; char name[8];

View File

@ -108,7 +108,7 @@ static int hci_linkpol_req(struct hci_request *req, unsigned long opt)
/* Get HCI device by index. /* Get HCI device by index.
* Device is held on return. */ * Device is held on return. */
struct hci_dev *hci_dev_get(int index) static struct hci_dev *__hci_dev_get(int index, int *srcu_index)
{ {
struct hci_dev *hdev = NULL, *d; struct hci_dev *hdev = NULL, *d;
@ -121,6 +121,8 @@ struct hci_dev *hci_dev_get(int index)
list_for_each_entry(d, &hci_dev_list, list) { list_for_each_entry(d, &hci_dev_list, list) {
if (d->id == index) { if (d->id == index) {
hdev = hci_dev_hold(d); hdev = hci_dev_hold(d);
if (srcu_index)
*srcu_index = srcu_read_lock(&d->srcu);
break; break;
} }
} }
@ -128,6 +130,22 @@ struct hci_dev *hci_dev_get(int index)
return hdev; return hdev;
} }
struct hci_dev *hci_dev_get(int index)
{
return __hci_dev_get(index, NULL);
}
static struct hci_dev *hci_dev_get_srcu(int index, int *srcu_index)
{
return __hci_dev_get(index, srcu_index);
}
static void hci_dev_put_srcu(struct hci_dev *hdev, int srcu_index)
{
srcu_read_unlock(&hdev->srcu, srcu_index);
hci_dev_put(hdev);
}
/* ---- Inquiry support ---- */ /* ---- Inquiry support ---- */
bool hci_discovery_active(struct hci_dev *hdev) bool hci_discovery_active(struct hci_dev *hdev)
@ -618,9 +636,9 @@ static int hci_dev_do_reset(struct hci_dev *hdev)
int hci_dev_reset(__u16 dev) int hci_dev_reset(__u16 dev)
{ {
struct hci_dev *hdev; struct hci_dev *hdev;
int err; int err, srcu_index;
hdev = hci_dev_get(dev); hdev = hci_dev_get_srcu(dev, &srcu_index);
if (!hdev) if (!hdev)
return -ENODEV; return -ENODEV;
@ -642,7 +660,7 @@ int hci_dev_reset(__u16 dev)
err = hci_dev_do_reset(hdev); err = hci_dev_do_reset(hdev);
done: done:
hci_dev_put(hdev); hci_dev_put_srcu(hdev, srcu_index);
return err; return err;
} }
@ -2421,6 +2439,11 @@ struct hci_dev *hci_alloc_dev_priv(int sizeof_priv)
if (!hdev) if (!hdev)
return NULL; return NULL;
if (init_srcu_struct(&hdev->srcu)) {
kfree(hdev);
return NULL;
}
hdev->pkt_type = (HCI_DM1 | HCI_DH1 | HCI_HV1); hdev->pkt_type = (HCI_DM1 | HCI_DH1 | HCI_HV1);
hdev->esco_type = (ESCO_HV1); hdev->esco_type = (ESCO_HV1);
hdev->link_mode = (HCI_LM_ACCEPT); hdev->link_mode = (HCI_LM_ACCEPT);
@ -2677,6 +2700,9 @@ void hci_unregister_dev(struct hci_dev *hdev)
list_del(&hdev->list); list_del(&hdev->list);
write_unlock(&hci_dev_list_lock); write_unlock(&hci_dev_list_lock);
synchronize_srcu(&hdev->srcu);
cleanup_srcu_struct(&hdev->srcu);
cancel_work_sync(&hdev->power_on); cancel_work_sync(&hdev->power_on);
hci_cmd_sync_clear(hdev); hci_cmd_sync_clear(hdev);

View File

@ -74,6 +74,11 @@ static const struct nla_policy ets_class_policy[TCA_ETS_MAX + 1] = {
[TCA_ETS_QUANTA_BAND] = { .type = NLA_U32 }, [TCA_ETS_QUANTA_BAND] = { .type = NLA_U32 },
}; };
static bool cl_is_active(struct ets_class *cl)
{
return !list_empty(&cl->alist);
}
static int ets_quantum_parse(struct Qdisc *sch, const struct nlattr *attr, static int ets_quantum_parse(struct Qdisc *sch, const struct nlattr *attr,
unsigned int *quantum, unsigned int *quantum,
struct netlink_ext_ack *extack) struct netlink_ext_ack *extack)
@ -291,7 +296,7 @@ static void ets_class_qlen_notify(struct Qdisc *sch, unsigned long arg)
* to remove them. * to remove them.
*/ */
if (!ets_class_is_strict(q, cl) && sch->q.qlen) if (!ets_class_is_strict(q, cl) && sch->q.qlen)
list_del(&cl->alist); list_del_init(&cl->alist);
} }
static int ets_class_dump(struct Qdisc *sch, unsigned long arg, static int ets_class_dump(struct Qdisc *sch, unsigned long arg,
@ -414,7 +419,6 @@ static int ets_qdisc_enqueue(struct sk_buff *skb, struct Qdisc *sch,
struct ets_sched *q = qdisc_priv(sch); struct ets_sched *q = qdisc_priv(sch);
struct ets_class *cl; struct ets_class *cl;
int err = 0; int err = 0;
bool first;
cl = ets_classify(skb, sch, &err); cl = ets_classify(skb, sch, &err);
if (!cl) { if (!cl) {
@ -424,7 +428,6 @@ static int ets_qdisc_enqueue(struct sk_buff *skb, struct Qdisc *sch,
return err; return err;
} }
first = !cl->qdisc->q.qlen;
err = qdisc_enqueue(skb, cl->qdisc, to_free); err = qdisc_enqueue(skb, cl->qdisc, to_free);
if (unlikely(err != NET_XMIT_SUCCESS)) { if (unlikely(err != NET_XMIT_SUCCESS)) {
if (net_xmit_drop_count(err)) { if (net_xmit_drop_count(err)) {
@ -434,7 +437,7 @@ static int ets_qdisc_enqueue(struct sk_buff *skb, struct Qdisc *sch,
return err; return err;
} }
if (first && !ets_class_is_strict(q, cl)) { if (!cl_is_active(cl) && !ets_class_is_strict(q, cl)) {
list_add_tail(&cl->alist, &q->active); list_add_tail(&cl->alist, &q->active);
cl->deficit = cl->quantum; cl->deficit = cl->quantum;
} }
@ -486,7 +489,7 @@ static struct sk_buff *ets_qdisc_dequeue(struct Qdisc *sch)
if (unlikely(!skb)) if (unlikely(!skb))
goto out; goto out;
if (cl->qdisc->q.qlen == 0) if (cl->qdisc->q.qlen == 0)
list_del(&cl->alist); list_del_init(&cl->alist);
return ets_qdisc_dequeue_skb(sch, skb); return ets_qdisc_dequeue_skb(sch, skb);
} }
@ -655,7 +658,7 @@ static int ets_qdisc_change(struct Qdisc *sch, struct nlattr *opt,
} }
for (i = q->nbands; i < oldbands; i++) { for (i = q->nbands; i < oldbands; i++) {
if (i >= q->nstrict && q->classes[i].qdisc->q.qlen) if (i >= q->nstrict && q->classes[i].qdisc->q.qlen)
list_del(&q->classes[i].alist); list_del_init(&q->classes[i].alist);
qdisc_tree_flush_backlog(q->classes[i].qdisc); qdisc_tree_flush_backlog(q->classes[i].qdisc);
} }
q->nstrict = nstrict; q->nstrict = nstrict;
@ -711,7 +714,7 @@ static void ets_qdisc_reset(struct Qdisc *sch)
for (band = q->nstrict; band < q->nbands; band++) { for (band = q->nstrict; band < q->nbands; band++) {
if (q->classes[band].qdisc->q.qlen) if (q->classes[band].qdisc->q.qlen)
list_del(&q->classes[band].alist); list_del_init(&q->classes[band].alist);
} }
for (band = 0; band < q->nbands; band++) for (band = 0; band < q->nbands; band++)
qdisc_reset(q->classes[band].qdisc); qdisc_reset(q->classes[band].qdisc);