Import of kernel-4.18.0-553.70.1.el8_10
This commit is contained in:
parent
249be1f988
commit
eabbd11c5f
@ -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
|
||||||
|
@ -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);
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
@ -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];
|
||||||
|
@ -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);
|
||||||
|
@ -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);
|
||||||
|
Loading…
Reference in New Issue
Block a user