|
|
|
/*
|
|
|
|
* Copyright (c) 2015, Sony Mobile Communications Inc.
|
|
|
|
* Copyright (c) 2013, 2018-2019 The Linux Foundation. All rights reserved.
|
|
|
|
*
|
|
|
|
* This program is free software; you can redistribute it and/or modify
|
|
|
|
* it under the terms of the GNU General Public License version 2 and
|
|
|
|
* only version 2 as published by the Free Software Foundation.
|
|
|
|
*
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
*/
|
|
|
|
#include <linux/kthread.h>
|
|
|
|
#include <linux/module.h>
|
|
|
|
#include <linux/netlink.h>
|
|
|
|
#include <linux/qrtr.h>
|
|
|
|
#include <linux/termios.h> /* For TIOCINQ/OUTQ */
|
|
|
|
#include <linux/wait.h>
|
|
|
|
#include <linux/rwsem.h>
|
|
|
|
#include <linux/ipc_logging.h>
|
|
|
|
#include <linux/uidgid.h>
|
|
|
|
#include <linux/pm_wakeup.h>
|
|
|
|
|
|
|
|
#include <net/sock.h>
|
|
|
|
#include <uapi/linux/sched/types.h>
|
|
|
|
|
|
|
|
#include <soc/qcom/subsystem_restart.h>
|
|
|
|
|
|
|
|
#include "qrtr.h"
|
|
|
|
|
|
|
|
#define QRTR_LOG_PAGE_CNT 4
|
|
|
|
#define QRTR_INFO(ctx, x, ...) \
|
|
|
|
ipc_log_string(ctx, x, ##__VA_ARGS__)
|
|
|
|
|
|
|
|
#define QRTR_PROTO_VER_1 1
|
|
|
|
#define QRTR_PROTO_VER_2 3
|
|
|
|
|
|
|
|
/* auto-bind range */
|
|
|
|
#define QRTR_MIN_EPH_SOCKET 0x4000
|
|
|
|
#define QRTR_MAX_EPH_SOCKET 0x7fff
|
|
|
|
|
|
|
|
#define QRTR_PORT_CTRL_LEGACY 0xffff
|
|
|
|
|
|
|
|
/* qrtr socket states */
|
|
|
|
#define QRTR_STATE_MULTI -2
|
|
|
|
#define QRTR_STATE_INIT -1
|
|
|
|
|
|
|
|
#define AID_VENDOR_QRTR KGIDT_INIT(2906)
|
|
|
|
|
|
|
|
/**
|
|
|
|
* struct qrtr_hdr_v1 - (I|R)PCrouter packet header version 1
|
|
|
|
* @version: protocol version
|
|
|
|
* @type: packet type; one of QRTR_TYPE_*
|
|
|
|
* @src_node_id: source node
|
|
|
|
* @src_port_id: source port
|
|
|
|
* @confirm_rx: boolean; whether a resume-tx packet should be send in reply
|
|
|
|
* @size: length of packet, excluding this header
|
|
|
|
* @dst_node_id: destination node
|
|
|
|
* @dst_port_id: destination port
|
|
|
|
*/
|
|
|
|
struct qrtr_hdr_v1 {
|
|
|
|
__le32 version;
|
|
|
|
__le32 type;
|
|
|
|
__le32 src_node_id;
|
|
|
|
__le32 src_port_id;
|
|
|
|
__le32 confirm_rx;
|
|
|
|
__le32 size;
|
|
|
|
__le32 dst_node_id;
|
|
|
|
__le32 dst_port_id;
|
|
|
|
} __packed;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* struct qrtr_hdr_v2 - (I|R)PCrouter packet header later versions
|
|
|
|
* @version: protocol version
|
|
|
|
* @type: packet type; one of QRTR_TYPE_*
|
|
|
|
* @flags: bitmask of QRTR_FLAGS_*
|
|
|
|
* @optlen: length of optional header data
|
|
|
|
* @size: length of packet, excluding this header and optlen
|
|
|
|
* @src_node_id: source node
|
|
|
|
* @src_port_id: source port
|
|
|
|
* @dst_node_id: destination node
|
|
|
|
* @dst_port_id: destination port
|
|
|
|
*/
|
|
|
|
struct qrtr_hdr_v2 {
|
|
|
|
u8 version;
|
|
|
|
u8 type;
|
|
|
|
u8 flags;
|
|
|
|
u8 optlen;
|
|
|
|
__le32 size;
|
|
|
|
__le16 src_node_id;
|
|
|
|
__le16 src_port_id;
|
|
|
|
__le16 dst_node_id;
|
|
|
|
__le16 dst_port_id;
|
|
|
|
} __packed;
|
|
|
|
|
|
|
|
#define QRTR_FLAGS_CONFIRM_RX BIT(0)
|
|
|
|
|
|
|
|
struct qrtr_cb {
|
|
|
|
u32 src_node;
|
|
|
|
u32 src_port;
|
|
|
|
u32 dst_node;
|
|
|
|
u32 dst_port;
|
|
|
|
|
|
|
|
u8 type;
|
|
|
|
u8 confirm_rx;
|
|
|
|
};
|
|
|
|
|
|
|
|
#define QRTR_HDR_MAX_SIZE max_t(size_t, sizeof(struct qrtr_hdr_v1), \
|
|
|
|
sizeof(struct qrtr_hdr_v2))
|
|
|
|
|
|
|
|
struct qrtr_sock {
|
|
|
|
/* WARNING: sk must be the first member */
|
|
|
|
struct sock sk;
|
|
|
|
struct sockaddr_qrtr us;
|
|
|
|
struct sockaddr_qrtr peer;
|
|
|
|
|
|
|
|
int state;
|
|
|
|
};
|
|
|
|
|
|
|
|
static inline struct qrtr_sock *qrtr_sk(struct sock *sk)
|
|
|
|
{
|
|
|
|
BUILD_BUG_ON(offsetof(struct qrtr_sock, sk) != 0);
|
|
|
|
return container_of(sk, struct qrtr_sock, sk);
|
|
|
|
}
|
|
|
|
|
|
|
|
static unsigned int qrtr_local_nid = CONFIG_QRTR_NODE_ID;
|
|
|
|
|
|
|
|
/* for node ids */
|
|
|
|
static RADIX_TREE(qrtr_nodes, GFP_KERNEL);
|
|
|
|
/* broadcast list */
|
|
|
|
static LIST_HEAD(qrtr_all_epts);
|
|
|
|
/* lock for qrtr_nodes, qrtr_all_epts and node reference */
|
|
|
|
static DECLARE_RWSEM(qrtr_node_lock);
|
|
|
|
|
|
|
|
/* local port allocation management */
|
|
|
|
static DEFINE_IDR(qrtr_ports);
|
|
|
|
static DEFINE_MUTEX(qrtr_port_lock);
|
|
|
|
|
|
|
|
/* backup buffers */
|
|
|
|
#define QRTR_BACKUP_HI_NUM 5
|
|
|
|
#define QRTR_BACKUP_HI_SIZE SZ_16K
|
|
|
|
#define QRTR_BACKUP_LO_NUM 20
|
|
|
|
#define QRTR_BACKUP_LO_SIZE SZ_1K
|
|
|
|
static struct sk_buff_head qrtr_backup_lo;
|
|
|
|
static struct sk_buff_head qrtr_backup_hi;
|
|
|
|
static struct work_struct qrtr_backup_work;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* struct qrtr_node - endpoint node
|
|
|
|
* @ep_lock: lock for endpoint management and callbacks
|
|
|
|
* @ep: endpoint
|
|
|
|
* @ref: reference count for node
|
|
|
|
* @nid: node id
|
|
|
|
* @net_id: network cluster identifer
|
|
|
|
* @hello_sent: hello packet sent to endpoint
|
|
|
|
* @qrtr_tx_flow: remote port tx flow control list
|
|
|
|
* @resume_tx: wait until remote port acks control flag
|
|
|
|
* @qrtr_tx_lock: lock for qrtr_tx_flow
|
|
|
|
* @rx_queue: receive queue
|
|
|
|
* @item: list item for broadcast list
|
|
|
|
* @kworker: worker thread for recv work
|
|
|
|
* @task: task to run the worker thread
|
|
|
|
* @read_data: scheduled work for recv work
|
|
|
|
* @say_hello: scheduled work for initiating hello
|
|
|
|
* @ws: wakeupsource avoid system suspend
|
|
|
|
* @ilc: ipc logging context reference
|
|
|
|
*/
|
|
|
|
struct qrtr_node {
|
|
|
|
struct mutex ep_lock;
|
|
|
|
struct qrtr_endpoint *ep;
|
|
|
|
struct kref ref;
|
|
|
|
unsigned int nid;
|
|
|
|
unsigned int net_id;
|
|
|
|
atomic_t hello_sent;
|
|
|
|
atomic_t hello_rcvd;
|
|
|
|
|
|
|
|
struct radix_tree_root qrtr_tx_flow;
|
|
|
|
struct wait_queue_head resume_tx;
|
|
|
|
struct mutex qrtr_tx_lock; /* for qrtr_tx_flow */
|
|
|
|
|
|
|
|
struct sk_buff_head rx_queue;
|
|
|
|
struct list_head item;
|
|
|
|
|
|
|
|
struct kthread_worker kworker;
|
|
|
|
struct task_struct *task;
|
|
|
|
struct kthread_work read_data;
|
|
|
|
struct kthread_work say_hello;
|
|
|
|
|
|
|
|
struct wakeup_source *ws;
|
|
|
|
|
|
|
|
void *ilc;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct qrtr_tx_flow_waiter {
|
|
|
|
struct list_head node;
|
|
|
|
struct sock *sk;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct qrtr_tx_flow {
|
|
|
|
atomic_t pending;
|
|
|
|
struct list_head waiters;
|
|
|
|
};
|
|
|
|
|
|
|
|
#define QRTR_TX_FLOW_HIGH 10
|
|
|
|
#define QRTR_TX_FLOW_LOW 5
|
|
|
|
|
|
|
|
static struct sk_buff *qrtr_alloc_ctrl_packet(struct qrtr_ctrl_pkt **pkt);
|
|
|
|
static int qrtr_local_enqueue(struct qrtr_node *node, struct sk_buff *skb,
|
|
|
|
int type, struct sockaddr_qrtr *from,
|
|
|
|
struct sockaddr_qrtr *to, unsigned int flags);
|
|
|
|
static int qrtr_bcast_enqueue(struct qrtr_node *node, struct sk_buff *skb,
|
|
|
|
int type, struct sockaddr_qrtr *from,
|
|
|
|
struct sockaddr_qrtr *to, unsigned int flags);
|
|
|
|
static void qrtr_handle_del_proc(struct sk_buff *skb);
|
|
|
|
|
|
|
|
static void qrtr_log_tx_msg(struct qrtr_node *node, struct qrtr_hdr_v1 *hdr,
|
|
|
|
struct sk_buff *skb)
|
|
|
|
{
|
|
|
|
struct qrtr_ctrl_pkt pkt = {0,};
|
|
|
|
u64 pl_buf = 0;
|
|
|
|
u32 type;
|
|
|
|
|
|
|
|
if (!hdr || !skb)
|
|
|
|
return;
|
|
|
|
|
|
|
|
type = le32_to_cpu(hdr->type);
|
|
|
|
|
|
|
|
if (type == QRTR_TYPE_DATA) {
|
|
|
|
skb_copy_bits(skb, QRTR_HDR_MAX_SIZE, &pl_buf, sizeof(pl_buf));
|
|
|
|
QRTR_INFO(node->ilc,
|
|
|
|
"TX DATA: Len:0x%x CF:0x%x src[0x%x:0x%x] dst[0x%x:0x%x] [%08x %08x] [%s]\n",
|
|
|
|
hdr->size, hdr->confirm_rx,
|
|
|
|
hdr->src_node_id, hdr->src_port_id,
|
|
|
|
hdr->dst_node_id, hdr->dst_port_id,
|
|
|
|
(unsigned int)pl_buf, (unsigned int)(pl_buf >> 32),
|
|
|
|
current->comm);
|
|
|
|
} else {
|
|
|
|
skb_copy_bits(skb, QRTR_HDR_MAX_SIZE, &pkt, sizeof(pkt));
|
|
|
|
if (type == QRTR_TYPE_NEW_SERVER ||
|
|
|
|
type == QRTR_TYPE_DEL_SERVER)
|
|
|
|
QRTR_INFO(node->ilc,
|
|
|
|
"TX CTRL: cmd:0x%x SVC[0x%x:0x%x] addr[0x%x:0x%x]\n",
|
|
|
|
type, le32_to_cpu(pkt.server.service),
|
|
|
|
le32_to_cpu(pkt.server.instance),
|
|
|
|
le32_to_cpu(pkt.server.node),
|
|
|
|
le32_to_cpu(pkt.server.port));
|
|
|
|
else if (type == QRTR_TYPE_DEL_CLIENT ||
|
|
|
|
type == QRTR_TYPE_RESUME_TX)
|
|
|
|
QRTR_INFO(node->ilc,
|
|
|
|
"TX CTRL: cmd:0x%x addr[0x%x:0x%x]\n",
|
|
|
|
type, le32_to_cpu(pkt.client.node),
|
|
|
|
le32_to_cpu(pkt.client.port));
|
|
|
|
else if (type == QRTR_TYPE_HELLO ||
|
|
|
|
type == QRTR_TYPE_BYE) {
|
|
|
|
QRTR_INFO(node->ilc,
|
|
|
|
"TX CTRL: cmd:0x%x node[0x%x]\n",
|
|
|
|
type, hdr->src_node_id);
|
|
|
|
if (le32_to_cpu(hdr->dst_node_id) == 0 ||
|
|
|
|
le32_to_cpu(hdr->dst_node_id) == 3)
|
|
|
|
pr_err("qrtr: Modem QMI Readiness TX cmd:0x%x node[0x%x]\n",
|
|
|
|
type, hdr->src_node_id);
|
|
|
|
}
|
|
|
|
else if (type == QRTR_TYPE_DEL_PROC)
|
|
|
|
QRTR_INFO(node->ilc,
|
|
|
|
"TX CTRL: cmd:0x%x node[0x%x]\n",
|
|
|
|
type, pkt.proc.node);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void qrtr_log_rx_msg(struct qrtr_node *node, struct sk_buff *skb)
|
|
|
|
{
|
|
|
|
struct qrtr_ctrl_pkt pkt = {0,};
|
|
|
|
struct qrtr_cb *cb;
|
|
|
|
u64 pl_buf = 0;
|
|
|
|
|
|
|
|
if (!skb || !skb->data)
|
|
|
|
return;
|
|
|
|
|
|
|
|
cb = (struct qrtr_cb *)skb->cb;
|
|
|
|
|
|
|
|
if (cb->type == QRTR_TYPE_DATA) {
|
|
|
|
skb_copy_bits(skb, 0, &pl_buf, sizeof(pl_buf));
|
|
|
|
QRTR_INFO(node->ilc,
|
|
|
|
"RX DATA: Len:0x%x CF:0x%x src[0x%x:0x%x] dst[0x%x:0x%x] [%08x %08x]\n",
|
|
|
|
skb->len, cb->confirm_rx, cb->src_node, cb->src_port,
|
|
|
|
cb->dst_node, cb->dst_port,
|
|
|
|
(unsigned int)pl_buf, (unsigned int)(pl_buf >> 32));
|
|
|
|
} else {
|
|
|
|
skb_copy_bits(skb, 0, &pkt, sizeof(pkt));
|
|
|
|
if (cb->type == QRTR_TYPE_NEW_SERVER ||
|
|
|
|
cb->type == QRTR_TYPE_DEL_SERVER)
|
|
|
|
QRTR_INFO(node->ilc,
|
|
|
|
"RX CTRL: cmd:0x%x SVC[0x%x:0x%x] addr[0x%x:0x%x]\n",
|
|
|
|
cb->type, le32_to_cpu(pkt.server.service),
|
|
|
|
le32_to_cpu(pkt.server.instance),
|
|
|
|
le32_to_cpu(pkt.server.node),
|
|
|
|
le32_to_cpu(pkt.server.port));
|
|
|
|
else if (cb->type == QRTR_TYPE_DEL_CLIENT ||
|
|
|
|
cb->type == QRTR_TYPE_RESUME_TX)
|
|
|
|
QRTR_INFO(node->ilc,
|
|
|
|
"RX CTRL: cmd:0x%x addr[0x%x:0x%x]\n",
|
|
|
|
cb->type, le32_to_cpu(pkt.client.node),
|
|
|
|
le32_to_cpu(pkt.client.port));
|
|
|
|
else if (cb->type == QRTR_TYPE_HELLO ||
|
|
|
|
cb->type == QRTR_TYPE_BYE) {
|
|
|
|
QRTR_INFO(node->ilc,
|
|
|
|
"RX CTRL: cmd:0x%x node[0x%x]\n",
|
|
|
|
cb->type, cb->src_node);
|
|
|
|
if (cb->src_node == 0 || cb->src_node == 3)
|
|
|
|
pr_err("qrtr: Modem QMI Readiness RX cmd:0x%x node[0x%x]\n",
|
|
|
|
cb->type, cb->src_node);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static bool refcount_dec_and_rwsem_lock(refcount_t *r,
|
|
|
|
struct rw_semaphore *sem)
|
|
|
|
{
|
|
|
|
if (refcount_dec_not_one(r))
|
|
|
|
return false;
|
|
|
|
|
|
|
|
down_write(sem);
|
|
|
|
if (!refcount_dec_and_test(r)) {
|
|
|
|
up_write(sem);
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
static inline int kref_put_rwsem_lock(struct kref *kref,
|
|
|
|
void (*release)(struct kref *kref),
|
|
|
|
struct rw_semaphore *sem)
|
|
|
|
{
|
|
|
|
if (refcount_dec_and_rwsem_lock(&kref->refcount, sem)) {
|
|
|
|
release(kref);
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Release node resources and free the node.
|
|
|
|
*
|
|
|
|
* Do not call directly, use qrtr_node_release. To be used with
|
|
|
|
* kref_put_mutex. As such, the node mutex is expected to be locked on call.
|
|
|
|
*/
|
|
|
|
static void __qrtr_node_release(struct kref *kref)
|
|
|
|
{
|
|
|
|
struct qrtr_tx_flow_waiter *waiter;
|
|
|
|
struct qrtr_tx_flow_waiter *temp;
|
|
|
|
struct radix_tree_iter iter;
|
|
|
|
struct qrtr_tx_flow *flow;
|
|
|
|
struct qrtr_node *node = container_of(kref, struct qrtr_node, ref);
|
|
|
|
void __rcu **slot;
|
|
|
|
|
|
|
|
if (node->nid != QRTR_EP_NID_AUTO) {
|
|
|
|
radix_tree_for_each_slot(slot, &qrtr_nodes, &iter, 0) {
|
|
|
|
if (node == *slot)
|
|
|
|
radix_tree_delete(&qrtr_nodes, iter.index);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
list_del(&node->item);
|
|
|
|
up_write(&qrtr_node_lock);
|
|
|
|
|
|
|
|
/* Free tx flow counters */
|
|
|
|
mutex_lock(&node->qrtr_tx_lock);
|
|
|
|
radix_tree_for_each_slot(slot, &node->qrtr_tx_flow, &iter, 0) {
|
|
|
|
flow = *slot;
|
|
|
|
list_for_each_entry_safe(waiter, temp, &flow->waiters, node) {
|
|
|
|
list_del(&waiter->node);
|
|
|
|
sock_put(waiter->sk);
|
|
|
|
kfree(waiter);
|
|
|
|
}
|
|
|
|
kfree(flow);
|
|
|
|
radix_tree_delete(&node->qrtr_tx_flow, iter.index);
|
|
|
|
}
|
|
|
|
mutex_unlock(&node->qrtr_tx_lock);
|
|
|
|
|
|
|
|
wakeup_source_unregister(node->ws);
|
|
|
|
kthread_flush_worker(&node->kworker);
|
|
|
|
kthread_stop(node->task);
|
|
|
|
|
|
|
|
skb_queue_purge(&node->rx_queue);
|
|
|
|
kfree(node);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Increment reference to node. */
|
|
|
|
static struct qrtr_node *qrtr_node_acquire(struct qrtr_node *node)
|
|
|
|
{
|
|
|
|
if (node)
|
|
|
|
kref_get(&node->ref);
|
|
|
|
return node;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Decrement reference to node and release as necessary. */
|
|
|
|
static void qrtr_node_release(struct qrtr_node *node)
|
|
|
|
{
|
|
|
|
if (!node)
|
|
|
|
return;
|
|
|
|
kref_put_rwsem_lock(&node->ref, __qrtr_node_release, &qrtr_node_lock);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* qrtr_tx_resume() - reset flow control counter
|
|
|
|
* @node: qrtr_node that the QRTR_TYPE_RESUME_TX packet arrived on
|
|
|
|
* @skb: skb for resume tx control packet
|
|
|
|
*/
|
|
|
|
static void qrtr_tx_resume(struct qrtr_node *node, struct sk_buff *skb)
|
|
|
|
{
|
|
|
|
struct qrtr_tx_flow_waiter *waiter;
|
|
|
|
struct qrtr_tx_flow_waiter *temp;
|
|
|
|
struct qrtr_ctrl_pkt pkt = {0,};
|
|
|
|
struct qrtr_tx_flow *flow;
|
|
|
|
struct sockaddr_qrtr src;
|
|
|
|
struct qrtr_sock *ipc;
|
|
|
|
struct sk_buff *skbn;
|
|
|
|
unsigned long key;
|
|
|
|
|
|
|
|
skb_copy_bits(skb, 0, &pkt, sizeof(pkt));
|
|
|
|
if (le32_to_cpu(pkt.cmd) != QRTR_TYPE_RESUME_TX)
|
|
|
|
return;
|
|
|
|
|
|
|
|
src.sq_family = AF_QIPCRTR;
|
|
|
|
src.sq_node = le32_to_cpu(pkt.client.node);
|
|
|
|
src.sq_port = le32_to_cpu(pkt.client.port);
|
|
|
|
key = (u64)src.sq_node << 32 | src.sq_port;
|
|
|
|
|
|
|
|
flow = radix_tree_lookup(&node->qrtr_tx_flow, key);
|
|
|
|
if (!flow)
|
|
|
|
return;
|
|
|
|
|
|
|
|
mutex_lock(&node->qrtr_tx_lock);
|
|
|
|
atomic_set(&flow->pending, 0);
|
|
|
|
wake_up_interruptible_all(&node->resume_tx);
|
|
|
|
|
|
|
|
list_for_each_entry_safe(waiter, temp, &flow->waiters, node) {
|
|
|
|
list_del(&waiter->node);
|
|
|
|
skbn = alloc_skb(0, GFP_KERNEL);
|
|
|
|
if (skbn) {
|
|
|
|
ipc = qrtr_sk(waiter->sk);
|
|
|
|
qrtr_local_enqueue(NULL, skbn, QRTR_TYPE_RESUME_TX,
|
|
|
|
&src, &ipc->us, 0);
|
|
|
|
}
|
|
|
|
sock_put(waiter->sk);
|
|
|
|
kfree(waiter);
|
|
|
|
}
|
|
|
|
mutex_unlock(&node->qrtr_tx_lock);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* qrtr_tx_wait() - flow control for outgoing packets
|
|
|
|
* @node: qrtr_node that the packet is to be send to
|
|
|
|
* @dest_node: node id of the destination
|
|
|
|
* @dest_port: port number of the destination
|
|
|
|
* @type: type of message
|
|
|
|
*
|
|
|
|
* The flow control scheme is based around the low and high "watermarks". When
|
|
|
|
* the low watermark is passed the confirm_rx flag is set on the outgoing
|
|
|
|
* message, which will trigger the remote to send a control message of the type
|
|
|
|
* QRTR_TYPE_RESUME_TX to reset the counter. If the high watermark is hit
|
|
|
|
* further transmision should be paused.
|
|
|
|
*
|
|
|
|
* Return: 1 if confirm_rx should be set, 0 otherwise or errno failure
|
|
|
|
*/
|
|
|
|
static int qrtr_tx_wait(struct qrtr_node *node, struct sockaddr_qrtr *to,
|
|
|
|
struct sock *sk, int type, unsigned int flags)
|
|
|
|
{
|
|
|
|
struct qrtr_tx_flow_waiter *waiter;
|
|
|
|
struct qrtr_tx_flow *flow;
|
|
|
|
unsigned long key = (u64)to->sq_node << 32 | to->sq_port;
|
|
|
|
int confirm_rx = 0;
|
|
|
|
long timeo;
|
|
|
|
long ret;
|
|
|
|
|
|
|
|
/* Never set confirm_rx on non-data packets */
|
|
|
|
if (type != QRTR_TYPE_DATA)
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
/* Assume sk is set correctly for all data type packets */
|
|
|
|
timeo = sock_sndtimeo(sk, flags & MSG_DONTWAIT);
|
|
|
|
|
|
|
|
mutex_lock(&node->qrtr_tx_lock);
|
|
|
|
flow = radix_tree_lookup(&node->qrtr_tx_flow, key);
|
|
|
|
if (!flow) {
|
|
|
|
flow = kzalloc(sizeof(*flow), GFP_KERNEL);
|
|
|
|
if (!flow)
|
|
|
|
return 1;
|
|
|
|
INIT_LIST_HEAD(&flow->waiters);
|
|
|
|
radix_tree_insert(&node->qrtr_tx_flow, key, flow);
|
|
|
|
}
|
|
|
|
mutex_unlock(&node->qrtr_tx_lock);
|
|
|
|
|
|
|
|
ret = timeo;
|
|
|
|
for (;;) {
|
|
|
|
mutex_lock(&node->qrtr_tx_lock);
|
|
|
|
if (atomic_read(&flow->pending) < QRTR_TX_FLOW_HIGH) {
|
|
|
|
atomic_inc(&flow->pending);
|
|
|
|
confirm_rx = atomic_read(&flow->pending) ==
|
|
|
|
QRTR_TX_FLOW_LOW;
|
|
|
|
mutex_unlock(&node->qrtr_tx_lock);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
if (!ret) {
|
|
|
|
waiter = kzalloc(sizeof(*waiter), GFP_KERNEL);
|
|
|
|
if (!waiter) {
|
|
|
|
mutex_unlock(&node->qrtr_tx_lock);
|
|
|
|
return -ENOMEM;
|
|
|
|
}
|
|
|
|
waiter->sk = sk;
|
|
|
|
sock_hold(sk);
|
|
|
|
list_add_tail(&waiter->node, &flow->waiters);
|
|
|
|
mutex_unlock(&node->qrtr_tx_lock);
|
|
|
|
return -EAGAIN;
|
|
|
|
}
|
|
|
|
mutex_unlock(&node->qrtr_tx_lock);
|
|
|
|
|
|
|
|
ret = wait_event_interruptible_timeout(
|
|
|
|
node->resume_tx,
|
|
|
|
!node->ep ||
|
|
|
|
atomic_read(&flow->pending) < QRTR_TX_FLOW_HIGH,
|
|
|
|
timeo);
|
|
|
|
if (ret < 0)
|
|
|
|
return ret;
|
|
|
|
if (!node->ep)
|
|
|
|
return -EPIPE;
|
|
|
|
}
|
|
|
|
return confirm_rx;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Pass an outgoing packet socket buffer to the endpoint driver. */
|
|
|
|
static int qrtr_node_enqueue(struct qrtr_node *node, struct sk_buff *skb,
|
|
|
|
int type, struct sockaddr_qrtr *from,
|
|
|
|
struct sockaddr_qrtr *to, unsigned int flags)
|
|
|
|
{
|
|
|
|
struct qrtr_hdr_v1 *hdr;
|
|
|
|
int confirm_rx;
|
|
|
|
size_t len = skb->len;
|
|
|
|
int rc = -ENODEV;
|
|
|
|
|
|
|
|
if (!atomic_read(&node->hello_sent) && type != QRTR_TYPE_HELLO) {
|
|
|
|
kfree_skb(skb);
|
|
|
|
return rc;
|
|
|
|
}
|
|
|
|
if (atomic_read(&node->hello_sent) && type == QRTR_TYPE_HELLO) {
|
|
|
|
kfree_skb(skb);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* If sk is null, this is a forwarded packet and should not wait */
|
|
|
|
if (!skb->sk) {
|
|
|
|
struct qrtr_cb *cb = (struct qrtr_cb *)skb->cb;
|
|
|
|
|
|
|
|
confirm_rx = cb->confirm_rx;
|
|
|
|
} else {
|
|
|
|
confirm_rx = qrtr_tx_wait(node, to, skb->sk, type, flags);
|
|
|
|
if (confirm_rx < 0) {
|
|
|
|
kfree_skb(skb);
|
|
|
|
return confirm_rx;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
hdr = skb_push(skb, sizeof(*hdr));
|
|
|
|
hdr->version = cpu_to_le32(QRTR_PROTO_VER_1);
|
|
|
|
hdr->type = cpu_to_le32(type);
|
|
|
|
hdr->src_node_id = cpu_to_le32(from->sq_node);
|
|
|
|
hdr->src_port_id = cpu_to_le32(from->sq_port);
|
|
|
|
if (to->sq_node == QRTR_NODE_BCAST)
|
|
|
|
hdr->dst_node_id = cpu_to_le32(node->nid);
|
|
|
|
else
|
|
|
|
hdr->dst_node_id = cpu_to_le32(to->sq_node);
|
|
|
|
|
|
|
|
hdr->dst_port_id = cpu_to_le32(to->sq_port);
|
|
|
|
hdr->size = cpu_to_le32(len);
|
|
|
|
hdr->confirm_rx = !!confirm_rx;
|
|
|
|
|
|
|
|
qrtr_log_tx_msg(node, hdr, skb);
|
|
|
|
rc = skb_put_padto(skb, ALIGN(len, 4) + sizeof(*hdr));
|
|
|
|
if (rc) {
|
|
|
|
pr_err("%s: failed to pad size %lu to %lu rc:%d\n", __func__,
|
|
|
|
len, ALIGN(len, 4) + sizeof(*hdr), rc);
|
|
|
|
return rc;
|
|
|
|
}
|
|
|
|
|
|
|
|
mutex_lock(&node->ep_lock);
|
|
|
|
if (node->ep)
|
|
|
|
rc = node->ep->xmit(node->ep, skb);
|
|
|
|
else
|
|
|
|
kfree_skb(skb);
|
|
|
|
mutex_unlock(&node->ep_lock);
|
|
|
|
|
|
|
|
if (!rc && type == QRTR_TYPE_HELLO)
|
|
|
|
atomic_inc(&node->hello_sent);
|
|
|
|
|
|
|
|
if (rc) {
|
|
|
|
struct qrtr_tx_flow *flow;
|
|
|
|
unsigned long key = (u64)to->sq_node << 32 | to->sq_port;
|
|
|
|
|
|
|
|
mutex_lock(&node->qrtr_tx_lock);
|
|
|
|
flow = radix_tree_lookup(&node->qrtr_tx_flow, key);
|
|
|
|
if (flow)
|
|
|
|
atomic_dec(&flow->pending);
|
|
|
|
mutex_unlock(&node->qrtr_tx_lock);
|
|
|
|
}
|
|
|
|
|
|
|
|
return rc;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Lookup node by id.
|
|
|
|
*
|
|
|
|
* callers must release with qrtr_node_release()
|
|
|
|
*/
|
|
|
|
static struct qrtr_node *qrtr_node_lookup(unsigned int nid)
|
|
|
|
{
|
|
|
|
struct qrtr_node *node;
|
|
|
|
|
|
|
|
down_read(&qrtr_node_lock);
|
|
|
|
node = radix_tree_lookup(&qrtr_nodes, nid);
|
|
|
|
node = qrtr_node_acquire(node);
|
|
|
|
up_read(&qrtr_node_lock);
|
|
|
|
|
|
|
|
return node;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Assign node id to node.
|
|
|
|
*
|
|
|
|
* This is mostly useful for automatic node id assignment, based on
|
|
|
|
* the source id in the incoming packet.
|
|
|
|
*/
|
|
|
|
static void qrtr_node_assign(struct qrtr_node *node, unsigned int nid)
|
|
|
|
{
|
|
|
|
struct qrtr_node *tnode = NULL;
|
|
|
|
char name[32] = {0,};
|
|
|
|
|
|
|
|
if (nid == QRTR_EP_NID_AUTO)
|
|
|
|
return;
|
|
|
|
if (nid == node->nid)
|
|
|
|
return;
|
|
|
|
|
|
|
|
down_read(&qrtr_node_lock);
|
|
|
|
tnode = radix_tree_lookup(&qrtr_nodes, nid);
|
|
|
|
up_read(&qrtr_node_lock);
|
|
|
|
if (tnode)
|
|
|
|
return;
|
|
|
|
|
|
|
|
down_write(&qrtr_node_lock);
|
|
|
|
radix_tree_insert(&qrtr_nodes, nid, node);
|
|
|
|
|
|
|
|
if (node->nid == QRTR_EP_NID_AUTO)
|
|
|
|
node->nid = nid;
|
|
|
|
up_write(&qrtr_node_lock);
|
|
|
|
|
|
|
|
snprintf(name, sizeof(name), "qrtr_%d", nid);
|
|
|
|
if (!node->ilc) {
|
|
|
|
node->ilc = ipc_log_context_create(QRTR_LOG_PAGE_CNT, name, 0);
|
|
|
|
}
|
|
|
|
/* create wakeup source for only NID = 0.
|
|
|
|
* From other nodes sensor service stream samples
|
|
|
|
* cause APPS suspend problems and power drain issue.
|
|
|
|
*/
|
|
|
|
if (!node->ws && nid == 0)
|
Merge android-4.14.151 (2bb70f4) into msm-4.14
* refs/heads/tmp-2bb70f4:
ANDROID: virtio: virtio_input: Set the amount of multitouch slots in virtio input
ANDROID: dummy_cpufreq: Implement get()
rtlwifi: Fix potential overflow on P2P code
ANDROID: cpufreq: create dummy cpufreq driver
ANDROID: Allow DRM_IOCTL_MODE_*_DUMB for render clients.
ANDROID: sdcardfs: evict dentries on fscrypt key removal
ANDROID: fscrypt: add key removal notifier chain
ANDROID: Move from clang r353983c to r365631c
ANDROID: move up spin_unlock_bh() ahead of remove_proc_entry()
BACKPORT: arm64: tags: Preserve tags for addresses translated via TTBR1
UPSTREAM: arm64: memory: Implement __tag_set() as common function
UPSTREAM: arm64/mm: fix variable 'tag' set but not used
UPSTREAM: arm64: avoid clang warning about self-assignment
ANDROID: refactor build.config files to remove duplication
UPSTREAM: mm: vmalloc: show number of vmalloc pages in /proc/meminfo
BACKPORT: PM/sleep: Expose suspend stats in sysfs
UPSTREAM: power: supply: Init device wakeup after device_add()
UPSTREAM: PM / wakeup: Unexport wakeup_source_sysfs_{add,remove}()
UPSTREAM: PM / wakeup: Register wakeup class kobj after device is added
BACKPORT: PM / wakeup: Fix sysfs registration error path
BACKPORT: PM / wakeup: Show wakeup sources stats in sysfs
UPSTREAM: PM / wakeup: Print warn if device gets enabled as wakeup source during sleep
UPSTREAM: PM / wakeup: Use wakeup_source_register() in wakelock.c
UPSTREAM: PM / wakeup: Only update last time for active wakeup sources
UPSTREAM: PM / core: Add support to skip power management in device/driver model
cuttlefish-4.14: Enable CONFIG_DM_SNAPSHOT
ANDROID: cuttlefish_defconfig: Enable BPF_JIT and BPF_JIT_ALWAYS_ON
UPSTREAM: netfilter: xt_IDLETIMER: fix sysfs callback function type
UPSTREAM: mm: untag user pointers in mmap/munmap/mremap/brk
UPSTREAM: vfio/type1: untag user pointers in vaddr_get_pfn
UPSTREAM: media/v4l2-core: untag user pointers in videobuf_dma_contig_user_get
UPSTREAM: drm/radeon: untag user pointers in radeon_gem_userptr_ioctl
BACKPORT: drm/amdgpu: untag user pointers
UPSTREAM: userfaultfd: untag user pointers
UPSTREAM: fs/namespace: untag user pointers in copy_mount_options
UPSTREAM: mm: untag user pointers in get_vaddr_frames
UPSTREAM: mm: untag user pointers in mm/gup.c
BACKPORT: mm: untag user pointers passed to memory syscalls
BACKPORT: lib: untag user pointers in strn*_user
UPSTREAM: arm64: Fix reference to docs for ARM64_TAGGED_ADDR_ABI
UPSTREAM: selftests, arm64: add kernel headers path for tags_test
BACKPORT: arm64: Relax Documentation/arm64/tagged-pointers.rst
UPSTREAM: arm64: Define Documentation/arm64/tagged-address-abi.rst
UPSTREAM: arm64: Change the tagged_addr sysctl control semantics to only prevent the opt-in
UPSTREAM: arm64: Tighten the PR_{SET, GET}_TAGGED_ADDR_CTRL prctl() unused arguments
UPSTREAM: selftests, arm64: fix uninitialized symbol in tags_test.c
UPSTREAM: arm64: mm: Really fix sparse warning in untagged_addr()
UPSTREAM: selftests, arm64: add a selftest for passing tagged pointers to kernel
BACKPORT: arm64: Introduce prctl() options to control the tagged user addresses ABI
UPSTREAM: thread_info: Add update_thread_flag() helpers
UPSTREAM: arm64: untag user pointers in access_ok and __uaccess_mask_ptr
UPSTREAM: uaccess: add noop untagged_addr definition
BACKPORT: block: annotate refault stalls from IO submission
ext4: add verity flag check for dax
ANDROID: usb: gadget: Fix dependency for f_accessory
ANDROID: sched: fair: balance for single core cluster
UPSTREAM: mm/kasan: fix false positive invalid-free reports with CONFIG_KASAN_SW_TAGS=y
f2fs: add a condition to detect overflow in f2fs_ioc_gc_range()
f2fs: fix to add missing F2FS_IO_ALIGNED() condition
f2fs: fix to fallback to buffered IO in IO aligned mode
f2fs: fix to handle error path correctly in f2fs_map_blocks
f2fs: fix extent corrupotion during directIO in LFS mode
f2fs: check all the data segments against all node ones
f2fs: Add a small clarification to CONFIG_FS_F2FS_FS_SECURITY
f2fs: fix inode rwsem regression
f2fs: fix to avoid accessing uninitialized field of inode page in is_alive()
f2fs: avoid infinite GC loop due to stale atomic files
f2fs: Fix indefinite loop in f2fs_gc()
f2fs: convert inline_data in prior to i_size_write
f2fs: fix error path of f2fs_convert_inline_page()
f2fs: add missing documents of reserve_root/resuid/resgid
f2fs: fix flushing node pages when checkpoint is disabled
f2fs: enhance f2fs_is_checkpoint_ready()'s readability
f2fs: clean up __bio_alloc()'s parameter
f2fs: fix wrong error injection path in inc_valid_block_count()
f2fs: fix to writeout dirty inode during node flush
f2fs: optimize case-insensitive lookups
f2fs: introduce f2fs_match_name() for cleanup
f2fs: Fix indefinite loop in f2fs_gc()
f2fs: allocate memory in batch in build_sit_info()
f2fs: fix to avoid data corruption by forbidding SSR overwrite
f2fs: Fix build error while CONFIG_NLS=m
Revert "f2fs: avoid out-of-range memory access"
f2fs: cleanup the code in build_sit_entries.
f2fs: fix wrong available node count calculation
f2fs: remove duplicate code in f2fs_file_write_iter
f2fs: fix to migrate blocks correctly during defragment
f2fs: use wrapped f2fs_cp_error()
f2fs: fix to use more generic EOPNOTSUPP
f2fs: use wrapped IS_SWAPFILE()
f2fs: Support case-insensitive file name lookups
f2fs: include charset encoding information in the superblock
fs: Reserve flag for casefolding
f2fs: fix to avoid call kvfree under spinlock
fs: f2fs: Remove unnecessary checks of SM_I(sbi) in update_general_status()
f2fs: disallow direct IO in atomic write
f2fs: fix to handle quota_{on,off} correctly
f2fs: fix to detect cp error in f2fs_setxattr()
f2fs: fix to spread f2fs_is_checkpoint_ready()
f2fs: support fiemap() for directory inode
f2fs: fix to avoid discard command leak
f2fs: fix to avoid tagging SBI_QUOTA_NEED_REPAIR incorrectly
f2fs: fix to drop meta/node pages during umount
f2fs: disallow switching io_bits option during remount
f2fs: fix panic of IO alignment feature
f2fs: introduce {page,io}_is_mergeable() for readability
f2fs: fix livelock in swapfile writes
f2fs: add fs-verity support
ext4: update on-disk format documentation for fs-verity
ext4: add fs-verity read support
ext4: add basic fs-verity support
fs-verity: support builtin file signatures
fs-verity: add SHA-512 support
fs-verity: implement FS_IOC_MEASURE_VERITY ioctl
fs-verity: implement FS_IOC_ENABLE_VERITY ioctl
fs-verity: add data verification hooks for ->readpages()
fs-verity: add the hook for file ->setattr()
fs-verity: add the hook for file ->open()
fs-verity: add inode and superblock fields
fs-verity: add Kconfig and the helper functions for hashing
fs: uapi: define verity bit for FS_IOC_GETFLAGS
fs-verity: add UAPI header
fs-verity: add MAINTAINERS file entry
fs-verity: add a documentation file
ext4: fix kernel oops caused by spurious casefold flag
ext4: fix coverity warning on error path of filename setup
ext4: optimize case-insensitive lookups
ext4: fix dcache lookup of !casefolded directories
unicode: update to Unicode 12.1.0 final
unicode: add missing check for an error return from utf8lookup()
ext4: export /sys/fs/ext4/feature/casefold if Unicode support is present
unicode: refactor the rule for regenerating utf8data.h
ext4: Support case-insensitive file name lookups
ext4: include charset encoding information in the superblock
unicode: update unicode database unicode version 12.1.0
unicode: introduce test module for normalized utf8 implementation
unicode: implement higher level API for string handling
unicode: reduce the size of utf8data[]
unicode: introduce code for UTF-8 normalization
unicode: introduce UTF-8 character database
ext4 crypto: fix to check feature status before get policy
fscrypt: document the new ioctls and policy version
ubifs: wire up new fscrypt ioctls
f2fs: wire up new fscrypt ioctls
ext4: wire up new fscrypt ioctls
fscrypt: require that key be added when setting a v2 encryption policy
fscrypt: add FS_IOC_REMOVE_ENCRYPTION_KEY_ALL_USERS ioctl
fscrypt: allow unprivileged users to add/remove keys for v2 policies
fscrypt: v2 encryption policy support
fscrypt: add an HKDF-SHA512 implementation
fscrypt: add FS_IOC_GET_ENCRYPTION_KEY_STATUS ioctl
fscrypt: add FS_IOC_REMOVE_ENCRYPTION_KEY ioctl
fscrypt: add FS_IOC_ADD_ENCRYPTION_KEY ioctl
fscrypt: rename keyinfo.c to keysetup.c
fscrypt: move v1 policy key setup to keysetup_v1.c
fscrypt: refactor key setup code in preparation for v2 policies
fscrypt: rename fscrypt_master_key to fscrypt_direct_key
fscrypt: add ->ci_inode to fscrypt_info
fscrypt: use FSCRYPT_* definitions, not FS_*
fscrypt: use FSCRYPT_ prefix for uapi constants
fs, fscrypt: move uapi definitions to new header <linux/fscrypt.h>
fscrypt: use ENOPKG when crypto API support missing
fscrypt: improve warnings for missing crypto API support
fscrypt: improve warning messages for unsupported encryption contexts
fscrypt: make fscrypt_msg() take inode instead of super_block
fscrypt: clean up base64 encoding/decoding
fscrypt: remove loadable module related code
ANDROID: arm64: bpf: implement arch_bpf_jit_check_func
ANDROID: bpf: validate bpf_func when BPF_JIT is enabled with CFI
UPSTREAM: kcm: use BPF_PROG_RUN
UPSTREAM: psi: get poll_work to run when calling poll syscall next time
UPSTREAM: sched/psi: Do not require setsched permission from the trigger creator
UPSTREAM: sched/psi: Reduce psimon FIFO priority
BACKPORT: arm64: Add support for relocating the kernel with RELR relocations
ANDROID: Log which device failed to suspend in dpm_suspend_start()
ANDROID: Revert "ANDROID: sched: Disallow WALT with CFS bandwidth control"
ANDROID: sched: WALT: Add support for CFS_BANDWIDTH
ANDROID: sched: WALT: Refactor cumulative runnable average fixup
ANDROID: sched: Disallow WALT with CFS bandwidth control
fscrypt: document testing with xfstests
fscrypt: remove selection of CONFIG_CRYPTO_SHA256
fscrypt: remove unnecessary includes of ratelimit.h
fscrypt: don't set policy for a dead directory
fscrypt: decrypt only the needed blocks in __fscrypt_decrypt_bio()
fscrypt: support decrypting multiple filesystem blocks per page
fscrypt: introduce fscrypt_decrypt_block_inplace()
fscrypt: handle blocksize < PAGE_SIZE in fscrypt_zeroout_range()
fscrypt: support encrypting multiple filesystem blocks per page
fscrypt: introduce fscrypt_encrypt_block_inplace()
fscrypt: clean up some BUG_ON()s in block encryption/decryption
fscrypt: rename fscrypt_do_page_crypto() to fscrypt_crypt_block()
fscrypt: remove the "write" part of struct fscrypt_ctx
fscrypt: simplify bounce page handling
ANDROID: fiq_debugger: remove
UPSTREAM: lib/test_meminit.c: use GFP_ATOMIC in RCU critical section
UPSTREAM: mm: slub: Fix slab walking for init_on_free
UPSTREAM: lib/test_meminit.c: minor test fixes
UPSTREAM: lib/test_meminit.c: fix -Wmaybe-uninitialized false positive
UPSTREAM: lib: introduce test_meminit module
UPSTREAM: mm: init: report memory auto-initialization features at boot time
BACKPORT: mm: security: introduce init_on_alloc=1 and init_on_free=1 boot options
UPSTREAM: arm64: move jump_label_init() before parse_early_param()
ANDROID: Add a tracepoint for mapping inode to full path
BACKPORT: arch: add pidfd and io_uring syscalls everywhere
UPSTREAM: dma-buf: add show_fdinfo handler
UPSTREAM: dma-buf: add DMA_BUF_SET_NAME ioctls
BACKPORT: dma-buf: give each buffer a full-fledged inode
ANDROID: fix kernelci build-break
UPSTREAM: drm/virtio: Fix cache entry creation race.
UPSTREAM: drm/virtio: Wake up all waiters when capset response comes in.
UPSTREAM: drm/virtio: Ensure cached capset entries are valid before copying.
UPSTREAM: drm/virtio: use u64_to_user_ptr macro
UPSTREAM: drm/virtio: remove irrelevant DRM_UNLOCKED flag
UPSTREAM: drm/virtio: Remove redundant return type
UPSTREAM: drm/virtio: allocate fences with GFP_KERNEL
UPSTREAM: drm/virtio: add trace events for commands
UPSTREAM: drm/virtio: trace drm_fence_emit
BACKPORT: drm/virtio: set seqno for dma-fence
BACKPORT: drm/virtio: move drm_connector_update_edid_property() call
UPSTREAM: drm/virtio: add missing drm_atomic_helper_shutdown() call.
BACKPORT: drm/virtio: rework resource creation workflow.
UPSTREAM: drm/virtio: params struct for virtio_gpu_cmd_create_resource_3d()
BACKPORT: drm/virtio: params struct for virtio_gpu_cmd_create_resource()
BACKPORT: drm/virtio: use struct to pass params to virtio_gpu_object_create()
UPSTREAM: drm/virtio: add virtio-gpu-features debugfs file.
UPSTREAM: drm/virtio: remove set but not used variable 'vgdev'
BACKPORT: drm/virtio: implement prime export
UPSTREAM: drm/virtio: remove prime pin/unpin callbacks.
UPSTREAM: drm/virtio: implement prime mmap
UPSTREAM: drm/virtio: drop virtio_gpu_fence_cleanup()
UPSTREAM: drm/virtio: fix pageflip flush
UPSTREAM: drm/virtio: log error responses
UPSTREAM: drm/virtio: Add missing virtqueue reset
UPSTREAM: drm/virtio: Remove incorrect kfree()
UPSTREAM: drm/virtio: virtio_gpu_cmd_resource_create_3d: drop unused fence arg
UPSTREAM: drm/virtio: fence: pass plain pointer
BACKPORT: drm/virtio: add edid support
UPSTREAM: virtio-gpu: add VIRTIO_GPU_F_EDID feature
BACKPORT: drm/virtio: fix memory leak of vfpriv on error return path
UPSTREAM: drm/virtio: bump driver version after explicit synchronization addition
UPSTREAM: drm/virtio: add in/out fence support for explicit synchronization
UPSTREAM: drm/virtio: add uapi for in and out explicit fences
UPSTREAM: drm/virtio: add virtio_gpu_alloc_fence()
UPSTREAM: drm/virtio: Handle error from virtio_gpu_resource_id_get
UPSTREAM: gpu/drm/virtio/virtgpu_vq.c: Use kmem_cache_zalloc
UPSTREAM: drm/virtio: fix resource id handling
UPSTREAM: drm/virtio: drop resource_id argument.
UPSTREAM: drm/virtio: use virtio_gpu_object->hw_res_handle in virtio_gpu_resource_create_ioctl()
UPSTREAM: drm/virtio: use virtio_gpu_object->hw_res_handle in virtio_gpu_mode_dumb_create()
UPSTREAM: drm/virtio: use virtio_gpu_object->hw_res_handle in virtio_gpufb_create()
BACKPORT: drm/virtio: track created object state
UPSTREAM: drm/virtio: document drm_dev_set_unique workaround
UPSTREAM: virtio: Support prime objects vmap/vunmap
UPSTREAM: virtio: Rework virtio_gpu_object_kmap()
UPSTREAM: virtio: Add virtio_gpu_object_kunmap()
UPSTREAM: drm/virtio: pass virtio_gpu_object to virtio_gpu_cmd_transfer_to_host_{2d, 3d}
UPSTREAM: drm/virtio: add dma sync for dma mapped virtio gpu framebuffer pages
UPSTREAM: drm/virtio: Remove set but not used variable 'bo'
UPSTREAM: drm/virtio: add iommu support.
UPSTREAM: drm/virtio: add virtio_gpu_object_detach() function
UPSTREAM: drm/virtio: track virtual output state
UPSTREAM: drm/virtio: fix bounds check in virtio_gpu_cmd_get_capset()
UPSTREAM: gpu: drm: virtio: code cleanup
UPSTREAM: drm/virtio: Place GEM BOs in drm_framebuffer
UPSTREAM: drm/virtio: fix mode_valid's return type
UPSTREAM: drm/virtio: Add spaces around operators
UPSTREAM: drm/virtio: Remove multiple blank lines
UPSTREAM: drm/virtio: Replace 'unsigned' for 'unsigned int'
UPSTREAM: drm/virtio: Remove return from void function
UPSTREAM: drm/virtio: Add */ in block comments to separate line
UPSTREAM: drm/virtio: Add blank line after variable declarations
UPSTREAM: drm/virtio: Add tabs at the start of a line
UPSTREAM: drm/virtio: Don't return invalid caps on timeout
UPSTREAM: virtgpu: remove redundant task_comm copying
UPSTREAM: drm/virtio: add create_handle support.
UPSTREAM: drm: virtio: replace reference/unreference with get/put
UPSTREAM: drm/virtio: Replace instances of reference/unreference with get/put
UPSTREAM: drm: byteorder: add DRM_FORMAT_HOST_*
UPSTREAM: drm: add drm_connector_attach_edid_property()
BACKPORT: drm/prime: Add drm_gem_prime_mmap()
f2fs: fix build error on android tracepoints
ANDROID: cuttlefish_defconfig: Enable CAN/VCAN
UPSTREAM: pidfd: fix a poll race when setting exit_state
BACKPORT: arch: wire-up pidfd_open()
BACKPORT: pid: add pidfd_open()
UPSTREAM: pidfd: add polling support
UPSTREAM: signal: improve comments
UPSTREAM: fork: do not release lock that wasn't taken
BACKPORT: signal: support CLONE_PIDFD with pidfd_send_signal
BACKPORT: clone: add CLONE_PIDFD
UPSTREAM: Make anon_inodes unconditional
UPSTREAM: signal: use fdget() since we don't allow O_PATH
UPSTREAM: signal: don't silently convert SI_USER signals to non-current pidfd
BACKPORT: signal: add pidfd_send_signal() syscall
UPSTREAM: net-ipv6-ndisc: add support for RFC7710 RA Captive Portal Identifier
ANDROID: fix up 9p filesystem due to CFI non-upstream patches
f2fs: use EINVAL for superblock with invalid magic
f2fs: fix to read source block before invalidating it
f2fs: remove redundant check from f2fs_setflags_common()
f2fs: use generic checking function for FS_IOC_FSSETXATTR
f2fs: use generic checking and prep function for FS_IOC_SETFLAGS
ubifs, fscrypt: cache decrypted symlink target in ->i_link
vfs: use READ_ONCE() to access ->i_link
fs, fscrypt: clear DCACHE_ENCRYPTED_NAME when unaliasing directory
ANDROID: (arm64) cuttlefish_defconfig: enable CONFIG_CPU_FREQ_TIMES
ANDROID: xfrm: remove in_compat_syscall() checks
ANDROID: enable CONFIG_RTC_DRV_TEST on cuttlefish
UPSTREAM: binder: Set end of SG buffer area properly.
ANDROID: x86_64_cuttlefish_defconfig: enable CONFIG_CPU_FREQ_TIMES
ANDROID: f2fs: add android fsync tracepoint
ANDROID: f2fs: fix wrong android tracepoint
fscrypt: cache decrypted symlink target in ->i_link
fscrypt: fix race where ->lookup() marks plaintext dentry as ciphertext
fscrypt: only set dentry_operations on ciphertext dentries
fscrypt: fix race allowing rename() and link() of ciphertext dentries
fscrypt: clean up and improve dentry revalidation
fscrypt: use READ_ONCE() to access ->i_crypt_info
fscrypt: remove WARN_ON_ONCE() when decryption fails
fscrypt: drop inode argument from fscrypt_get_ctx()
f2fs: improve print log in f2fs_sanity_check_ckpt()
f2fs: avoid out-of-range memory access
f2fs: fix to avoid long latency during umount
f2fs: allow all the users to pin a file
f2fs: support swap file w/ DIO
f2fs: allocate blocks for pinned file
f2fs: fix is_idle() check for discard type
f2fs: add a rw_sem to cover quota flag changes
f2fs: set SBI_NEED_FSCK for xattr corruption case
f2fs: use generic EFSBADCRC/EFSCORRUPTED
f2fs: Use DIV_ROUND_UP() instead of open-coding
f2fs: print kernel message if filesystem is inconsistent
f2fs: introduce f2fs_<level> macros to wrap f2fs_printk()
f2fs: avoid get_valid_blocks() for cleanup
f2fs: ioctl for removing a range from F2FS
f2fs: only set project inherit bit for directory
f2fs: separate f2fs i_flags from fs_flags and ext4 i_flags
UPSTREAM: kasan: initialize tag to 0xff in __kasan_kmalloc
UPSTREAM: x86/boot: Provide KASAN compatible aliases for string routines
UPSTREAM: mm/kasan: Remove the ULONG_MAX stack trace hackery
UPSTREAM: x86/uaccess, kasan: Fix KASAN vs SMAP
UPSTREAM: x86/uaccess: Introduce user_access_{save,restore}()
UPSTREAM: kasan: fix variable 'tag' set but not used warning
UPSTREAM: Revert "x86_64: Increase stack size for KASAN_EXTRA"
UPSTREAM: kasan: fix coccinelle warnings in kasan_p*_table
UPSTREAM: kasan: fix kasan_check_read/write definitions
BACKPORT: kasan: remove use after scope bugs detection.
BACKPORT: kasan: turn off asan-stack for clang-8 and earlier
UPSTREAM: slub: fix a crash with SLUB_DEBUG + KASAN_SW_TAGS
UPSTREAM: kasan, slab: remove redundant kasan_slab_alloc hooks
UPSTREAM: kasan, slab: make freelist stored without tags
UPSTREAM: kasan, slab: fix conflicts with CONFIG_HARDENED_USERCOPY
UPSTREAM: kasan: prevent tracing of tags.c
UPSTREAM: kasan: fix random seed generation for tag-based mode
UPSTREAM: slub: fix SLAB_CONSISTENCY_CHECKS + KASAN_SW_TAGS
UPSTREAM: kasan, slub: fix more conflicts with CONFIG_SLAB_FREELIST_HARDENED
UPSTREAM: kasan, slub: fix conflicts with CONFIG_SLAB_FREELIST_HARDENED
UPSTREAM: kasan, slub: move kasan_poison_slab hook before page_address
UPSTREAM: kasan, kmemleak: pass tagged pointers to kmemleak
UPSTREAM: kasan: fix assigning tags twice
UPSTREAM: kasan: mark file common so ftrace doesn't trace it
UPSTREAM: kasan, arm64: remove redundant ARCH_SLAB_MINALIGN define
UPSTREAM: kasan: fix krealloc handling for tag-based mode
UPSTREAM: kasan: make tag based mode work with CONFIG_HARDENED_USERCOPY
UPSTREAM: kasan, arm64: use ARCH_SLAB_MINALIGN instead of manual aligning
BACKPORT: mm/memblock.c: skip kmemleak for kasan_init()
UPSTREAM: kasan: add SPDX-License-Identifier mark to source files
BACKPORT: kasan: update documentation
UPSTREAM: kasan, arm64: select HAVE_ARCH_KASAN_SW_TAGS
UPSTREAM: kasan: add __must_check annotations to kasan hooks
BACKPORT: kasan, mm, arm64: tag non slab memory allocated via pagealloc
UPSTREAM: kasan, arm64: add brk handler for inline instrumentation
UPSTREAM: kasan: add hooks implementation for tag-based mode
UPSTREAM: mm: move obj_to_index to include/linux/slab_def.h
UPSTREAM: kasan: add bug reporting routines for tag-based mode
UPSTREAM: kasan: split out generic_report.c from report.c
UPSTREAM: kasan, mm: perform untagged pointers comparison in krealloc
BACKPORT: kasan, arm64: enable top byte ignore for the kernel
BACKPORT: kasan, arm64: fix up fault handling logic
UPSTREAM: kasan: preassign tags to objects with ctors or SLAB_TYPESAFE_BY_RCU
UPSTREAM: kasan, arm64: untag address in _virt_addr_is_linear
UPSTREAM: kasan: add tag related helper functions
BACKPORT: arm64: move untagged_addr macro from uaccess.h to memory.h
BACKPORT: kasan: initialize shadow to 0xff for tag-based mode
BACKPORT: kasan: rename kasan_zero_page to kasan_early_shadow_page
BACKPORT: kasan, arm64: adjust shadow size for tag-based mode
BACKPORT: kasan: add CONFIG_KASAN_GENERIC and CONFIG_KASAN_SW_TAGS
UPSTREAM: kasan: rename source files to reflect the new naming scheme
BACKPORT: kasan: move common generic and tag-based code to common.c
UPSTREAM: kasan, slub: handle pointer tags in early_kmem_cache_node_alloc
UPSTREAM: kasan, mm: change hooks signatures
UPSTREAM: arm64: add EXPORT_SYMBOL_NOKASAN()
BACKPORT: compiler: remove __no_sanitize_address_or_inline again
UPSTREAM: mm/kasan/quarantine.c: make quarantine_lock a raw_spinlock_t
UPSTREAM: lib/test_kasan.c: add tests for several string/memory API functions
UPSTREAM: arm64: lib: use C string functions with KASAN enabled
UPSTREAM: compiler: introduce __no_sanitize_address_or_inline
UPSTREAM: arm64: Fix typo in a comment in arch/arm64/mm/kasan_init.c
BACKPORT: kernel/memremap, kasan: make ZONE_DEVICE with work with KASAN
BACKPORT: mm/mempool.c: remove unused argument in kasan_unpoison_element() and remove_element()
UPSTREAM: kasan: only select SLUB_DEBUG with SYSFS=y
UPSTREAM: kasan: depend on CONFIG_SLUB_DEBUG
UPSTREAM: KASAN: prohibit KASAN+STRUCTLEAK combination
UPSTREAM: arm64: kasan: avoid pfn_to_nid() before page array is initialized
UPSTREAM: kasan: fix invalid-free test crashing the kernel
UPSTREAM: kasan, slub: fix handling of kasan_slab_free hook
UPSTREAM: slab, slub: skip unnecessary kasan_cache_shutdown()
BACKPORT: kasan: make kasan_cache_create() work with 32-bit slab cache sizes
UPSTREAM: locking/atomics: Instrument cmpxchg_double*()
UPSTREAM: locking/atomics: Instrument xchg()
UPSTREAM: locking/atomics: Simplify cmpxchg() instrumentation
UPSTREAM: locking/atomics/x86: Reduce arch_cmpxchg64*() instrumentation
UPSTREAM: locking/atomic, asm-generic, x86: Add comments for atomic instrumentation
UPSTREAM: locking/atomic, asm-generic: Add KASAN instrumentation to atomic operations
UPSTREAM: locking/atomic/x86: Switch atomic.h to use atomic-instrumented.h
UPSTREAM: locking/atomic, asm-generic: Add asm-generic/atomic-instrumented.h
BACKPORT: kasan, arm64: clean up KASAN_SHADOW_SCALE_SHIFT usage
UPSTREAM: kasan: clean up KASAN_SHADOW_SCALE_SHIFT usage
UPSTREAM: kasan: fix prototype author email address
UPSTREAM: kasan: detect invalid frees
UPSTREAM: kasan: unify code between kasan_slab_free() and kasan_poison_kfree()
UPSTREAM: kasan: detect invalid frees for large mempool objects
UPSTREAM: kasan: don't use __builtin_return_address(1)
UPSTREAM: kasan: detect invalid frees for large objects
UPSTREAM: kasan: add functions for unpoisoning stack variables
UPSTREAM: kasan: add tests for alloca poisoning
UPSTREAM: kasan: support alloca() poisoning
UPSTREAM: kasan/Makefile: support LLVM style asan parameters
BACKPORT: kasan: add compiler support for clang
BACKPORT: fs: dcache: Revert "manually unpoison dname after allocation to shut up kasan's reports"
UPSTREAM: fs/dcache: Use read_word_at_a_time() in dentry_string_cmp()
UPSTREAM: lib/strscpy: Shut up KASAN false-positives in strscpy()
UPSTREAM: compiler.h: Add read_word_at_a_time() function.
UPSTREAM: compiler.h, kasan: Avoid duplicating __read_once_size_nocheck()
UPSTREAM: arm64/mm/kasan: don't use vmemmap_populate() to initialize shadow
UPSTREAM: Documentation/features/KASAN: mark KASAN as supported only on 64-bit on x86
f2fs: Add option to limit required GC for checkpoint=disable
f2fs: Fix accounting for unusable blocks
f2fs: Fix root reserved on remount
f2fs: Lower threshold for disable_cp_again
f2fs: fix sparse warning
f2fs: fix f2fs_show_options to show nodiscard mount option
f2fs: add error prints for debugging mount failure
f2fs: fix to do sanity check on segment bitmap of LFS curseg
f2fs: add missing sysfs entries in documentation
f2fs: fix to avoid deadloop if data_flush is on
f2fs: always assume that the device is idle under gc_urgent
f2fs: add bio cache for IPU
f2fs: allow ssr block allocation during checkpoint=disable period
f2fs: fix to check layout on last valid checkpoint park
Conflicts:
arch/arm64/configs/cuttlefish_defconfig
arch/arm64/include/asm/memory.h
arch/arm64/include/asm/thread_info.h
arch/x86/configs/x86_64_cuttlefish_defconfig
build.config.common
drivers/dma-buf/dma-buf.c
fs/crypto/Makefile
fs/crypto/bio.c
fs/crypto/fscrypt_private.h
fs/crypto/keyinfo.c
fs/ext4/page-io.c
fs/f2fs/data.c
fs/f2fs/f2fs.h
fs/f2fs/inode.c
fs/f2fs/segment.c
fs/userfaultfd.c
include/linux/dma-buf.h
include/linux/fscrypt.h
include/linux/kasan.h
include/linux/platform_data/ds2482.h
include/uapi/linux/fs.h
kernel/sched/deadline.c
kernel/sched/fair.c
kernel/sched/rt.c
kernel/sched/sched.h
kernel/sched/stop_task.c
kernel/sched/walt.c
kernel/sched/walt.h
lib/test_kasan.c
mm/kasan/common.c
mm/kasan/kasan.h
mm/kasan/report.c
mm/slub.c
mm/vmalloc.c
scripts/Makefile.kasan
Changed below files to fix build errors:
drivers/char/diag/diagchar_core.c
drivers/power/supply/qcom/battery.c
drivers/power/supply/qcom/smb1390-charger-psy.c
drivers/power/supply/qcom/smb1390-charger.c
drivers/power/supply/qcom/step-chg-jeita.c
fs/crypto/fscrypt_ice.c
fs/crypto/fscrypt_private.h
fs/f2fs/inode.c
include/uapi/linux/fscrypt.h
net/qrtr/qrtr.c
gen_headers_arm.bp
gen_headers_arm64.bp
Extra added fixes in fs/f2fs/data.c for FBE:
* Fix FBE regression with 9937c21ce1 ("f2fs: add bio cache
for IPU"). The above commit is not setting the DUN for
bio, due to which the bio's could get corrupted when FBE
is enabled.
* The f2fs_merge_page_bio() incorrectly uses the bio after
it is submitted for IO when fscrypt_mergeable_bio()
returns false. Fix it by making the submitted bio NULL
so that a new bio gets allocated for the next/new page.
Ignored the below scheduler patches as they are already present:
ANDROID: sched: WALT: Add support for CFS_BANDWIDTH
ANDROID: sched: WALT: Refactor cumulative runnable average fixup
picked below patches from 4.14.159 and 4.14.172 versions to fix issues
0e39aa9d5 "UPSTREAM: arm64: Validate tagged addresses in access_ok() called from kernel threads"
352902650 "fscrypt: support passing a keyring key to FS_IOC_ADD_ENCRYPTION_KEY"
Change-Id: I205b796ee125fa6e9d27fa30f881e4e8fe8bea29
Signed-off-by: Srinivasarao P <spathi@codeaurora.org>
Signed-off-by: Blagovest Kolenichev <bkolenichev@codeaurora.org>
5 years ago
|
|
|
node->ws = wakeup_source_register(NULL, name);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* qrtr_peek_pkt_size() - Peek into the packet header to get potential pkt size
|
|
|
|
*
|
|
|
|
* @data: Starting address of the packet which points to router header.
|
|
|
|
*
|
|
|
|
* @returns: potential packet size on success, < 0 on error.
|
|
|
|
*
|
|
|
|
* This function is used by the underlying transport abstraction layer to
|
|
|
|
* peek into the potential packet size of an incoming packet. This information
|
|
|
|
* is used to perform link layer fragmentation and re-assembly
|
|
|
|
*/
|
|
|
|
int qrtr_peek_pkt_size(const void *data)
|
|
|
|
{
|
|
|
|
const struct qrtr_hdr_v1 *v1;
|
|
|
|
const struct qrtr_hdr_v2 *v2;
|
|
|
|
unsigned int hdrlen;
|
|
|
|
unsigned int size;
|
|
|
|
unsigned int ver;
|
|
|
|
|
|
|
|
/* Version field in v1 is little endian, so this works for both cases */
|
|
|
|
ver = *(u8 *)data;
|
|
|
|
|
|
|
|
switch (ver) {
|
|
|
|
case QRTR_PROTO_VER_1:
|
|
|
|
v1 = data;
|
|
|
|
hdrlen = sizeof(*v1);
|
|
|
|
size = le32_to_cpu(v1->size);
|
|
|
|
break;
|
|
|
|
case QRTR_PROTO_VER_2:
|
|
|
|
v2 = data;
|
|
|
|
hdrlen = sizeof(*v2) + v2->optlen;
|
|
|
|
size = le32_to_cpu(v2->size);
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
pr_err("qrtr: Invalid version %d\n", ver);
|
|
|
|
return -EINVAL;
|
|
|
|
}
|
|
|
|
|
|
|
|
return ALIGN(size, 4) + hdrlen;
|
|
|
|
}
|
|
|
|
EXPORT_SYMBOL(qrtr_peek_pkt_size);
|
|
|
|
|
|
|
|
static void qrtr_alloc_backup(struct work_struct *work)
|
|
|
|
{
|
|
|
|
struct sk_buff *skb;
|
|
|
|
int errcode;
|
|
|
|
|
|
|
|
while (skb_queue_len(&qrtr_backup_lo) < QRTR_BACKUP_LO_NUM) {
|
|
|
|
skb = alloc_skb_with_frags(sizeof(struct qrtr_hdr_v1),
|
|
|
|
QRTR_BACKUP_LO_SIZE, 0, &errcode,
|
|
|
|
GFP_KERNEL);
|
|
|
|
if (!skb)
|
|
|
|
break;
|
|
|
|
skb_queue_tail(&qrtr_backup_lo, skb);
|
|
|
|
}
|
|
|
|
while (skb_queue_len(&qrtr_backup_hi) < QRTR_BACKUP_HI_NUM) {
|
|
|
|
skb = alloc_skb_with_frags(sizeof(struct qrtr_hdr_v1),
|
|
|
|
QRTR_BACKUP_HI_SIZE, 0, &errcode,
|
|
|
|
GFP_KERNEL);
|
|
|
|
if (!skb)
|
|
|
|
break;
|
|
|
|
skb_queue_tail(&qrtr_backup_hi, skb);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static struct sk_buff *qrtr_get_backup(size_t len)
|
|
|
|
{
|
|
|
|
struct sk_buff *skb = NULL;
|
|
|
|
|
|
|
|
if (len < QRTR_BACKUP_LO_SIZE)
|
|
|
|
skb = skb_dequeue(&qrtr_backup_lo);
|
|
|
|
else if (len < QRTR_BACKUP_HI_SIZE)
|
|
|
|
skb = skb_dequeue(&qrtr_backup_hi);
|
|
|
|
|
|
|
|
if (skb)
|
|
|
|
queue_work(system_unbound_wq, &qrtr_backup_work);
|
|
|
|
|
|
|
|
return skb;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void qrtr_backup_init(void)
|
|
|
|
{
|
|
|
|
skb_queue_head_init(&qrtr_backup_lo);
|
|
|
|
skb_queue_head_init(&qrtr_backup_hi);
|
|
|
|
INIT_WORK(&qrtr_backup_work, qrtr_alloc_backup);
|
|
|
|
queue_work(system_unbound_wq, &qrtr_backup_work);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void qrtr_backup_deinit(void)
|
|
|
|
{
|
|
|
|
cancel_work_sync(&qrtr_backup_work);
|
|
|
|
skb_queue_purge(&qrtr_backup_lo);
|
|
|
|
skb_queue_purge(&qrtr_backup_hi);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* qrtr_endpoint_post() - post incoming data
|
|
|
|
* @ep: endpoint handle
|
|
|
|
* @data: data pointer
|
|
|
|
* @len: size of data in bytes
|
|
|
|
*
|
|
|
|
* Return: 0 on success; negative error code on failure
|
|
|
|
*/
|
|
|
|
int qrtr_endpoint_post(struct qrtr_endpoint *ep, const void *data, size_t len)
|
|
|
|
{
|
|
|
|
struct qrtr_node *node = ep->node;
|
|
|
|
const struct qrtr_hdr_v1 *v1;
|
|
|
|
const struct qrtr_hdr_v2 *v2;
|
|
|
|
struct sk_buff *skb;
|
|
|
|
struct qrtr_cb *cb;
|
|
|
|
unsigned int size;
|
|
|
|
int errcode;
|
|
|
|
unsigned int ver;
|
|
|
|
size_t hdrlen;
|
|
|
|
|
|
|
|
if (len & 3)
|
|
|
|
return -EINVAL;
|
|
|
|
|
|
|
|
skb = alloc_skb_with_frags(sizeof(*v1), len, 0, &errcode, GFP_ATOMIC);
|
|
|
|
if (!skb) {
|
|
|
|
skb = qrtr_get_backup(len);
|
|
|
|
if (!skb) {
|
|
|
|
pr_err("qrtr: Unable to get skb with len:%lu\n", len);
|
|
|
|
return -ENOMEM;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
skb_reserve(skb, sizeof(*v1));
|
|
|
|
cb = (struct qrtr_cb *)skb->cb;
|
|
|
|
|
|
|
|
/* Version field in v1 is little endian, so this works for both cases */
|
|
|
|
ver = *(u8 *)data;
|
|
|
|
|
|
|
|
switch (ver) {
|
|
|
|
case QRTR_PROTO_VER_1:
|
|
|
|
v1 = data;
|
|
|
|
hdrlen = sizeof(*v1);
|
|
|
|
|
|
|
|
cb->type = le32_to_cpu(v1->type);
|
|
|
|
cb->src_node = le32_to_cpu(v1->src_node_id);
|
|
|
|
cb->src_port = le32_to_cpu(v1->src_port_id);
|
|
|
|
cb->confirm_rx = !!v1->confirm_rx;
|
|
|
|
cb->dst_node = le32_to_cpu(v1->dst_node_id);
|
|
|
|
cb->dst_port = le32_to_cpu(v1->dst_port_id);
|
|
|
|
|
|
|
|
size = le32_to_cpu(v1->size);
|
|
|
|
break;
|
|
|
|
case QRTR_PROTO_VER_2:
|
|
|
|
v2 = data;
|
|
|
|
hdrlen = sizeof(*v2) + v2->optlen;
|
|
|
|
|
|
|
|
cb->type = v2->type;
|
|
|
|
cb->confirm_rx = !!(v2->flags & QRTR_FLAGS_CONFIRM_RX);
|
|
|
|
cb->src_node = le16_to_cpu(v2->src_node_id);
|
|
|
|
cb->src_port = le16_to_cpu(v2->src_port_id);
|
|
|
|
cb->dst_node = le16_to_cpu(v2->dst_node_id);
|
|
|
|
cb->dst_port = le16_to_cpu(v2->dst_port_id);
|
|
|
|
|
|
|
|
if (cb->src_port == (u16)QRTR_PORT_CTRL)
|
|
|
|
cb->src_port = QRTR_PORT_CTRL;
|
|
|
|
if (cb->dst_port == (u16)QRTR_PORT_CTRL)
|
|
|
|
cb->dst_port = QRTR_PORT_CTRL;
|
|
|
|
|
|
|
|
size = le32_to_cpu(v2->size);
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
pr_err("qrtr: Invalid version %d\n", ver);
|
|
|
|
goto err;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (cb->dst_port == QRTR_PORT_CTRL_LEGACY)
|
|
|
|
cb->dst_port = QRTR_PORT_CTRL;
|
|
|
|
|
|
|
|
if (len != ALIGN(size, 4) + hdrlen)
|
|
|
|
goto err;
|
|
|
|
|
|
|
|
if (cb->dst_port != QRTR_PORT_CTRL && cb->type != QRTR_TYPE_DATA &&
|
|
|
|
cb->type != QRTR_TYPE_RESUME_TX)
|
|
|
|
goto err;
|
|
|
|
|
|
|
|
__pm_wakeup_event(node->ws, 0);
|
|
|
|
|
|
|
|
skb->data_len = size;
|
|
|
|
skb->len = size;
|
|
|
|
skb_store_bits(skb, 0, data + hdrlen, size);
|
|
|
|
qrtr_log_rx_msg(node, skb);
|
|
|
|
|
|
|
|
skb_queue_tail(&node->rx_queue, skb);
|
|
|
|
kthread_queue_work(&node->kworker, &node->read_data);
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
err:
|
|
|
|
kfree_skb(skb);
|
|
|
|
return -EINVAL;
|
|
|
|
|
|
|
|
}
|
|
|
|
EXPORT_SYMBOL_GPL(qrtr_endpoint_post);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* qrtr_alloc_ctrl_packet() - allocate control packet skb
|
|
|
|
* @pkt: reference to qrtr_ctrl_pkt pointer
|
|
|
|
*
|
|
|
|
* Returns newly allocated sk_buff, or NULL on failure
|
|
|
|
*
|
|
|
|
* This function allocates a sk_buff large enough to carry a qrtr_ctrl_pkt and
|
|
|
|
* on success returns a reference to the control packet in @pkt.
|
|
|
|
*/
|
|
|
|
static struct sk_buff *qrtr_alloc_ctrl_packet(struct qrtr_ctrl_pkt **pkt)
|
|
|
|
{
|
|
|
|
const int pkt_len = sizeof(struct qrtr_ctrl_pkt);
|
|
|
|
struct sk_buff *skb;
|
|
|
|
|
|
|
|
skb = alloc_skb(QRTR_HDR_MAX_SIZE + pkt_len, GFP_KERNEL);
|
|
|
|
if (!skb)
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
skb_reserve(skb, QRTR_HDR_MAX_SIZE);
|
|
|
|
*pkt = skb_put_zero(skb, pkt_len);
|
|
|
|
|
|
|
|
return skb;
|
|
|
|
}
|
|
|
|
|
|
|
|
static struct qrtr_sock *qrtr_port_lookup(int port);
|
|
|
|
static void qrtr_port_put(struct qrtr_sock *ipc);
|
|
|
|
|
|
|
|
/* Prepare skb for forwarding by allocating enough linear memory to align and
|
|
|
|
* add the header since qrtr transports do not support fragmented skbs
|
|
|
|
*/
|
|
|
|
static void qrtr_skb_align_linearize(struct sk_buff *skb)
|
|
|
|
{
|
|
|
|
int nhead = ALIGN(skb->len, 4) + sizeof(struct qrtr_hdr_v1);
|
|
|
|
int rc;
|
|
|
|
|
|
|
|
if (!skb_is_nonlinear(skb))
|
|
|
|
return;
|
|
|
|
|
|
|
|
rc = pskb_expand_head(skb, nhead, 0, GFP_KERNEL);
|
|
|
|
skb_condense(skb);
|
|
|
|
if (rc)
|
|
|
|
pr_err("%s: failed:%d to allocate linear skb size:%d\n",
|
|
|
|
__func__, rc, nhead);
|
|
|
|
}
|
|
|
|
|
|
|
|
static bool qrtr_must_forward(struct qrtr_node *src,
|
|
|
|
struct qrtr_node *dst, u32 type)
|
|
|
|
{
|
|
|
|
/* Node structure is not maintained for local processor.
|
|
|
|
* Hence src is null in that case.
|
|
|
|
*/
|
|
|
|
if (!src)
|
|
|
|
return true;
|
|
|
|
|
|
|
|
if (!dst)
|
|
|
|
return false;
|
|
|
|
|
|
|
|
if (type == QRTR_TYPE_HELLO || type == QRTR_TYPE_RESUME_TX)
|
|
|
|
return false;
|
|
|
|
|
|
|
|
if (dst == src || dst->nid == QRTR_EP_NID_AUTO)
|
|
|
|
return false;
|
|
|
|
|
|
|
|
if (abs(dst->net_id - src->net_id) > 1)
|
|
|
|
return true;
|
|
|
|
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void qrtr_fwd_ctrl_pkt(struct sk_buff *skb)
|
|
|
|
{
|
|
|
|
struct qrtr_node *node;
|
|
|
|
struct qrtr_node *src;
|
|
|
|
struct qrtr_cb *cb = (struct qrtr_cb *)skb->cb;
|
|
|
|
|
|
|
|
qrtr_skb_align_linearize(skb);
|
|
|
|
src = qrtr_node_lookup(cb->src_node);
|
|
|
|
down_read(&qrtr_node_lock);
|
|
|
|
list_for_each_entry(node, &qrtr_all_epts, item) {
|
|
|
|
struct sockaddr_qrtr from;
|
|
|
|
struct sockaddr_qrtr to;
|
|
|
|
struct sk_buff *skbn;
|
|
|
|
|
|
|
|
if (!qrtr_must_forward(src, node, cb->type))
|
|
|
|
continue;
|
|
|
|
|
|
|
|
skbn = skb_clone(skb, GFP_KERNEL);
|
|
|
|
if (!skbn)
|
|
|
|
break;
|
|
|
|
|
|
|
|
from.sq_family = AF_QIPCRTR;
|
|
|
|
from.sq_node = cb->src_node;
|
|
|
|
from.sq_port = cb->src_port;
|
|
|
|
|
|
|
|
to.sq_family = AF_QIPCRTR;
|
|
|
|
to.sq_node = node->nid;
|
|
|
|
to.sq_port = QRTR_PORT_CTRL;
|
|
|
|
|
|
|
|
qrtr_node_enqueue(node, skbn, cb->type, &from, &to, 0);
|
|
|
|
}
|
|
|
|
up_read(&qrtr_node_lock);
|
|
|
|
qrtr_node_release(src);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void qrtr_fwd_pkt(struct sk_buff *skb, struct qrtr_cb *cb)
|
|
|
|
{
|
|
|
|
struct sockaddr_qrtr from = {AF_QIPCRTR, cb->src_node, cb->src_port};
|
|
|
|
struct sockaddr_qrtr to = {AF_QIPCRTR, cb->dst_node, cb->dst_port};
|
|
|
|
struct qrtr_node *node;
|
|
|
|
|
|
|
|
qrtr_skb_align_linearize(skb);
|
|
|
|
node = qrtr_node_lookup(cb->dst_node);
|
|
|
|
if (!node) {
|
|
|
|
kfree_skb(skb);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
qrtr_node_enqueue(node, skb, cb->type, &from, &to, 0);
|
|
|
|
qrtr_node_release(node);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void qrtr_sock_queue_skb(struct qrtr_node *node, struct sk_buff *skb,
|
|
|
|
struct qrtr_sock *ipc)
|
|
|
|
{
|
|
|
|
struct qrtr_cb *cb = (struct qrtr_cb *)skb->cb;
|
|
|
|
int rc;
|
|
|
|
|
|
|
|
/* Don't queue HELLO if control port already received */
|
|
|
|
if (cb->type == QRTR_TYPE_HELLO) {
|
|
|
|
if (atomic_read(&node->hello_rcvd)) {
|
|
|
|
kfree_skb(skb);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
atomic_inc(&node->hello_rcvd);
|
|
|
|
}
|
|
|
|
|
|
|
|
rc = sock_queue_rcv_skb(&ipc->sk, skb);
|
|
|
|
if (rc) {
|
|
|
|
pr_err("%s: qrtr pkt dropped flow[%d] rc[%d]\n",
|
|
|
|
__func__, cb->confirm_rx, rc);
|
|
|
|
kfree_skb(skb);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Handle and route a received packet.
|
|
|
|
*
|
|
|
|
* This will auto-reply with resume-tx packet as necessary.
|
|
|
|
*/
|
|
|
|
static void qrtr_node_rx_work(struct kthread_work *work)
|
|
|
|
{
|
|
|
|
struct qrtr_node *node = container_of(work, struct qrtr_node,
|
|
|
|
read_data);
|
|
|
|
struct qrtr_ctrl_pkt pkt = {0,};
|
|
|
|
struct sk_buff *skb;
|
|
|
|
|
|
|
|
while ((skb = skb_dequeue(&node->rx_queue)) != NULL) {
|
|
|
|
struct qrtr_sock *ipc;
|
|
|
|
struct qrtr_cb *cb;
|
|
|
|
|
|
|
|
cb = (struct qrtr_cb *)skb->cb;
|
|
|
|
qrtr_node_assign(node, cb->src_node);
|
|
|
|
|
|
|
|
if (cb->type != QRTR_TYPE_DATA)
|
|
|
|
qrtr_fwd_ctrl_pkt(skb);
|
|
|
|
|
|
|
|
if (cb->type == QRTR_TYPE_NEW_SERVER &&
|
|
|
|
skb->len == sizeof(pkt)) {
|
|
|
|
skb_copy_bits(skb, 0, &pkt, sizeof(pkt));
|
|
|
|
qrtr_node_assign(node, le32_to_cpu(pkt.server.node));
|
|
|
|
}
|
|
|
|
|
|
|
|
if (cb->type == QRTR_TYPE_RESUME_TX) {
|
|
|
|
if (cb->dst_node != qrtr_local_nid) {
|
|
|
|
qrtr_fwd_pkt(skb, cb);
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
qrtr_tx_resume(node, skb);
|
|
|
|
consume_skb(skb);
|
|
|
|
} else if (cb->dst_node != qrtr_local_nid &&
|
|
|
|
cb->type == QRTR_TYPE_DATA) {
|
|
|
|
qrtr_fwd_pkt(skb, cb);
|
|
|
|
} else if (cb->type == QRTR_TYPE_DEL_PROC) {
|
|
|
|
qrtr_handle_del_proc(skb);
|
|
|
|
} else {
|
|
|
|
ipc = qrtr_port_lookup(cb->dst_port);
|
|
|
|
if (!ipc) {
|
|
|
|
kfree_skb(skb);
|
|
|
|
} else {
|
|
|
|
qrtr_sock_queue_skb(node, skb, ipc);
|
|
|
|
qrtr_port_put(ipc);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void qrtr_handle_del_proc(struct sk_buff *skb)
|
|
|
|
{
|
|
|
|
struct sockaddr_qrtr src = {AF_QIPCRTR, 0, QRTR_PORT_CTRL};
|
|
|
|
struct sockaddr_qrtr dst = {AF_QIPCRTR, qrtr_local_nid, QRTR_PORT_CTRL};
|
|
|
|
struct qrtr_ctrl_pkt pkt = {0,};
|
|
|
|
|
|
|
|
skb_copy_bits(skb, 0, &pkt, sizeof(pkt));
|
|
|
|
src.sq_node = le32_to_cpu(pkt.proc.node);
|
|
|
|
|
|
|
|
memset(&pkt, 0, sizeof(pkt));
|
|
|
|
pkt.cmd = cpu_to_le32(QRTR_TYPE_BYE);
|
|
|
|
skb_store_bits(skb, 0, &pkt, sizeof(pkt));
|
|
|
|
qrtr_local_enqueue(NULL, skb, QRTR_TYPE_BYE, &src, &dst, 0);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void qrtr_hello_work(struct kthread_work *work)
|
|
|
|
{
|
|
|
|
struct sockaddr_qrtr from = {AF_QIPCRTR, 0, QRTR_PORT_CTRL};
|
|
|
|
struct sockaddr_qrtr to = {AF_QIPCRTR, 0, QRTR_PORT_CTRL};
|
|
|
|
struct qrtr_ctrl_pkt *pkt;
|
|
|
|
struct qrtr_node *node;
|
|
|
|
struct qrtr_sock *ctrl;
|
|
|
|
struct sk_buff *skb;
|
|
|
|
|
|
|
|
ctrl = qrtr_port_lookup(QRTR_PORT_CTRL);
|
|
|
|
if (!ctrl)
|
|
|
|
return;
|
|
|
|
|
|
|
|
skb = qrtr_alloc_ctrl_packet(&pkt);
|
|
|
|
if (!skb) {
|
|
|
|
qrtr_port_put(ctrl);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
node = container_of(work, struct qrtr_node, say_hello);
|
|
|
|
pkt->cmd = cpu_to_le32(QRTR_TYPE_HELLO);
|
|
|
|
from.sq_node = qrtr_local_nid;
|
|
|
|
to.sq_node = node->nid;
|
|
|
|
qrtr_node_enqueue(node, skb, QRTR_TYPE_HELLO, &from, &to, 0);
|
|
|
|
qrtr_port_put(ctrl);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* qrtr_endpoint_register() - register a new endpoint
|
|
|
|
* @ep: endpoint to register
|
|
|
|
* @nid: desired node id; may be QRTR_EP_NID_AUTO for auto-assignment
|
|
|
|
* @rt: flag to notify real time low latency endpoint
|
|
|
|
* Return: 0 on success; negative error code on failure
|
|
|
|
*
|
|
|
|
* The specified endpoint must have the xmit function pointer set on call.
|
|
|
|
*/
|
|
|
|
int qrtr_endpoint_register(struct qrtr_endpoint *ep, unsigned int net_id,
|
|
|
|
bool rt)
|
|
|
|
{
|
|
|
|
struct qrtr_node *node;
|
|
|
|
struct sched_param param = {.sched_priority = 1};
|
|
|
|
|
|
|
|
if (!ep || !ep->xmit)
|
|
|
|
return -EINVAL;
|
|
|
|
|
|
|
|
node = kzalloc(sizeof(*node), GFP_KERNEL);
|
|
|
|
if (!node)
|
|
|
|
return -ENOMEM;
|
|
|
|
|
|
|
|
kref_init(&node->ref);
|
|
|
|
mutex_init(&node->ep_lock);
|
|
|
|
skb_queue_head_init(&node->rx_queue);
|
|
|
|
node->nid = QRTR_EP_NID_AUTO;
|
|
|
|
node->ep = ep;
|
|
|
|
atomic_set(&node->hello_sent, 0);
|
|
|
|
atomic_set(&node->hello_rcvd, 0);
|
|
|
|
|
|
|
|
kthread_init_work(&node->read_data, qrtr_node_rx_work);
|
|
|
|
kthread_init_work(&node->say_hello, qrtr_hello_work);
|
|
|
|
kthread_init_worker(&node->kworker);
|
|
|
|
node->task = kthread_run(kthread_worker_fn, &node->kworker, "qrtr_rx");
|
|
|
|
if (IS_ERR(node->task)) {
|
|
|
|
kfree(node);
|
|
|
|
return -ENOMEM;
|
|
|
|
}
|
|
|
|
if (rt)
|
|
|
|
sched_setscheduler(node->task, SCHED_FIFO, ¶m);
|
|
|
|
|
|
|
|
mutex_init(&node->qrtr_tx_lock);
|
|
|
|
INIT_RADIX_TREE(&node->qrtr_tx_flow, GFP_KERNEL);
|
|
|
|
init_waitqueue_head(&node->resume_tx);
|
|
|
|
|
|
|
|
qrtr_node_assign(node, node->nid);
|
|
|
|
node->net_id = net_id;
|
|
|
|
|
|
|
|
down_write(&qrtr_node_lock);
|
|
|
|
list_add(&node->item, &qrtr_all_epts);
|
|
|
|
up_write(&qrtr_node_lock);
|
|
|
|
ep->node = node;
|
|
|
|
|
|
|
|
kthread_queue_work(&node->kworker, &node->say_hello);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
EXPORT_SYMBOL_GPL(qrtr_endpoint_register);
|
|
|
|
|
|
|
|
static u32 qrtr_calc_checksum(struct qrtr_ctrl_pkt *pkt)
|
|
|
|
{
|
|
|
|
u32 checksum = 0;
|
|
|
|
u32 mask = 0xffff;
|
|
|
|
u16 upper_nb;
|
|
|
|
u16 lower_nb;
|
|
|
|
u32 *msg;
|
|
|
|
int i;
|
|
|
|
|
|
|
|
if (!pkt)
|
|
|
|
return checksum;
|
|
|
|
msg = (u32 *)pkt;
|
|
|
|
|
|
|
|
for (i = 0; i < sizeof(*pkt) / sizeof(*msg); i++) {
|
|
|
|
lower_nb = *msg & mask;
|
|
|
|
upper_nb = (*msg >> 16) & mask;
|
|
|
|
checksum += (upper_nb + lower_nb);
|
|
|
|
msg++;
|
|
|
|
}
|
|
|
|
while (checksum > 0xffff)
|
|
|
|
checksum = (checksum & mask) + ((checksum >> 16) & mask);
|
|
|
|
|
|
|
|
checksum = ~checksum & mask;
|
|
|
|
|
|
|
|
return checksum;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void qrtr_fwd_del_proc(struct qrtr_node *src, unsigned int nid)
|
|
|
|
{
|
|
|
|
struct sockaddr_qrtr from = {AF_QIPCRTR, 0, QRTR_PORT_CTRL};
|
|
|
|
struct sockaddr_qrtr to = {AF_QIPCRTR, 0, QRTR_PORT_CTRL};
|
|
|
|
struct qrtr_ctrl_pkt *pkt;
|
|
|
|
struct qrtr_node *dst;
|
|
|
|
struct sk_buff *skb;
|
|
|
|
|
|
|
|
list_for_each_entry(dst, &qrtr_all_epts, item) {
|
|
|
|
if (!qrtr_must_forward(src, dst, QRTR_TYPE_DEL_PROC))
|
|
|
|
continue;
|
|
|
|
|
|
|
|
skb = qrtr_alloc_ctrl_packet(&pkt);
|
|
|
|
if (!skb)
|
|
|
|
return;
|
|
|
|
|
|
|
|
pkt->cmd = cpu_to_le32(QRTR_TYPE_DEL_PROC);
|
|
|
|
pkt->proc.rsvd = QRTR_DEL_PROC_MAGIC;
|
|
|
|
pkt->proc.node = cpu_to_le32(nid);
|
|
|
|
pkt->proc.rsvd = cpu_to_le32(qrtr_calc_checksum(pkt));
|
|
|
|
|
|
|
|
from.sq_node = src->nid;
|
|
|
|
to.sq_node = dst->nid;
|
|
|
|
qrtr_node_enqueue(dst, skb, QRTR_TYPE_DEL_PROC, &from, &to, 0);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* qrtr_endpoint_unregister - unregister endpoint
|
|
|
|
* @ep: endpoint to unregister
|
|
|
|
*/
|
|
|
|
void qrtr_endpoint_unregister(struct qrtr_endpoint *ep)
|
|
|
|
{
|
|
|
|
struct radix_tree_iter iter;
|
|
|
|
struct qrtr_node *node = ep->node;
|
|
|
|
struct sockaddr_qrtr src = {AF_QIPCRTR, node->nid, QRTR_PORT_CTRL};
|
|
|
|
struct sockaddr_qrtr dst = {AF_QIPCRTR, qrtr_local_nid, QRTR_PORT_CTRL};
|
|
|
|
struct qrtr_ctrl_pkt *pkt;
|
|
|
|
struct sk_buff *skb;
|
|
|
|
void __rcu **slot;
|
|
|
|
|
|
|
|
mutex_lock(&node->ep_lock);
|
|
|
|
node->ep = NULL;
|
|
|
|
mutex_unlock(&node->ep_lock);
|
|
|
|
|
|
|
|
/* Notify the local controller about the event */
|
|
|
|
down_read(&qrtr_node_lock);
|
|
|
|
radix_tree_for_each_slot(slot, &qrtr_nodes, &iter, 0) {
|
|
|
|
if (node != *slot)
|
|
|
|
continue;
|
|
|
|
|
|
|
|
skb = qrtr_alloc_ctrl_packet(&pkt);
|
|
|
|
if (!skb)
|
|
|
|
continue;
|
|
|
|
|
|
|
|
src.sq_node = iter.index;
|
|
|
|
pkt->cmd = cpu_to_le32(QRTR_TYPE_BYE);
|
|
|
|
qrtr_local_enqueue(NULL, skb, QRTR_TYPE_BYE, &src, &dst, 0);
|
|
|
|
|
|
|
|
qrtr_fwd_del_proc(node, iter.index);
|
|
|
|
}
|
|
|
|
up_read(&qrtr_node_lock);
|
|
|
|
|
|
|
|
/* Wake up any transmitters waiting for resume-tx from the node */
|
|
|
|
wake_up_interruptible_all(&node->resume_tx);
|
|
|
|
|
|
|
|
qrtr_node_release(node);
|
|
|
|
ep->node = NULL;
|
|
|
|
}
|
|
|
|
EXPORT_SYMBOL_GPL(qrtr_endpoint_unregister);
|
|
|
|
|
|
|
|
/* Lookup socket by port.
|
|
|
|
*
|
|
|
|
* Callers must release with qrtr_port_put()
|
|
|
|
*/
|
|
|
|
static struct qrtr_sock *qrtr_port_lookup(int port)
|
|
|
|
{
|
|
|
|
struct qrtr_sock *ipc;
|
|
|
|
|
|
|
|
if (port == QRTR_PORT_CTRL)
|
|
|
|
port = 0;
|
|
|
|
|
|
|
|
mutex_lock(&qrtr_port_lock);
|
|
|
|
ipc = idr_find(&qrtr_ports, port);
|
|
|
|
if (ipc)
|
|
|
|
sock_hold(&ipc->sk);
|
|
|
|
mutex_unlock(&qrtr_port_lock);
|
|
|
|
|
|
|
|
return ipc;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Release acquired socket. */
|
|
|
|
static void qrtr_port_put(struct qrtr_sock *ipc)
|
|
|
|
{
|
|
|
|
sock_put(&ipc->sk);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void qrtr_send_del_client(struct qrtr_sock *ipc)
|
|
|
|
{
|
|
|
|
struct qrtr_ctrl_pkt *pkt;
|
|
|
|
struct sockaddr_qrtr to;
|
|
|
|
struct qrtr_node *node;
|
|
|
|
struct sk_buff *skbn;
|
|
|
|
struct sk_buff *skb;
|
|
|
|
int type = QRTR_TYPE_DEL_CLIENT;
|
|
|
|
|
|
|
|
skb = qrtr_alloc_ctrl_packet(&pkt);
|
|
|
|
if (!skb)
|
|
|
|
return;
|
|
|
|
|
|
|
|
to.sq_family = AF_QIPCRTR;
|
|
|
|
to.sq_node = QRTR_NODE_BCAST;
|
|
|
|
to.sq_port = QRTR_PORT_CTRL;
|
|
|
|
|
|
|
|
pkt->cmd = cpu_to_le32(QRTR_TYPE_DEL_CLIENT);
|
|
|
|
pkt->client.node = cpu_to_le32(ipc->us.sq_node);
|
|
|
|
pkt->client.port = cpu_to_le32(ipc->us.sq_port);
|
|
|
|
|
|
|
|
skb_set_owner_w(skb, &ipc->sk);
|
|
|
|
|
|
|
|
if (ipc->state == QRTR_STATE_MULTI) {
|
|
|
|
qrtr_bcast_enqueue(NULL, skb, type, &ipc->us, &to, 0);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (ipc->state > QRTR_STATE_INIT) {
|
|
|
|
node = qrtr_node_lookup(ipc->state);
|
|
|
|
if (!node)
|
|
|
|
goto exit;
|
|
|
|
|
|
|
|
skbn = skb_clone(skb, GFP_KERNEL);
|
|
|
|
if (!skbn) {
|
|
|
|
qrtr_node_release(node);
|
|
|
|
goto exit;
|
|
|
|
}
|
|
|
|
|
|
|
|
skb_set_owner_w(skbn, &ipc->sk);
|
|
|
|
qrtr_node_enqueue(node, skbn, type, &ipc->us, &to, 0);
|
|
|
|
qrtr_node_release(node);
|
|
|
|
}
|
|
|
|
exit:
|
|
|
|
qrtr_local_enqueue(NULL, skb, type, &ipc->us, &to, 0);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Remove port assignment. */
|
|
|
|
static void qrtr_port_remove(struct qrtr_sock *ipc)
|
|
|
|
{
|
|
|
|
int port = ipc->us.sq_port;
|
|
|
|
|
|
|
|
qrtr_send_del_client(ipc);
|
|
|
|
if (port == QRTR_PORT_CTRL)
|
|
|
|
port = 0;
|
|
|
|
|
|
|
|
__sock_put(&ipc->sk);
|
|
|
|
|
|
|
|
mutex_lock(&qrtr_port_lock);
|
|
|
|
idr_remove(&qrtr_ports, port);
|
|
|
|
mutex_unlock(&qrtr_port_lock);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Assign port number to socket.
|
|
|
|
*
|
|
|
|
* Specify port in the integer pointed to by port, and it will be adjusted
|
|
|
|
* on return as necesssary.
|
|
|
|
*
|
|
|
|
* Port may be:
|
|
|
|
* 0: Assign ephemeral port in [QRTR_MIN_EPH_SOCKET, QRTR_MAX_EPH_SOCKET]
|
|
|
|
* <QRTR_MIN_EPH_SOCKET: Specified; requires CAP_NET_ADMIN
|
|
|
|
* >QRTR_MIN_EPH_SOCKET: Specified; available to all
|
|
|
|
*/
|
|
|
|
static int qrtr_port_assign(struct qrtr_sock *ipc, int *port)
|
|
|
|
{
|
|
|
|
int rc;
|
|
|
|
|
|
|
|
if (!*port) {
|
|
|
|
rc = idr_alloc_cyclic(&qrtr_ports, ipc, QRTR_MIN_EPH_SOCKET,
|
|
|
|
QRTR_MAX_EPH_SOCKET + 1, GFP_ATOMIC);
|
|
|
|
if (rc >= 0)
|
|
|
|
*port = rc;
|
|
|
|
} else if (*port < QRTR_MIN_EPH_SOCKET &&
|
|
|
|
!(capable(CAP_NET_ADMIN) ||
|
|
|
|
in_egroup_p(AID_VENDOR_QRTR) ||
|
|
|
|
in_egroup_p(GLOBAL_ROOT_GID))) {
|
|
|
|
rc = -EACCES;
|
|
|
|
} else if (*port == QRTR_PORT_CTRL) {
|
|
|
|
rc = idr_alloc(&qrtr_ports, ipc, 0, 1, GFP_ATOMIC);
|
|
|
|
} else {
|
|
|
|
rc = idr_alloc_cyclic(&qrtr_ports, ipc, *port, *port + 1,
|
|
|
|
GFP_ATOMIC);
|
|
|
|
if (rc >= 0)
|
|
|
|
*port = rc;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (rc == -ENOSPC)
|
|
|
|
return -EADDRINUSE;
|
|
|
|
else if (rc < 0)
|
|
|
|
return rc;
|
|
|
|
|
|
|
|
sock_hold(&ipc->sk);
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Reset all non-control ports */
|
|
|
|
static void qrtr_reset_ports(void)
|
|
|
|
{
|
|
|
|
struct qrtr_sock *ipc;
|
|
|
|
int id;
|
|
|
|
|
|
|
|
idr_for_each_entry(&qrtr_ports, ipc, id) {
|
|
|
|
/* Don't reset control port */
|
|
|
|
if (id == 0)
|
|
|
|
continue;
|
|
|
|
|
|
|
|
sock_hold(&ipc->sk);
|
|
|
|
ipc->sk.sk_err = ENETRESET;
|
|
|
|
if (ipc->sk.sk_error_report)
|
|
|
|
ipc->sk.sk_error_report(&ipc->sk);
|
|
|
|
sock_put(&ipc->sk);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Bind socket to address.
|
|
|
|
*
|
|
|
|
* Socket should be locked upon call.
|
|
|
|
*/
|
|
|
|
static int __qrtr_bind(struct socket *sock,
|
|
|
|
const struct sockaddr_qrtr *addr, int zapped)
|
|
|
|
{
|
|
|
|
struct qrtr_sock *ipc = qrtr_sk(sock->sk);
|
|
|
|
struct sock *sk = sock->sk;
|
|
|
|
int port;
|
|
|
|
int rc;
|
|
|
|
|
|
|
|
/* rebinding ok */
|
|
|
|
if (!zapped && addr->sq_port == ipc->us.sq_port)
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
mutex_lock(&qrtr_port_lock);
|
|
|
|
port = addr->sq_port;
|
|
|
|
rc = qrtr_port_assign(ipc, &port);
|
|
|
|
if (rc) {
|
|
|
|
mutex_unlock(&qrtr_port_lock);
|
|
|
|
return rc;
|
|
|
|
}
|
|
|
|
/* Notify all open ports about the new controller */
|
|
|
|
if (port == QRTR_PORT_CTRL)
|
|
|
|
qrtr_reset_ports();
|
|
|
|
mutex_unlock(&qrtr_port_lock);
|
|
|
|
|
|
|
|
if (port == QRTR_PORT_CTRL) {
|
|
|
|
struct qrtr_node *node;
|
|
|
|
|
|
|
|
down_write(&qrtr_node_lock);
|
|
|
|
list_for_each_entry(node, &qrtr_all_epts, item) {
|
|
|
|
atomic_set(&node->hello_sent, 0);
|
|
|
|
atomic_set(&node->hello_rcvd, 0);
|
|
|
|
}
|
|
|
|
up_write(&qrtr_node_lock);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* unbind previous, if any */
|
|
|
|
if (!zapped)
|
|
|
|
qrtr_port_remove(ipc);
|
|
|
|
ipc->us.sq_port = port;
|
|
|
|
sock_reset_flag(sk, SOCK_ZAPPED);
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Auto bind to an ephemeral port. */
|
|
|
|
static int qrtr_autobind(struct socket *sock)
|
|
|
|
{
|
|
|
|
struct sock *sk = sock->sk;
|
|
|
|
struct sockaddr_qrtr addr;
|
|
|
|
|
|
|
|
if (!sock_flag(sk, SOCK_ZAPPED))
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
addr.sq_family = AF_QIPCRTR;
|
|
|
|
addr.sq_node = qrtr_local_nid;
|
|
|
|
addr.sq_port = 0;
|
|
|
|
|
|
|
|
return __qrtr_bind(sock, &addr, 1);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Bind socket to specified sockaddr. */
|
|
|
|
static int qrtr_bind(struct socket *sock, struct sockaddr *saddr, int len)
|
|
|
|
{
|
|
|
|
DECLARE_SOCKADDR(struct sockaddr_qrtr *, addr, saddr);
|
|
|
|
struct qrtr_sock *ipc = qrtr_sk(sock->sk);
|
|
|
|
struct sock *sk = sock->sk;
|
|
|
|
int rc;
|
|
|
|
|
|
|
|
if (len < sizeof(*addr) || addr->sq_family != AF_QIPCRTR)
|
|
|
|
return -EINVAL;
|
|
|
|
|
|
|
|
if (addr->sq_node != ipc->us.sq_node)
|
|
|
|
return -EINVAL;
|
|
|
|
|
|
|
|
lock_sock(sk);
|
|
|
|
rc = __qrtr_bind(sock, addr, sock_flag(sk, SOCK_ZAPPED));
|
|
|
|
release_sock(sk);
|
|
|
|
|
|
|
|
return rc;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Queue packet to local peer socket. */
|
|
|
|
static int qrtr_local_enqueue(struct qrtr_node *node, struct sk_buff *skb,
|
|
|
|
int type, struct sockaddr_qrtr *from,
|
|
|
|
struct sockaddr_qrtr *to, unsigned int flags)
|
|
|
|
{
|
|
|
|
struct qrtr_sock *ipc;
|
|
|
|
struct qrtr_cb *cb;
|
|
|
|
struct sock *sk = skb->sk;
|
|
|
|
|
|
|
|
ipc = qrtr_port_lookup(to->sq_port);
|
|
|
|
if (!ipc && to->sq_port == QRTR_PORT_CTRL) {
|
|
|
|
kfree_skb(skb);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
if (!ipc || &ipc->sk == skb->sk) { /* do not send to self */
|
|
|
|
kfree_skb(skb);
|
|
|
|
return -ENODEV;
|
|
|
|
}
|
|
|
|
/* Keep resetting NETRESET until socket is closed */
|
|
|
|
if (sk && sk->sk_err == ENETRESET) {
|
|
|
|
sock_hold(sk);
|
|
|
|
sk->sk_err = ENETRESET;
|
|
|
|
if (sk->sk_error_report)
|
|
|
|
sk->sk_error_report(sk);
|
|
|
|
sock_put(sk);
|
|
|
|
kfree_skb(skb);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
cb = (struct qrtr_cb *)skb->cb;
|
|
|
|
cb->src_node = from->sq_node;
|
|
|
|
cb->src_port = from->sq_port;
|
|
|
|
|
|
|
|
if (sock_queue_rcv_skb(&ipc->sk, skb)) {
|
|
|
|
qrtr_port_put(ipc);
|
|
|
|
kfree_skb(skb);
|
|
|
|
return -ENOSPC;
|
|
|
|
}
|
|
|
|
|
|
|
|
qrtr_port_put(ipc);
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Queue packet for broadcast. */
|
|
|
|
static int qrtr_bcast_enqueue(struct qrtr_node *node, struct sk_buff *skb,
|
|
|
|
int type, struct sockaddr_qrtr *from,
|
|
|
|
struct sockaddr_qrtr *to, unsigned int flags)
|
|
|
|
{
|
|
|
|
struct sk_buff *skbn;
|
|
|
|
|
|
|
|
down_read(&qrtr_node_lock);
|
|
|
|
list_for_each_entry(node, &qrtr_all_epts, item) {
|
|
|
|
if (node->nid == QRTR_EP_NID_AUTO && type != QRTR_TYPE_HELLO)
|
|
|
|
continue;
|
|
|
|
skbn = skb_clone(skb, GFP_KERNEL);
|
|
|
|
if (!skbn)
|
|
|
|
break;
|
|
|
|
skb_set_owner_w(skbn, skb->sk);
|
|
|
|
qrtr_node_enqueue(node, skbn, type, from, to, flags);
|
|
|
|
}
|
|
|
|
up_read(&qrtr_node_lock);
|
|
|
|
|
Merge android-4.14-stable.190 (d2d05bc) into msm-4.14
* refs/heads/tmp-d2d05bc:
Linux 4.14.190
ath9k: Fix regression with Atheros 9271
ath9k: Fix general protection fault in ath9k_hif_usb_rx_cb
parisc: Add atomic64_set_release() define to avoid CPU soft lockups
io-mapping: indicate mapping failure
mm/memcg: fix refcount error while moving and swapping
Makefile: Fix GCC_TOOLCHAIN_DIR prefix for Clang cross compilation
vt: Reject zero-sized screen buffer size.
fbdev: Detect integer underflow at "struct fbcon_ops"->clear_margins.
serial: 8250_mtk: Fix high-speed baud rates clamping
serial: 8250: fix null-ptr-deref in serial8250_start_tx()
staging: comedi: addi_apci_1564: check INSN_CONFIG_DIGITAL_TRIG shift
staging: comedi: addi_apci_1500: check INSN_CONFIG_DIGITAL_TRIG shift
staging: comedi: ni_6527: fix INSN_CONFIG_DIGITAL_TRIG support
staging: comedi: addi_apci_1032: check INSN_CONFIG_DIGITAL_TRIG shift
staging: wlan-ng: properly check endpoint types
Revert "cifs: Fix the target file was deleted when rename failed."
usb: xhci: Fix ASM2142/ASM3142 DMA addressing
usb: xhci-mtk: fix the failure of bandwidth allocation
binder: Don't use mmput() from shrinker function.
x86: math-emu: Fix up 'cmp' insn for clang ias
arm64: Use test_tsk_thread_flag() for checking TIF_SINGLESTEP
usb: gadget: udc: gr_udc: fix memleak on error handling path in gr_ep_init()
Input: synaptics - enable InterTouch for ThinkPad X1E 1st gen
dmaengine: ioat setting ioat timeout as module parameter
hwmon: (aspeed-pwm-tacho) Avoid possible buffer overflow
regmap: dev_get_regmap_match(): fix string comparison
spi: mediatek: use correct SPI_CFG2_REG MACRO
Input: add `SW_MACHINE_COVER`
dmaengine: tegra210-adma: Fix runtime PM imbalance on error
HID: apple: Disable Fn-key key-re-mapping on clone keyboards
HID: i2c-hid: add Mediacom FlexBook edge13 to descriptor override
scripts/decode_stacktrace: strip basepath from all paths
serial: exar: Fix GPIO configuration for Sealevel cards based on XR17V35X
bonding: check return value of register_netdevice() in bond_newlink()
i2c: rcar: always clear ICSAR to avoid side effects
ipvs: fix the connection sync failed in some cases
mlxsw: destroy workqueue when trap_register in mlxsw_emad_init
bonding: check error value of register_netdevice() immediately
net: smc91x: Fix possible memory leak in smc_drv_probe()
drm: sun4i: hdmi: Fix inverted HPD result
net: dp83640: fix SIOCSHWTSTAMP to update the struct with actual configuration
ax88172a: fix ax88172a_unbind() failures
hippi: Fix a size used in a 'pci_free_consistent()' in an error handling path
bnxt_en: Fix race when modifying pause settings.
btrfs: fix page leaks after failure to lock page for delalloc
btrfs: fix mount failure caused by race with umount
btrfs: fix double free on ulist after backref resolution failure
ASoC: rt5670: Correct RT5670_LDO_SEL_MASK
ALSA: info: Drop WARN_ON() from buffer NULL sanity check
uprobes: Change handle_swbp() to send SIGTRAP with si_code=SI_KERNEL, to fix GDB regression
IB/umem: fix reference count leak in ib_umem_odp_get()
spi: spi-fsl-dspi: Exit the ISR with IRQ_NONE when it's not ours
SUNRPC reverting d03727b248d0 ("NFSv4 fix CLOSE not waiting for direct IO compeletion")
irqdomain/treewide: Keep firmware node unconditionally allocated
drm/nouveau/i2c/g94-: increase NV_PMGR_DP_AUXCTL_TRANSACTREQ timeout
net: sky2: initialize return of gm_phy_read
drivers/net/wan/lapbether: Fixed the value of hard_header_len
xtensa: update *pos in cpuinfo_op.next
xtensa: fix __sync_fetch_and_{and,or}_4 declarations
scsi: scsi_transport_spi: Fix function pointer check
mac80211: allow rx of mesh eapol frames with default rx key
pinctrl: amd: fix npins for uart0 in kerncz_groups
gpio: arizona: put pm_runtime in case of failure
gpio: arizona: handle pm_runtime_get_sync failure case
ANDROID: Incremental fs: magic number compatible 32-bit
ANDROID: kbuild: don't merge .*..compoundliteral in modules
Revert "arm64/alternatives: use subsections for replacement sequences"
Linux 4.14.189
rxrpc: Fix trace string
libceph: don't omit recovery_deletes in target_copy()
x86/cpu: Move x86_cache_bits settings
sched/fair: handle case of task_h_load() returning 0
arm64: ptrace: Override SPSR.SS when single-stepping is enabled
thermal/drivers/cpufreq_cooling: Fix wrong frequency converted from power
misc: atmel-ssc: lock with mutex instead of spinlock
dmaengine: fsl-edma: Fix NULL pointer exception in fsl_edma_tx_handler
intel_th: pci: Add Emmitsburg PCH support
intel_th: pci: Add Tiger Lake PCH-H support
intel_th: pci: Add Jasper Lake CPU support
hwmon: (emc2103) fix unable to change fan pwm1_enable attribute
MIPS: Fix build for LTS kernel caused by backporting lpj adjustment
timer: Fix wheel index calculation on last level
uio_pdrv_genirq: fix use without device tree and no interrupt
Input: i8042 - add Lenovo XiaoXin Air 12 to i8042 nomux list
mei: bus: don't clean driver pointer
Revert "zram: convert remaining CLASS_ATTR() to CLASS_ATTR_RO()"
fuse: Fix parameter for FS_IOC_{GET,SET}FLAGS
virtio: virtio_console: add missing MODULE_DEVICE_TABLE() for rproc serial
USB: serial: option: add Quectel EG95 LTE modem
USB: serial: option: add GosunCn GM500 series
USB: serial: ch341: add new Product ID for CH340
USB: serial: cypress_m8: enable Simply Automated UPB PIM
USB: serial: iuu_phoenix: fix memory corruption
usb: gadget: function: fix missing spinlock in f_uac1_legacy
usb: chipidea: core: add wakeup support for extcon
usb: dwc2: Fix shutdown callback in platform
USB: c67x00: fix use after free in c67x00_giveback_urb
ALSA: usb-audio: Fix race against the error recovery URB submission
ALSA: line6: Perform sanity check for each URB creation
HID: magicmouse: do not set up autorepeat
mtd: rawnand: oxnas: Release all devices in the _remove() path
mtd: rawnand: oxnas: Unregister all devices on error
mtd: rawnand: oxnas: Keep track of registered devices
mtd: rawnand: brcmnand: fix CS0 layout
perf stat: Zero all the 'ena' and 'run' array slot stats for interval mode
copy_xstate_to_kernel: Fix typo which caused GDB regression
ARM: dts: socfpga: Align L2 cache-controller nodename with dtschema
Revert "thermal: mediatek: fix register index error"
staging: comedi: verify array index is correct before using it
usb: gadget: udc: atmel: fix uninitialized read in debug printk
spi: spi-sun6i: sun6i_spi_transfer_one(): fix setting of clock rate
arm64: dts: meson: add missing gxl rng clock
phy: sun4i-usb: fix dereference of pointer phy0 before it is null checked
iio:health:afe4404 Fix timestamp alignment and prevent data leak.
ACPI: video: Use native backlight on Acer TravelMate 5735Z
ACPI: video: Use native backlight on Acer Aspire 5783z
mmc: sdhci: do not enable card detect interrupt for gpio cd type
doc: dt: bindings: usb: dwc3: Update entries for disabling SS instances in park mode
Revert "usb/xhci-plat: Set PM runtime as active on resume"
Revert "usb/ehci-platform: Set PM runtime as active on resume"
Revert "usb/ohci-platform: Fix a warning when hibernating"
of: of_mdio: Correct loop scanning logic
net: dsa: bcm_sf2: Fix node reference count
spi: fix initial SPI_SR value in spi-fsl-dspi
spi: spi-fsl-dspi: Fix lockup if device is shutdown during SPI transfer
iio:health:afe4403 Fix timestamp alignment and prevent data leak.
iio:pressure:ms5611 Fix buffer element alignment
iio: pressure: zpa2326: handle pm_runtime_get_sync failure
iio: mma8452: Add missed iio_device_unregister() call in mma8452_probe()
iio: magnetometer: ak8974: Fix runtime PM imbalance on error
iio:humidity:hdc100x Fix alignment and data leak issues
iio:magnetometer:ak8974: Fix alignment and data leak issues
arm64/alternatives: don't patch up internal branches
arm64: alternative: Use true and false for boolean values
i2c: eg20t: Load module automatically if ID matches
gfs2: read-only mounts should grab the sd_freeze_gl glock
tpm_tis: extra chip->ops check on error path in tpm_tis_core_init
arm64/alternatives: use subsections for replacement sequences
drm/exynos: fix ref count leak in mic_pre_enable
cgroup: Fix sock_cgroup_data on big-endian.
cgroup: fix cgroup_sk_alloc() for sk_clone_lock()
tcp: md5: do not send silly options in SYNCOOKIES
tcp: make sure listeners don't initialize congestion-control state
net_sched: fix a memory leak in atm_tc_init()
tcp: md5: allow changing MD5 keys in all socket states
tcp: md5: refine tcp_md5_do_add()/tcp_md5_hash_key() barriers
tcp: md5: add missing memory barriers in tcp_md5_do_add()/tcp_md5_hash_key()
net: usb: qmi_wwan: add support for Quectel EG95 LTE modem
net: Added pointer check for dst->ops->neigh_lookup in dst_neigh_lookup_skb
llc: make sure applications use ARPHRD_ETHER
l2tp: remove skb_dst_set() from l2tp_xmit_skb()
ipv4: fill fl4_icmp_{type,code} in ping_v4_sendmsg
genetlink: remove genl_bind
s390/mm: fix huge pte soft dirty copying
ARC: elf: use right ELF_ARCH
ARC: entry: fix potential EFA clobber when TIF_SYSCALL_TRACE
dm: use noio when sending kobject event
drm/radeon: fix double free
btrfs: fix fatal extent_buffer readahead vs releasepage race
Revert "ath9k: Fix general protection fault in ath9k_hif_usb_rx_cb"
KVM: x86: Mark CR4.TSD as being possibly owned by the guest
KVM: x86: Inject #GP if guest attempts to toggle CR4.LA57 in 64-bit mode
KVM: x86: bit 8 of non-leaf PDPEs is not reserved
KVM: arm64: Stop clobbering x0 for HVC_SOFT_RESTART
KVM: arm64: Fix definition of PAGE_HYP_DEVICE
ALSA: usb-audio: add quirk for MacroSilicon MS2109
ALSA: hda - let hs_mic be picked ahead of hp_mic
ALSA: opl3: fix infoleak in opl3
mlxsw: spectrum_router: Remove inappropriate usage of WARN_ON()
net: macb: mark device wake capable when "magic-packet" property present
bnxt_en: fix NULL dereference in case SR-IOV configuration fails
nbd: Fix memory leak in nbd_add_socket
arm64: kgdb: Fix single-step exception handling oops
ALSA: compress: fix partial_drain completion state
smsc95xx: avoid memory leak in smsc95xx_bind
smsc95xx: check return value of smsc95xx_reset
net: cxgb4: fix return error value in t4_prep_fw
x86/entry: Increase entry_stack size to a full page
nvme-rdma: assign completion vector correctly
scsi: mptscsih: Fix read sense data size
ARM: imx6: add missing put_device() call in imx6q_suspend_init()
cifs: update ctime and mtime during truncate
s390/kasan: fix early pgm check handler execution
ixgbe: protect ring accesses with READ- and WRITE_ONCE
spi: spidev: fix a potential use-after-free in spidev_release()
spi: spidev: fix a race between spidev_release and spidev_remove
gpu: host1x: Detach driver on unregister
ARM: dts: omap4-droid4: Fix spi configuration and increase rate
spi: spi-fsl-dspi: Fix external abort on interrupt in resume or exit paths
spi: spi-fsl-dspi: use IRQF_SHARED mode to request IRQ
spi: spi-fsl-dspi: Fix lockup if device is removed during SPI transfer
spi: spi-fsl-dspi: Adding shutdown hook
KVM: s390: reduce number of IO pins to 1
UPSTREAM: perf/core: Fix crash when using HW tracing kernel filters
ANDROID: fscrypt: fix DUN contiguity with inline encryption + IV_INO_LBLK_32 policies
ANDROID: f2fs: add back compress inode check
Linux 4.14.188
efi: Make it possible to disable efivar_ssdt entirely
dm zoned: assign max_io_len correctly
irqchip/gic: Atomically update affinity
MIPS: Add missing EHB in mtc0 -> mfc0 sequence for DSPen
cifs: Fix the target file was deleted when rename failed.
SMB3: Honor persistent/resilient handle flags for multiuser mounts
SMB3: Honor 'seal' flag for multiuser mounts
Revert "ALSA: usb-audio: Improve frames size computation"
nfsd: apply umask on fs without ACL support
i2c: algo-pca: Add 0x78 as SCL stuck low status for PCA9665
virtio-blk: free vblk-vqs in error path of virtblk_probe()
drm: sun4i: hdmi: Remove extra HPD polling
hwmon: (acpi_power_meter) Fix potential memory leak in acpi_power_meter_add()
hwmon: (max6697) Make sure the OVERT mask is set correctly
cxgb4: parse TC-U32 key values and masks natively
cxgb4: use unaligned conversion for fetching timestamp
crypto: af_alg - fix use-after-free in af_alg_accept() due to bh_lock_sock()
kgdb: Avoid suspicious RCU usage warning
usb: usbtest: fix missing kfree(dev->buf) in usbtest_disconnect
mm/slub: fix stack overruns with SLUB_STATS
mm/slub.c: fix corrupted freechain in deactivate_slab()
usbnet: smsc95xx: Fix use-after-free after removal
EDAC/amd64: Read back the scrub rate PCI register on F15h
mm: fix swap cache node allocation mask
btrfs: fix data block group relocation failure due to concurrent scrub
btrfs: cow_file_range() num_bytes and disk_num_bytes are same
btrfs: fix a block group ref counter leak after failure to remove block group
UPSTREAM: binder: fix null deref of proc->context
ANDROID: GKI: scripts: Makefile: update the lz4 command (#2)
Linux 4.14.187
Revert "tty: hvc: Fix data abort due to race in hvc_open"
xfs: add agf freeblocks verify in xfs_agf_verify
NFSv4 fix CLOSE not waiting for direct IO compeletion
pNFS/flexfiles: Fix list corruption if the mirror count changes
SUNRPC: Properly set the @subbuf parameter of xdr_buf_subsegment()
sunrpc: fixed rollback in rpc_gssd_dummy_populate()
Staging: rtl8723bs: prevent buffer overflow in update_sta_support_rate()
drm/radeon: fix fb_div check in ni_init_smc_spll_table()
tracing: Fix event trigger to accept redundant spaces
arm64: perf: Report the PC value in REGS_ABI_32 mode
ocfs2: fix panic on nfs server over ocfs2
ocfs2: fix value of OCFS2_INVALID_SLOT
ocfs2: load global_inode_alloc
mm/slab: use memzero_explicit() in kzfree()
btrfs: fix failure of RWF_NOWAIT write into prealloc extent beyond eof
KVM: nVMX: Plumb L2 GPA through to PML emulation
KVM: X86: Fix MSR range of APIC registers in X2APIC mode
ACPI: sysfs: Fix pm_profile_attr type
ALSA: hda: Add NVIDIA codec IDs 9a & 9d through a0 to patch table
blktrace: break out of blktrace setup on concurrent calls
kbuild: improve cc-option to clean up all temporary files
s390/ptrace: fix setting syscall number
net: alx: fix race condition in alx_remove
ata/libata: Fix usage of page address by page_address in ata_scsi_mode_select_xlat function
sched/core: Fix PI boosting between RT and DEADLINE tasks
net: bcmgenet: use hardware padding of runt frames
netfilter: ipset: fix unaligned atomic access
usb: gadget: udc: Potential Oops in error handling code
ARM: imx5: add missing put_device() call in imx_suspend_alloc_ocram()
net: qed: fix excessive QM ILT lines consumption
net: qed: fix NVMe login fails over VFs
net: qed: fix left elements count calculation
RDMA/mad: Fix possible memory leak in ib_mad_post_receive_mads()
ASoC: rockchip: Fix a reference count leak.
RDMA/cma: Protect bind_list and listen_list while finding matching cm id
rxrpc: Fix handling of rwind from an ACK packet
ARM: dts: NSP: Correct FA2 mailbox node
efi/esrt: Fix reference count leak in esre_create_sysfs_entry.
cifs/smb3: Fix data inconsistent when zero file range
cifs/smb3: Fix data inconsistent when punch hole
xhci: Poll for U0 after disabling USB2 LPM
ALSA: usb-audio: Fix OOB access of mixer element list
ALSA: usb-audio: Clean up mixer element list traverse
ALSA: usb-audio: uac1: Invalidate ctl on interrupt
loop: replace kill_bdev with invalidate_bdev
cdc-acm: Add DISABLE_ECHO quirk for Microchip/SMSC chip
xhci: Fix enumeration issue when setting max packet size for FS devices.
xhci: Fix incorrect EP_STATE_MASK
ALSA: usb-audio: add quirk for Denon DCD-1500RE
usb: host: ehci-exynos: Fix error check in exynos_ehci_probe()
usb: host: xhci-mtk: avoid runtime suspend when removing hcd
USB: ehci: reopen solution for Synopsys HC bug
usb: add USB_QUIRK_DELAY_INIT for Logitech C922
usb: dwc2: Postponed gadget registration to the udc class driver
USB: ohci-sm501: Add missed iounmap() in remove
net: core: reduce recursion limit value
net: Do not clear the sock TX queue in sk_set_socket()
net: Fix the arp error in some cases
ip6_gre: fix use-after-free in ip6gre_tunnel_lookup()
tcp_cubic: fix spurious HYSTART_DELAY exit upon drop in min RTT
ip_tunnel: fix use-after-free in ip_tunnel_lookup()
tg3: driver sleeps indefinitely when EEH errors exceed eeh_max_freezes
tcp: grow window for OOO packets only for SACK flows
sctp: Don't advertise IPv4 addresses if ipv6only is set on the socket
rxrpc: Fix notification call on completion of discarded calls
rocker: fix incorrect error handling in dma_rings_init
net: usb: ax88179_178a: fix packet alignment padding
net: fix memleak in register_netdevice()
net: bridge: enfore alignment for ethernet address
mld: fix memory leak in ipv6_mc_destroy_dev()
ibmveth: Fix max MTU limit
apparmor: don't try to replace stale label in ptraceme check
fix a braino in "sparc32: fix register window handling in genregs32_[gs]et()"
net: sched: export __netdev_watchdog_up()
block/bio-integrity: don't free 'buf' if bio_integrity_add_page() failed
net: be more gentle about silly gso requests coming from user
scsi: scsi_devinfo: handle non-terminated strings
ANDROID: Makefile: append BUILD_NUMBER to version string when defined
Linux 4.14.186
KVM: x86/mmu: Set mmio_value to '0' if reserved #PF can't be generated
kvm: x86: Fix reserved bits related calculation errors caused by MKTME
kvm: x86: Move kvm_set_mmio_spte_mask() from x86.c to mmu.c
md: add feature flag MD_FEATURE_RAID0_LAYOUT
net: core: device_rename: Use rwsem instead of a seqcount
sched/rt, net: Use CONFIG_PREEMPTION.patch
kretprobe: Prevent triggering kretprobe from within kprobe_flush_task
e1000e: Do not wake up the system via WOL if device wakeup is disabled
kprobes: Fix to protect kick_kprobe_optimizer() by kprobe_mutex
crypto: algboss - don't wait during notifier callback
crypto: algif_skcipher - Cap recv SG list at ctx->used
mtd: rawnand: tmio: Fix the probe error path
mtd: rawnand: mtk: Fix the probe error path
mtd: rawnand: plat_nand: Fix the probe error path
mtd: rawnand: socrates: Fix the probe error path
mtd: rawnand: oxnas: Fix the probe error path
mtd: rawnand: oxnas: Add of_node_put()
mtd: rawnand: orion: Fix the probe error path
mtd: rawnand: xway: Fix the probe error path
mtd: rawnand: sharpsl: Fix the probe error path
mtd: rawnand: diskonchip: Fix the probe error path
mtd: rawnand: Pass a nand_chip object to nand_release()
block: nr_sects_write(): Disable preemption on seqcount write
x86/boot/compressed: Relax sed symbol type regex for LLVM ld.lld
drm/dp_mst: Increase ACT retry timeout to 3s
ext4: fix partial cluster initialization when splitting extent
selinux: fix double free
drm/qxl: Use correct notify port address when creating cursor ring
drm/dp_mst: Reformat drm_dp_check_act_status() a bit
drm: encoder_slave: fix refcouting error for modules
libata: Use per port sync for detach
arm64: hw_breakpoint: Don't invoke overflow handler on uaccess watchpoints
block: Fix use-after-free in blkdev_get()
bcache: fix potential deadlock problem in btree_gc_coalesce
perf report: Fix NULL pointer dereference in hists__fprintf_nr_sample_events()
usb/ehci-platform: Set PM runtime as active on resume
usb/xhci-plat: Set PM runtime as active on resume
scsi: acornscsi: Fix an error handling path in acornscsi_probe()
drm/sun4i: hdmi ddc clk: Fix size of m divider
selftests/net: in timestamping, strncpy needs to preserve null byte
gfs2: fix use-after-free on transaction ail lists
blktrace: fix endianness for blk_log_remap()
blktrace: fix endianness in get_pdu_int()
blktrace: use errno instead of bi_status
selftests/vm/pkeys: fix alloc_random_pkey() to make it really random
elfnote: mark all .note sections SHF_ALLOC
include/linux/bitops.h: avoid clang shift-count-overflow warnings
lib/zlib: remove outdated and incorrect pre-increment optimization
geneve: change from tx_error to tx_dropped on missing metadata
crypto: omap-sham - add proper load balancing support for multicore
pinctrl: freescale: imx: Fix an error handling path in 'imx_pinctrl_probe()'
pinctrl: imxl: Fix an error handling path in 'imx1_pinctrl_core_probe()'
scsi: ufs: Don't update urgent bkops level when toggling auto bkops
scsi: iscsi: Fix reference count leak in iscsi_boot_create_kobj
gfs2: Allow lock_nolock mount to specify jid=X
openrisc: Fix issue with argument clobbering for clone/fork
vfio/mdev: Fix reference count leak in add_mdev_supported_type
ASoC: fsl_asrc_dma: Fix dma_chan leak when config DMA channel failed
extcon: adc-jack: Fix an error handling path in 'adc_jack_probe()'
powerpc/4xx: Don't unmap NULL mbase
NFSv4.1 fix rpc_call_done assignment for BIND_CONN_TO_SESSION
net: sunrpc: Fix off-by-one issues in 'rpc_ntop6'
scsi: ufs-qcom: Fix scheduling while atomic issue
clk: bcm2835: Fix return type of bcm2835_register_gate
x86/apic: Make TSC deadline timer detection message visible
usb: gadget: Fix issue with config_ep_by_speed function
usb: gadget: fix potential double-free in m66592_probe.
usb: gadget: lpc32xx_udc: don't dereference ep pointer before null check
USB: gadget: udc: s3c2410_udc: Remove pointless NULL check in s3c2410_udc_nuke
usb: dwc2: gadget: move gadget resume after the core is in L0 state
watchdog: da9062: No need to ping manually before setting timeout
IB/cma: Fix ports memory leak in cma_configfs
PCI/PTM: Inherit Switch Downstream Port PTM settings from Upstream Port
dm zoned: return NULL if dmz_get_zone_for_reclaim() fails to find a zone
powerpc/64s/pgtable: fix an undefined behaviour
clk: samsung: exynos5433: Add IGNORE_UNUSED flag to sclk_i2s1
tty: n_gsm: Fix bogus i++ in gsm_data_kick
USB: host: ehci-mxc: Add error handling in ehci_mxc_drv_probe()
drm/msm/mdp5: Fix mdp5_init error path for failed mdp5_kms allocation
usb/ohci-platform: Fix a warning when hibernating
vfio-pci: Mask cap zero
powerpc/ps3: Fix kexec shutdown hang
powerpc/pseries/ras: Fix FWNMI_VALID off by one
tty: n_gsm: Fix waking up upper tty layer when room available
tty: n_gsm: Fix SOF skipping
PCI: Fix pci_register_host_bridge() device_register() error handling
clk: ti: composite: fix memory leak
dlm: remove BUG() before panic()
scsi: mpt3sas: Fix double free warnings
power: supply: smb347-charger: IRQSTAT_D is volatile
power: supply: lp8788: Fix an error handling path in 'lp8788_charger_probe()'
scsi: qla2xxx: Fix warning after FC target reset
PCI/ASPM: Allow ASPM on links to PCIe-to-PCI/PCI-X Bridges
PCI: rcar: Fix incorrect programming of OB windows
drivers: base: Fix NULL pointer exception in __platform_driver_probe() if a driver developer is foolish
serial: amba-pl011: Make sure we initialize the port.lock spinlock
i2c: pxa: fix i2c_pxa_scream_blue_murder() debug output
staging: sm750fb: add missing case while setting FB_VISUAL
thermal/drivers/ti-soc-thermal: Avoid dereferencing ERR_PTR
tty: hvc: Fix data abort due to race in hvc_open
s390/qdio: put thinint indicator after early error
ALSA: usb-audio: Improve frames size computation
scsi: qedi: Do not flush offload work if ARP not resolved
staging: greybus: fix a missing-check bug in gb_lights_light_config()
scsi: ibmvscsi: Don't send host info in adapter info MAD after LPM
scsi: sr: Fix sr_probe() missing deallocate of device minor
apparmor: fix introspection of of task mode for unconfined tasks
mksysmap: Fix the mismatch of '.L' symbols in System.map
NTB: Fix the default port and peer numbers for legacy drivers
yam: fix possible memory leak in yam_init_driver
powerpc/crashkernel: Take "mem=" option into account
nfsd: Fix svc_xprt refcnt leak when setup callback client failed
powerpc/perf/hv-24x7: Fix inconsistent output values incase multiple hv-24x7 events run
clk: clk-flexgen: fix clock-critical handling
scsi: lpfc: Fix lpfc_nodelist leak when processing unsolicited event
mfd: wm8994: Fix driver operation if loaded as modules
m68k/PCI: Fix a memory leak in an error handling path
vfio/pci: fix memory leaks in alloc_perm_bits()
ps3disk: use the default segment boundary
PCI: aardvark: Don't blindly enable ASPM L0s and don't write to read-only register
dm mpath: switch paths in dm_blk_ioctl() code path
usblp: poison URBs upon disconnect
i2c: pxa: clear all master action bits in i2c_pxa_stop_message()
f2fs: report delalloc reserve as non-free in statfs for project quota
iio: bmp280: fix compensation of humidity
scsi: qla2xxx: Fix issue with adapter's stopping state
ALSA: isa/wavefront: prevent out of bounds write in ioctl
scsi: qedi: Check for buffer overflow in qedi_set_path()
ARM: integrator: Add some Kconfig selections
ASoC: davinci-mcasp: Fix dma_chan refcnt leak when getting dma type
backlight: lp855x: Ensure regulators are disabled on probe failure
clk: qcom: msm8916: Fix the address location of pll->config_reg
remoteproc: Fix IDR initialisation in rproc_alloc()
iio: pressure: bmp280: Tolerate IRQ before registering
i2c: piix4: Detect secondary SMBus controller on AMD AM4 chipsets
clk: sunxi: Fix incorrect usage of round_down()
power: supply: bq24257_charger: Replace depends on REGMAP_I2C with select
drm/i915: Whitelist context-local timestamp in the gen9 cmdparser
s390: fix syscall_get_error for compat processes
ANDROID: ext4: Optimize match for casefolded encrypted dirs
ANDROID: ext4: Handle casefolding with encryption
ANDROID: cuttlefish_defconfig: x86: Enable KERNEL_LZ4
ANDROID: GKI: scripts: Makefile: update the lz4 command
FROMLIST: f2fs: fix use-after-free when accessing bio->bi_crypt_context
Linux 4.14.185
perf symbols: Fix debuginfo search for Ubuntu
perf probe: Fix to check blacklist address correctly
perf probe: Do not show the skipped events
w1: omap-hdq: cleanup to add missing newline for some dev_dbg
mtd: rawnand: pasemi: Fix the probe error path
mtd: rawnand: brcmnand: fix hamming oob layout
sunrpc: clean up properly in gss_mech_unregister()
sunrpc: svcauth_gss_register_pseudoflavor must reject duplicate registrations.
kbuild: force to build vmlinux if CONFIG_MODVERSION=y
powerpc/64s: Save FSCR to init_task.thread.fscr after feature init
powerpc/64s: Don't let DT CPU features set FSCR_DSCR
drivers/macintosh: Fix memleak in windfarm_pm112 driver
ARM: tegra: Correct PL310 Auxiliary Control Register initialization
kernel/cpu_pm: Fix uninitted local in cpu_pm
dm crypt: avoid truncating the logical block size
sparc64: fix misuses of access_process_vm() in genregs32_[sg]et()
sparc32: fix register window handling in genregs32_[gs]et()
pinctrl: samsung: Save/restore eint_mask over suspend for EINT_TYPE GPIOs
power: vexpress: add suppress_bind_attrs to true
igb: Report speed and duplex as unknown when device is runtime suspended
media: ov5640: fix use of destroyed mutex
b43_legacy: Fix connection problem with WPA3
b43: Fix connection problem with WPA3
b43legacy: Fix case where channel status is corrupted
media: go7007: fix a miss of snd_card_free
carl9170: remove P2P_GO support
e1000e: Relax condition to trigger reset for ME workaround
e1000e: Disable TSO for buffer overrun workaround
PCI: Program MPS for RCiEP devices
blk-mq: move _blk_mq_update_nr_hw_queues synchronize_rcu call
btrfs: fix wrong file range cleanup after an error filling dealloc range
btrfs: fix error handling when submitting direct I/O bio
PCI: Unify ACS quirk desired vs provided checking
PCI: Add ACS quirk for Intel Root Complex Integrated Endpoints
PCI: Generalize multi-function power dependency device links
vga_switcheroo: Use device link for HDA controller
vga_switcheroo: Deduplicate power state tracking
PCI: Make ACS quirk implementations more uniform
PCI: Add ACS quirk for Ampere root ports
PCI: Add ACS quirk for iProc PAXB
PCI: Avoid FLR for AMD Starship USB 3.0
PCI: Avoid FLR for AMD Matisse HD Audio & USB 3.0
PCI: Disable MSI for Freescale Layerscape PCIe RC mode
ext4: fix race between ext4_sync_parent() and rename()
ext4: fix error pointer dereference
ext4: fix EXT_MAX_EXTENT/INDEX to check for zeroed eh_max
evm: Fix possible memory leak in evm_calc_hmac_or_hash()
ima: Directly assign the ima_default_policy pointer to ima_rules
ima: Fix ima digest hash table key calculation
mm: thp: make the THP mapcount atomic against __split_huge_pmd_locked()
btrfs: send: emit file capabilities after chown
string.h: fix incompatibility between FORTIFY_SOURCE and KASAN
platform/x86: hp-wmi: Convert simple_strtoul() to kstrtou32()
cpuidle: Fix three reference count leaks
spi: dw: Return any value retrieved from the dma_transfer callback
mmc: sdhci-esdhc-imx: fix the mask for tuning start point
ixgbe: fix signed-integer-overflow warning
mmc: via-sdmmc: Respect the cmd->busy_timeout from the mmc core
staging: greybus: sdio: Respect the cmd->busy_timeout from the mmc core
mmc: sdhci-msm: Set SDHCI_QUIRK_MULTIBLOCK_READ_ACMD12 quirk
MIPS: Fix IRQ tracing when call handle_fpe() and handle_msa_fpe()
PCI: Don't disable decoding when mmio_always_on is set
macvlan: Skip loopback packets in RX handler
m68k: mac: Don't call via_flush_cache() on Mac IIfx
x86/mm: Stop printing BRK addresses
mips: Add udelay lpj numbers adjustment
mips: MAAR: Use more precise address mask
x86/boot: Correct relocation destination on old linkers
mwifiex: Fix memory corruption in dump_station
rtlwifi: Fix a double free in _rtl_usb_tx_urb_setup()
md: don't flush workqueue unconditionally in md_open
net: qed*: Reduce RX and TX default ring count when running inside kdump kernel
wcn36xx: Fix error handling path in 'wcn36xx_probe()'
nvme: refine the Qemu Identify CNS quirk
kgdb: Fix spurious true from in_dbg_master()
mips: cm: Fix an invalid error code of INTVN_*_ERR
MIPS: Truncate link address into 32bit for 32bit kernel
Crypto/chcr: fix for ccm(aes) failed test
powerpc/spufs: fix copy_to_user while atomic
net: allwinner: Fix use correct return type for ndo_start_xmit()
media: cec: silence shift wrapping warning in __cec_s_log_addrs()
net: lpc-enet: fix error return code in lpc_mii_init()
exit: Move preemption fixup up, move blocking operations down
lib/mpi: Fix 64-bit MIPS build with Clang
net: bcmgenet: set Rx mode before starting netif
netfilter: nft_nat: return EOPNOTSUPP if type or flags are not supported
audit: fix a net reference leak in audit_list_rules_send()
MIPS: Make sparse_init() using top-down allocation
media: platform: fcp: Set appropriate DMA parameters
media: dvb: return -EREMOTEIO on i2c transfer failure.
audit: fix a net reference leak in audit_send_reply()
dt-bindings: display: mediatek: control dpi pins mode to avoid leakage
e1000: Distribute switch variables for initialization
tools api fs: Make xxx__mountpoint() more scalable
brcmfmac: fix wrong location to get firmware feature
staging: android: ion: use vmap instead of vm_map_ram
net: vmxnet3: fix possible buffer overflow caused by bad DMA value in vmxnet3_get_rss()
x86/kvm/hyper-v: Explicitly align hcall param for kvm_hyperv_exit
spi: dw: Fix Rx-only DMA transfers
ARM: 8978/1: mm: make act_mm() respect THREAD_SIZE
btrfs: do not ignore error from btrfs_next_leaf() when inserting checksums
clocksource: dw_apb_timer_of: Fix missing clockevent timers
clocksource: dw_apb_timer: Make CPU-affiliation being optional
spi: dw: Enable interrupts in accordance with DMA xfer mode
kgdb: Prevent infinite recursive entries to the debugger
Bluetooth: Add SCO fallback for invalid LMP parameters error
MIPS: Loongson: Build ATI Radeon GPU driver as module
ixgbe: Fix XDP redirect on archs with PAGE_SIZE above 4K
spi: dw: Zero DMA Tx and Rx configurations on stack
net: ena: fix error returning in ena_com_get_hash_function()
spi: pxa2xx: Apply CS clk quirk to BXT
objtool: Ignore empty alternatives
media: si2157: Better check for running tuner in init
crypto: ccp -- don't "select" CONFIG_DMADEVICES
drm: bridge: adv7511: Extend list of audio sample rates
ACPI: GED: use correct trigger type field in _Exx / _Lxx handling
xen/pvcalls-back: test for errors when calling backend_connect()
can: kvaser_usb: kvaser_usb_leaf: Fix some info-leaks to USB devices
mmc: sdio: Fix potential NULL pointer error in mmc_sdio_init_card()
mmc: sdhci-msm: Clear tuning done flag while hs400 tuning
agp/intel: Reinforce the barrier after GTT updates
perf: Add cond_resched() to task_function_call()
fat: don't allow to mount if the FAT length == 0
mm/slub: fix a memory leak in sysfs_slab_add()
Smack: slab-out-of-bounds in vsscanf
ath9k: Fix general protection fault in ath9k_hif_usb_rx_cb
ath9x: Fix stack-out-of-bounds Write in ath9k_hif_usb_rx_cb
ath9k: Fix use-after-free Write in ath9k_htc_rx_msg
ath9k: Fix use-after-free Read in ath9k_wmi_ctrl_rx
KVM: arm64: Make vcpu_cp1x() work on Big Endian hosts
KVM: MIPS: Fix VPN2_MASK definition for variable cpu_vmbits
KVM: MIPS: Define KVM_ENTRYHI_ASID to cpu_asid_mask(&boot_cpu_data)
KVM: nVMX: Consult only the "basic" exit reason when routing nested exit
KVM: nSVM: leave ASID aside in copy_vmcb_control_area
KVM: nSVM: fix condition for filtering async PF
video: fbdev: w100fb: Fix a potential double free.
proc: Use new_inode not new_inode_pseudo
ovl: initialize error in ovl_copy_xattr
selftests/net: in rxtimestamp getopt_long needs terminating null entry
crypto: virtio: Fix dest length calculation in __virtio_crypto_skcipher_do_req()
crypto: virtio: Fix src/dst scatterlist calculation in __virtio_crypto_skcipher_do_req()
crypto: virtio: Fix use-after-free in virtio_crypto_skcipher_finalize_req()
spi: bcm2835: Fix controller unregister order
spi: pxa2xx: Fix controller unregister order
spi: Fix controller unregister order
spi: No need to assign dummy value in spi_unregister_controller()
spi: dw: Fix controller unregister order
spi: dw: fix possible race condition
x86/speculation: PR_SPEC_FORCE_DISABLE enforcement for indirect branches.
x86/speculation: Avoid force-disabling IBPB based on STIBP and enhanced IBRS.
x86/speculation: Add support for STIBP always-on preferred mode
x86/speculation: Change misspelled STIPB to STIBP
KVM: x86: only do L1TF workaround on affected processors
KVM: x86/mmu: Consolidate "is MMIO SPTE" code
kvm: x86: Fix L1TF mitigation for shadow MMU
ALSA: pcm: disallow linking stream to itself
crypto: cavium/nitrox - Fix 'nitrox_get_first_device()' when ndevlist is fully iterated
spi: bcm-qspi: when tx/rx buffer is NULL set to 0
spi: bcm2835aux: Fix controller unregister order
nilfs2: fix null pointer dereference at nilfs_segctor_do_construct()
cgroup, blkcg: Prepare some symbols for module and !CONFIG_CGROUP usages
ACPI: PM: Avoid using power resources if there are none for D0
ACPI: GED: add support for _Exx / _Lxx handler methods
ACPI: CPPC: Fix reference count leak in acpi_cppc_processor_probe()
ACPI: sysfs: Fix reference count leak in acpi_sysfs_add_hotplug_profile()
ALSA: usb-audio: Fix inconsistent card PM state after resume
ALSA: hda/realtek - add a pintbl quirk for several Lenovo machines
ALSA: es1688: Add the missed snd_card_free()
efi/efivars: Add missing kobject_put() in sysfs entry creation error path
x86/reboot/quirks: Add MacBook6,1 reboot quirk
x86/speculation: Prevent rogue cross-process SSBD shutdown
x86/PCI: Mark Intel C620 MROMs as having non-compliant BARs
x86_64: Fix jiffies ODR violation
mm: add kvfree_sensitive() for freeing sensitive data objects
perf probe: Accept the instance number of kretprobe event
ath9k_htc: Silence undersized packet warnings
powerpc/xive: Clear the page tables for the ESB IO mapping
drivers/net/ibmvnic: Update VNIC protocol version reporting
Input: synaptics - add a second working PNP_ID for Lenovo T470s
sched/fair: Don't NUMA balance for kthreads
ARM: 8977/1: ptrace: Fix mask for thumb breakpoint hook
crypto: talitos - fix ECB and CBC algs ivsize
serial: imx: Fix handling of TC irq in combination with DMA
lib: Reduce user_access_begin() boundaries in strncpy_from_user() and strnlen_user()
x86: uaccess: Inhibit speculation past access_ok() in user_access_begin()
arch/openrisc: Fix issues with access_ok()
Fix 'acccess_ok()' on alpha and SH
make 'user_access_begin()' do 'access_ok()'
vxlan: Avoid infinite loop when suppressing NS messages with invalid options
ipv6: fix IPV6_ADDRFORM operation logic
writeback: Drop I_DIRTY_TIME_EXPIRE
writeback: Fix sync livelock due to b_dirty_time processing
writeback: Avoid skipping inode writeback
writeback: Protect inode->i_io_list with inode->i_lock
Revert "writeback: Avoid skipping inode writeback"
ANDROID: Enable LZ4_RAMDISK
fscrypt: remove stale definition
fs-verity: remove unnecessary extern keywords
fs-verity: fix all kerneldoc warnings
fscrypt: add support for IV_INO_LBLK_32 policies
fscrypt: make test_dummy_encryption use v2 by default
fscrypt: support test_dummy_encryption=v2
fscrypt: add fscrypt_add_test_dummy_key()
linux/parser.h: add include guards
fscrypt: remove unnecessary extern keywords
fscrypt: name all function parameters
fscrypt: fix all kerneldoc warnings
ANDROID: kbuild: merge more sections with LTO
Linux 4.14.184
uprobes: ensure that uprobe->offset and ->ref_ctr_offset are properly aligned
iio: vcnl4000: Fix i2c swapped word reading.
x86/speculation: Add Ivy Bridge to affected list
x86/speculation: Add SRBDS vulnerability and mitigation documentation
x86/speculation: Add Special Register Buffer Data Sampling (SRBDS) mitigation
x86/cpu: Add 'table' argument to cpu_matches()
x86/cpu: Add a steppings field to struct x86_cpu_id
nvmem: qfprom: remove incorrect write support
CDC-ACM: heed quirk also in error handling
staging: rtl8712: Fix IEEE80211_ADDBA_PARAM_BUF_SIZE_MASK
tty: hvc_console, fix crashes on parallel open/close
vt: keyboard: avoid signed integer overflow in k_ascii
usb: musb: Fix runtime PM imbalance on error
usb: musb: start session in resume for host port
USB: serial: option: add Telit LE910C1-EUX compositions
USB: serial: usb_wwan: do not resubmit rx urb on fatal errors
USB: serial: qcserial: add DW5816e QDL support
l2tp: add sk_family checks to l2tp_validate_socket
net: check untrusted gso_size at kernel entry
vsock: fix timeout in vsock_accept()
NFC: st21nfca: add missed kfree_skb() in an error path
net: usb: qmi_wwan: add Telit LE910C1-EUX composition
l2tp: do not use inet_hash()/inet_unhash()
devinet: fix memleak in inetdev_init()
airo: Fix read overflows sending packets
scsi: ufs: Release clock if DMA map fails
mmc: fix compilation of user API
kernel/relay.c: handle alloc_percpu returning NULL in relay_open
p54usb: add AirVasT USB stick device-id
HID: i2c-hid: add Schneider SCL142ALM to descriptor override
HID: sony: Fix for broken buttons on DS3 USB dongles
mm: Fix mremap not considering huge pmd devmap
net: smsc911x: Fix runtime PM imbalance on error
net: ethernet: stmmac: Enable interface clocks on probe for IPQ806x
net/ethernet/freescale: rework quiesce/activate for ucc_geth
net: bmac: Fix read of MAC address from ROM
x86/mmiotrace: Use cpumask_available() for cpumask_var_t variables
i2c: altera: Fix race between xfer_msg and isr thread
ARC: [plat-eznps]: Restrict to CONFIG_ISA_ARCOMPACT
ARC: Fix ICCM & DCCM runtime size checks
pppoe: only process PADT targeted at local interfaces
s390/ftrace: save traced function caller
spi: dw: use "smp_mb()" to avoid sending spi data error
scsi: hisi_sas: Check sas_port before using it
libnvdimm: Fix endian conversion issues
scsi: scsi_devinfo: fixup string compare
ANDROID: Incremental fs: Remove dependency on PKCS7_MESSAGE_PARSER
f2fs: attach IO flags to the missing cases
f2fs: add node_io_flag for bio flags likewise data_io_flag
f2fs: remove unused parameter of f2fs_put_rpages_mapping()
f2fs: handle readonly filesystem in f2fs_ioc_shutdown()
f2fs: avoid utf8_strncasecmp() with unstable name
f2fs: don't return vmalloc() memory from f2fs_kmalloc()
ANDROID: dm-bow: Add block_size option
ANDROID: Incremental fs: Cache successful hash calculations
ANDROID: Incremental fs: Fix four error-path bugs
ANDROID: cuttlefish_defconfig: Disable CMOS RTC driver
f2fs: fix retry logic in f2fs_write_cache_pages()
ANDROID: modules: fix lockprove warning
BACKPORT: arm64: vdso: Explicitly add build-id option
BACKPORT: arm64: vdso: use $(LD) instead of $(CC) to link VDSO
Linux 4.14.183
scsi: zfcp: fix request object use-after-free in send path causing wrong traces
genirq/generic_pending: Do not lose pending affinity update
net: hns: Fixes the missing put_device in positive leg for roce reset
net: hns: fix unsigned comparison to less than zero
KVM: VMX: check for existence of secondary exec controls before accessing
rxrpc: Fix transport sockopts to get IPv4 errors on an IPv6 socket
sc16is7xx: move label 'err_spi' to correct section
mm/vmalloc.c: don't dereference possible NULL pointer in __vunmap()
netfilter: nf_conntrack_pptp: fix compilation warning with W=1 build
bonding: Fix reference count leak in bond_sysfs_slave_add.
qlcnic: fix missing release in qlcnic_83xx_interrupt_test.
esp6: get the right proto for transport mode in esp6_gso_encap
netfilter: nf_conntrack_pptp: prevent buffer overflows in debug code
netfilter: nfnetlink_cthelper: unbreak userspace helper support
netfilter: ipset: Fix subcounter update skip
netfilter: nft_reject_bridge: enable reject with bridge vlan
ip_vti: receive ipip packet by calling ip_tunnel_rcv
vti4: eliminated some duplicate code.
xfrm: fix error in comment
xfrm: fix a NULL-ptr deref in xfrm_local_error
xfrm: fix a warning in xfrm_policy_insert_list
xfrm: call xfrm_output_gso when inner_protocol is set in xfrm_output
xfrm: allow to accept packets with ipv6 NEXTHDR_HOP in xfrm_input
copy_xstate_to_kernel(): don't leave parts of destination uninitialized
x86/dma: Fix max PFN arithmetic overflow on 32 bit systems
mac80211: mesh: fix discovery timer re-arming issue / crash
parisc: Fix kernel panic in mem_init()
iommu: Fix reference count leak in iommu_group_alloc.
include/asm-generic/topology.h: guard cpumask_of_node() macro argument
fs/binfmt_elf.c: allocate initialized memory in fill_thread_core_info()
mm: remove VM_BUG_ON(PageSlab()) from page_mapcount()
libceph: ignore pool overlay and cache logic on redirects
ALSA: hda/realtek - Add new codec supported for ALC287
exec: Always set cap_ambient in cap_bprm_set_creds
ALSA: usb-audio: mixer: volume quirk for ESS Technology Asus USB DAC
ALSA: hwdep: fix a left shifting 1 by 31 UB bug
RDMA/pvrdma: Fix missing pci disable in pvrdma_pci_probe()
mmc: block: Fix use-after-free issue for rpmb
ARM: dts: bcm2835-rpi-zero-w: Fix led polarity
ARM: dts/imx6q-bx50v3: Set display interface clock parents
ARM: dts: imx6q-bx50v3: Add internal switch
IB/qib: Call kobject_put() when kobject_init_and_add() fails
gpio: exar: Fix bad handling for ida_simple_get error path
ARM: uaccess: fix DACR mismatch with nested exceptions
ARM: uaccess: integrate uaccess_save and uaccess_restore
ARM: uaccess: consolidate uaccess asm to asm/uaccess-asm.h
ARM: 8843/1: use unified assembler in headers
Input: synaptics-rmi4 - fix error return code in rmi_driver_probe()
Input: synaptics-rmi4 - really fix attn_data use-after-free
Input: i8042 - add ThinkPad S230u to i8042 reset list
Input: dlink-dir685-touchkeys - fix a typo in driver name
Input: xpad - add custom init packet for Xbox One S controllers
Input: evdev - call input_flush_device() on release(), not flush()
Input: usbtouchscreen - add support for BonXeon TP
samples: bpf: Fix build error
cifs: Fix null pointer check in cifs_read
net: freescale: select CONFIG_FIXED_PHY where needed
usb: gadget: legacy: fix redundant initialization warnings
cachefiles: Fix race between read_waiter and read_copier involving op->to_do
gfs2: move privileged user check to gfs2_quota_lock_check
net: microchip: encx24j600: add missed kthread_stop
gpio: tegra: mask GPIO IRQs during IRQ shutdown
ARM: dts: rockchip: fix pinctrl sub nodename for spi in rk322x.dtsi
arm64: dts: rockchip: swap interrupts interrupt-names rk3399 gpu node
ARM: dts: rockchip: fix phy nodename for rk3228-evb
net/mlx4_core: fix a memory leak bug.
net: sun: fix missing release regions in cas_init_one().
net: qrtr: Fix passing invalid reference to qrtr_local_enqueue()
net/mlx5e: Update netdev txq on completions during closure
sctp: Start shutdown on association restart if in SHUTDOWN-SENT state and socket is closed
r8152: support additional Microsoft Surface Ethernet Adapter variant
net sched: fix reporting the first-time use timestamp
net: revert "net: get rid of an signed integer overflow in ip_idents_reserve()"
net/mlx5: Add command entry handling completion
net: ipip: fix wrong address family in init error path
ax25: fix setsockopt(SO_BINDTODEVICE)
ANDROID: scs: fix recursive spinlock in scs_check_usage
ANDROID: timer: fix timer_setup with CFI
FROMGIT: USB: dummy-hcd: use configurable endpoint naming scheme
UPSTREAM: USB: dummy-hcd: remove unsupported isochronous endpoints
UPSTREAM: usb: raw-gadget: fix null-ptr-deref when reenabling endpoints
UPSTREAM: usb: raw-gadget: documentation updates
UPSTREAM: usb: raw-gadget: support stalling/halting/wedging endpoints
UPSTREAM: usb: raw-gadget: fix gadget endpoint selection
UPSTREAM: usb: raw-gadget: improve uapi headers comments
UPSTREAM: usb: raw-gadget: fix return value of ep read ioctls
UPSTREAM: usb: raw-gadget: fix raw_event_queue_fetch locking
UPSTREAM: usb: raw-gadget: Fix copy_to/from_user() checks
f2fs: fix wrong discard space
f2fs: compress: don't compress any datas after cp stop
f2fs: remove unneeded return value of __insert_discard_tree()
f2fs: fix wrong value of tracepoint parameter
f2fs: protect new segment allocation in expand_inode_data
f2fs: code cleanup by removing ifdef macro surrounding
writeback: Avoid skipping inode writeback
ANDROID: net: bpf: permit redirect from ingress L3 to egress L2 devices at near max mtu
Revert "ANDROID: Incremental fs: Avoid continually recalculating hashes"
Linux 4.14.182
iio: adc: stm32-adc: fix device used to request dma
iio: adc: stm32-adc: Use dma_request_chan() instead dma_request_slave_channel()
x86/unwind/orc: Fix unwind_get_return_address_ptr() for inactive tasks
rxrpc: Fix a memory leak in rxkad_verify_response()
rapidio: fix an error in get_user_pages_fast() error handling
mei: release me_cl object reference
iio: dac: vf610: Fix an error handling path in 'vf610_dac_probe()'
iio: sca3000: Remove an erroneous 'get_device()'
staging: greybus: Fix uninitialized scalar variable
staging: iio: ad2s1210: Fix SPI reading
Revert "gfs2: Don't demote a glock until its revokes are written"
cxgb4/cxgb4vf: Fix mac_hlist initialization and free
cxgb4: free mac_hlist properly
media: fdp1: Fix R-Car M3-N naming in debug message
libnvdimm/btt: Fix LBA masking during 'free list' population
libnvdimm/btt: Remove unnecessary code in btt_freelist_init
ubsan: build ubsan.c more conservatively
x86/uaccess, ubsan: Fix UBSAN vs. SMAP
powerpc/64s: Disable STRICT_KERNEL_RWX
powerpc: Remove STRICT_KERNEL_RWX incompatibility with RELOCATABLE
powerpc: restore alphabetic order in Kconfig
dmaengine: tegra210-adma: Fix an error handling path in 'tegra_adma_probe()'
apparmor: Fix aa_label refcnt leak in policy_update
ALSA: pcm: fix incorrect hw_base increase
ALSA: iec1712: Initialize STDSP24 properly when using the model=staudio option
l2tp: initialise PPP sessions before registering them
l2tp: protect sock pointer of struct pppol2tp_session with RCU
l2tp: initialise l2tp_eth sessions before registering them
l2tp: don't register sessions in l2tp_session_create()
arm64: fix the flush_icache_range arguments in machine_kexec
padata: purge get_cpu and reorder_via_wq from padata_do_serial
padata: initialize pd->cpu with effective cpumask
padata: Replace delayed timer with immediate workqueue in padata_reorder
padata: set cpu_index of unused CPUs to -1
ARM: futex: Address build warning
platform/x86: asus-nb-wmi: Do not load on Asus T100TA and T200TA
USB: core: Fix misleading driver bug report
ceph: fix double unlock in handle_cap_export()
gtp: set NLM_F_MULTI flag in gtp_genl_dump_pdp()
x86/apic: Move TSC deadline timer debug printk
scsi: ibmvscsi: Fix WARN_ON during event pool release
component: Silence bind error on -EPROBE_DEFER
vhost/vsock: fix packet delivery order to monitoring devices
configfs: fix config_item refcnt leak in configfs_rmdir()
scsi: qla2xxx: Fix hang when issuing nvme disconnect-all in NPIV
HID: multitouch: add eGalaxTouch P80H84 support
gcc-common.h: Update for GCC 10
ubi: Fix seq_file usage in detailed_erase_block_info debugfs file
i2c: mux: demux-pinctrl: Fix an error handling path in 'i2c_demux_pinctrl_probe()'
iommu/amd: Fix over-read of ACPI UID from IVRS table
fix multiplication overflow in copy_fdtable()
ima: Fix return value of ima_write_policy()
evm: Check also if *tfm is an error pointer in init_desc()
ima: Set file->f_mode instead of file->f_flags in ima_calc_file_hash()
padata: ensure padata_do_serial() runs on the correct CPU
padata: ensure the reorder timer callback runs on the correct CPU
i2c: dev: Fix the race between the release of i2c_dev and cdev
watchdog: Fix the race between the release of watchdog_core_data and cdev
ext4: add cond_resched() to ext4_protect_reserved_inode
ANDROID: scsi: ufs: Handle clocks when lrbp fails
ANDROID: fscrypt: handle direct I/O with IV_INO_LBLK_32
BACKPORT: FROMLIST: fscrypt: add support for IV_INO_LBLK_32 policies
f2fs: avoid inifinite loop to wait for flushing node pages at cp_error
ANDROID: namespace'ify tcp_default_init_rwnd implementation
Linux 4.14.181
Makefile: disallow data races on gcc-10 as well
KVM: x86: Fix off-by-one error in kvm_vcpu_ioctl_x86_setup_mce
ARM: dts: r8a7740: Add missing extal2 to CPG node
ARM: dts: r8a73a4: Add missing CMT1 interrupts
arm64: dts: rockchip: Rename dwc3 device nodes on rk3399 to make dtc happy
arm64: dts: rockchip: Replace RK805 PMIC node name with "pmic" on rk3328 boards
Revert "ALSA: hda/realtek: Fix pop noise on ALC225"
usb: gadget: legacy: fix error return code in cdc_bind()
usb: gadget: legacy: fix error return code in gncm_bind()
usb: gadget: audio: Fix a missing error return value in audio_bind()
usb: gadget: net2272: Fix a memory leak in an error handling path in 'net2272_plat_probe()'
clk: rockchip: fix incorrect configuration of rk3228 aclk_gpu* clocks
exec: Move would_dump into flush_old_exec
x86/unwind/orc: Fix error handling in __unwind_start()
usb: xhci: Fix NULL pointer dereference when enqueuing trbs from urb sg list
USB: gadget: fix illegal array access in binding with UDC
usb: host: xhci-plat: keep runtime active when removing host
usb: core: hub: limit HUB_QUIRK_DISABLE_AUTOSUSPEND to USB5534B
ALSA: usb-audio: Add control message quirk delay for Kingston HyperX headset
x86: Fix early boot crash on gcc-10, third try
ARM: dts: imx27-phytec-phycard-s-rdk: Fix the I2C1 pinctrl entries
ARM: dts: dra7: Fix bus_dma_limit for PCIe
ALSA: rawmidi: Fix racy buffer resize under concurrent accesses
ALSA: rawmidi: Initialize allocated buffers
ALSA: hda/realtek - Limit int mic boost for Thinkpad T530
net: tcp: fix rx timestamp behavior for tcp_recvmsg
netprio_cgroup: Fix unlimited memory leak of v2 cgroups
net: ipv4: really enforce backoff for redirects
net: dsa: loop: Add module soft dependency
hinic: fix a bug of ndo_stop
Revert "ipv6: add mtu lock check in __ip6_rt_update_pmtu"
net: phy: fix aneg restart in phy_ethtool_set_eee
netlabel: cope with NULL catmap
net: fix a potential recursive NETDEV_FEAT_CHANGE
net: phy: micrel: Use strlcpy() for ethtool::get_strings
x86/asm: Add instruction suffixes to bitops
gcc-10: avoid shadowing standard library 'free()' in crypto
gcc-10: disable 'restrict' warning for now
gcc-10: disable 'stringop-overflow' warning for now
gcc-10: disable 'array-bounds' warning for now
gcc-10: disable 'zero-length-bounds' warning for now
Stop the ad-hoc games with -Wno-maybe-initialized
kbuild: compute false-positive -Wmaybe-uninitialized cases in Kconfig
gcc-10 warnings: fix low-hanging fruit
pnp: Use list_for_each_entry() instead of open coding
hwmon: (da9052) Synchronize access with mfd
IB/mlx4: Test return value of calls to ib_get_cached_pkey
netfilter: conntrack: avoid gcc-10 zero-length-bounds warning
i40iw: Fix error handling in i40iw_manage_arp_cache()
pinctrl: cherryview: Add missing spinlock usage in chv_gpio_irq_handler
pinctrl: baytrail: Enable pin configuration setting for GPIO chip
ipmi: Fix NULL pointer dereference in ssif_probe
x86/entry/64: Fix unwind hints in register clearing code
ALSA: hda/realtek - Fix S3 pop noise on Dell Wyse
ipc/util.c: sysvipc_find_ipc() incorrectly updates position index
drm/qxl: lost qxl_bo_kunmap_atomic_page in qxl_image_init_helper()
ALSA: hda/hdmi: fix race in monitor detection during probe
cpufreq: intel_pstate: Only mention the BIOS disabling turbo mode once
dmaengine: mmp_tdma: Reset channel error on release
dmaengine: pch_dma.c: Avoid data race between probe and irq handler
scsi: sg: add sg_remove_request in sg_write
virtio-blk: handle block_device_operations callbacks after hot unplug
drop_monitor: work around gcc-10 stringop-overflow warning
net: moxa: Fix a potential double 'free_irq()'
net/sonic: Fix a resource leak in an error handling path in 'jazz_sonic_probe()'
shmem: fix possible deadlocks on shmlock_user_lock
net: stmmac: Use mutex instead of spinlock
f2fs: fix to avoid memory leakage in f2fs_listxattr
f2fs: fix to avoid accessing xattr across the boundary
f2fs: sanity check of xattr entry size
f2fs: introduce read_xattr_block
f2fs: introduce read_inline_xattr
blktrace: fix dereference after null check
blktrace: Protect q->blk_trace with RCU
blktrace: fix trace mutex deadlock
blktrace: fix unlocked access to init/start-stop/teardown
net: ipv6_stub: use ip6_dst_lookup_flow instead of ip6_dst_lookup
net: ipv6: add net argument to ip6_dst_lookup_flow
scripts/decodecode: fix trapping instruction formatting
objtool: Fix stack offset tracking for indirect CFAs
netfilter: nat: never update the UDP checksum when it's 0
x86/unwind/orc: Fix error path for bad ORC entry type
x86/unwind/orc: Prevent unwinding before ORC initialization
x86/unwind/orc: Don't skip the first frame for inactive tasks
x86/entry/64: Fix unwind hints in rewind_stack_do_exit()
x86/entry/64: Fix unwind hints in kernel exit path
batman-adv: Fix refcnt leak in batadv_v_ogm_process
batman-adv: Fix refcnt leak in batadv_store_throughput_override
batman-adv: Fix refcnt leak in batadv_show_throughput_override
batman-adv: fix batadv_nc_random_weight_tq
coredump: fix crash when umh is disabled
mm/page_alloc: fix watchdog soft lockups during set_zone_contiguous()
KVM: arm: vgic: Fix limit condition when writing to GICD_I[CS]ACTIVER
tracing: Add a vmalloc_sync_mappings() for safe measure
USB: serial: garmin_gps: add sanity checking for data length
USB: uas: add quirk for LaCie 2Big Quadra
HID: usbhid: Fix race between usbhid_close() and usbhid_stop()
geneve: only configure or fill UDP_ZERO_CSUM6_RX/TX info when CONFIG_IPV6
HID: wacom: Read HID_DG_CONTACTMAX directly for non-generic devices
ipv6: fix cleanup ordering for ip6_mr failure
net: stricter validation of untrusted gso packets
bnxt_en: Fix VF anti-spoof filter setup.
bnxt_en: Improve AER slot reset.
net/mlx5: Fix command entry leak in Internal Error State
net/mlx5: Fix forced completion access non initialized command entry
bnxt_en: Fix VLAN acceleration handling in bnxt_fix_features().
sch_sfq: validate silly quantum values
sch_choke: avoid potential panic in choke_reset()
net: usb: qmi_wwan: add support for DW5816e
net/mlx4_core: Fix use of ENOSPC around mlx4_counter_alloc()
net: macsec: preserve ingress frame ordering
fq_codel: fix TCA_FQ_CODEL_DROP_BATCH_SIZE sanity checks
dp83640: reverse arguments to list_add_tail
USB: serial: qcserial: Add DW5816e support
f2fs: compress: fix zstd data corruption
f2fs: add compressed/gc data read IO stat
f2fs: fix potential use-after-free issue
f2fs: compress: don't handle non-compressed data in workqueue
f2fs: remove redundant assignment to variable err
f2fs: refactor resize_fs to avoid meta updates in progress
f2fs: use round_up to enhance calculation
f2fs: introduce F2FS_IOC_RESERVE_COMPRESS_BLOCKS
f2fs: Avoid double lock for cp_rwsem during checkpoint
f2fs: report delalloc reserve as non-free in statfs for project quota
f2fs: Fix wrong stub helper update_sit_info
f2fs: compress: let lz4 compressor handle output buffer budget properly
f2fs: remove blk_plugging in block_operations
f2fs: introduce F2FS_IOC_RELEASE_COMPRESS_BLOCKS
f2fs: shrink spinlock coverage
f2fs: correctly fix the parent inode number during fsync()
f2fs: introduce mempool for {,de}compress intermediate page allocation
f2fs: introduce f2fs_bmap_compress()
f2fs: support fiemap on compressed inode
f2fs: support partial truncation on compressed inode
f2fs: remove redundant compress inode check
f2fs: flush dirty meta pages when flushing them
f2fs: use strcmp() in parse_options()
f2fs: fix checkpoint=disable:%u%%
f2fs: Use the correct style for SPDX License Identifier
f2fs: rework filename handling
f2fs: split f2fs_d_compare() from f2fs_match_name()
f2fs: don't leak filename in f2fs_try_convert_inline_dir()
ANDROID: clang: update to 11.0.1
FROMLIST: x86_64: fix jiffies ODR violation
ANDROID: cuttlefish_defconfig: Enable net testing options
ANDROID: Incremental fs: wake up log pollers less often
ANDROID: Incremental fs: Fix scheduling while atomic error
ANDROID: Incremental fs: Avoid continually recalculating hashes
Revert "f2fs: refactor resize_fs to avoid meta updates in progress"
UPSTREAM: HID: steam: Fix input device disappearing
ANDROID: fscrypt: set dun_bytes more precisely
ANDROID: dm-default-key: set dun_bytes more precisely
ANDROID: block: backport the ability to specify max_dun_bytes
ANDROID: hid: steam: remove BT controller matching
ANDROID: dm-default-key: Update key size for wrapped keys
ANDROID: cuttlefish_defconfig: Enable CONFIG_STATIC_USERMODEHELPER
ANDROID: cuttlefish_defconfig: enable CONFIG_MMC_CRYPTO
ANDROID: Add padding for crypto related structs in UFS and MMC
ANDROID: mmc: MMC crypto API
f2fs: fix missing check for f2fs_unlock_op
f2fs: refactor resize_fs to avoid meta updates in progress
Conflicts:
Documentation/devicetree/bindings/usb/dwc3.txt
drivers/block/virtio_blk.c
drivers/mmc/core/Kconfig
drivers/mmc/core/block.c
drivers/mmc/host/sdhci-msm.c
drivers/net/ethernet/stmicro/stmmac/stmmac.h
drivers/net/ethernet/stmicro/stmmac/stmmac_ethtool.c
drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
drivers/scsi/ufs/ufs-qcom.c
drivers/usb/gadget/composite.c
drivers/usb/gadget/function/f_uac1_legacy.c
fs/crypto/crypto.c
fs/crypto/inline_crypt.c
fs/crypto/keyring.c
fs/f2fs/checkpoint.c
include/linux/fs.h
include/linux/mmc/host.h
include/linux/mod_devicetable.h
include/uapi/linux/input-event-codes.h
net/qrtr/qrtr.c
sound/core/compress_offload.c
sound/core/rawmidi.c
Fixed build errors:
drivers/scsi/ufs/ufshcd.c
Change-Id: I2add911b58d3c87b666ffa0fe46cbceb6cc56430
Signed-off-by: Srinivasarao P <spathi@codeaurora.org>
4 years ago
|
|
|
qrtr_local_enqueue(NULL, skb, type, from, to, flags);
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int qrtr_sendmsg(struct socket *sock, struct msghdr *msg, size_t len)
|
|
|
|
{
|
|
|
|
DECLARE_SOCKADDR(struct sockaddr_qrtr *, addr, msg->msg_name);
|
|
|
|
int (*enqueue_fn)(struct qrtr_node *, struct sk_buff *, int,
|
|
|
|
struct sockaddr_qrtr *, struct sockaddr_qrtr *,
|
|
|
|
unsigned int);
|
|
|
|
struct qrtr_sock *ipc = qrtr_sk(sock->sk);
|
|
|
|
struct sock *sk = sock->sk;
|
|
|
|
struct qrtr_ctrl_pkt pkt;
|
|
|
|
struct qrtr_node *node;
|
|
|
|
struct qrtr_node *srv_node;
|
|
|
|
struct sk_buff *skb;
|
|
|
|
size_t plen;
|
|
|
|
u32 type = QRTR_TYPE_DATA;
|
|
|
|
int rc;
|
|
|
|
|
|
|
|
if (msg->msg_flags & ~(MSG_DONTWAIT))
|
|
|
|
return -EINVAL;
|
|
|
|
|
|
|
|
if (len > 65535)
|
|
|
|
return -EMSGSIZE;
|
|
|
|
|
|
|
|
lock_sock(sk);
|
|
|
|
|
|
|
|
if (addr) {
|
|
|
|
if (msg->msg_namelen < sizeof(*addr)) {
|
|
|
|
release_sock(sk);
|
|
|
|
return -EINVAL;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (addr->sq_family != AF_QIPCRTR) {
|
|
|
|
release_sock(sk);
|
|
|
|
return -EINVAL;
|
|
|
|
}
|
|
|
|
|
|
|
|
rc = qrtr_autobind(sock);
|
|
|
|
if (rc) {
|
|
|
|
release_sock(sk);
|
|
|
|
return rc;
|
|
|
|
}
|
|
|
|
} else if (sk->sk_state == TCP_ESTABLISHED) {
|
|
|
|
addr = &ipc->peer;
|
|
|
|
} else {
|
|
|
|
release_sock(sk);
|
|
|
|
return -ENOTCONN;
|
|
|
|
}
|
|
|
|
|
|
|
|
node = NULL;
|
|
|
|
srv_node = NULL;
|
|
|
|
if (addr->sq_node == QRTR_NODE_BCAST) {
|
|
|
|
if (addr->sq_port != QRTR_PORT_CTRL &&
|
|
|
|
qrtr_local_nid != QRTR_NODE_BCAST) {
|
|
|
|
release_sock(sk);
|
|
|
|
return -ENOTCONN;
|
|
|
|
}
|
|
|
|
enqueue_fn = qrtr_bcast_enqueue;
|
|
|
|
} else if (addr->sq_node == ipc->us.sq_node) {
|
|
|
|
enqueue_fn = qrtr_local_enqueue;
|
|
|
|
} else {
|
|
|
|
node = qrtr_node_lookup(addr->sq_node);
|
|
|
|
if (!node) {
|
|
|
|
release_sock(sk);
|
|
|
|
return -ECONNRESET;
|
|
|
|
}
|
|
|
|
enqueue_fn = qrtr_node_enqueue;
|
|
|
|
|
|
|
|
if (ipc->state > QRTR_STATE_INIT && ipc->state != node->nid)
|
|
|
|
ipc->state = QRTR_STATE_MULTI;
|
|
|
|
else if (ipc->state == QRTR_STATE_INIT)
|
|
|
|
ipc->state = node->nid;
|
|
|
|
}
|
|
|
|
|
|
|
|
plen = (len + 3) & ~3;
|
|
|
|
skb = sock_alloc_send_skb(sk, plen + QRTR_HDR_MAX_SIZE,
|
|
|
|
msg->msg_flags & MSG_DONTWAIT, &rc);
|
|
|
|
if (!skb)
|
|
|
|
goto out_node;
|
|
|
|
|
|
|
|
skb_reserve(skb, QRTR_HDR_MAX_SIZE);
|
|
|
|
|
|
|
|
rc = memcpy_from_msg(skb_put(skb, len), msg, len);
|
|
|
|
if (rc) {
|
|
|
|
kfree_skb(skb);
|
|
|
|
goto out_node;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (ipc->us.sq_port == QRTR_PORT_CTRL ||
|
|
|
|
addr->sq_port == QRTR_PORT_CTRL) {
|
|
|
|
if (len < 4) {
|
|
|
|
rc = -EINVAL;
|
|
|
|
kfree_skb(skb);
|
|
|
|
goto out_node;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* control messages already require the type as 'command' */
|
|
|
|
skb_copy_bits(skb, 0, &type, 4);
|
|
|
|
type = le32_to_cpu(type);
|
|
|
|
}
|
|
|
|
if (addr->sq_port == QRTR_PORT_CTRL && type == QRTR_TYPE_NEW_SERVER) {
|
|
|
|
ipc->state = QRTR_STATE_MULTI;
|
|
|
|
|
|
|
|
/* drop new server cmds that are not forwardable to dst node*/
|
|
|
|
skb_copy_bits(skb, 0, &pkt, sizeof(pkt));
|
|
|
|
srv_node = qrtr_node_lookup(le32_to_cpu(pkt.server.node));
|
|
|
|
if (!qrtr_must_forward(srv_node, node, type)) {
|
|
|
|
rc = 0;
|
|
|
|
kfree_skb(skb);
|
|
|
|
qrtr_node_release(srv_node);
|
|
|
|
goto out_node;
|
|
|
|
}
|
|
|
|
qrtr_node_release(srv_node);
|
|
|
|
}
|
|
|
|
|
|
|
|
rc = enqueue_fn(node, skb, type, &ipc->us, addr, msg->msg_flags);
|
|
|
|
if (rc >= 0)
|
|
|
|
rc = len;
|
|
|
|
|
|
|
|
out_node:
|
|
|
|
qrtr_node_release(node);
|
|
|
|
release_sock(sk);
|
|
|
|
|
|
|
|
return rc;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int qrtr_resume_tx(struct qrtr_cb *cb)
|
|
|
|
{
|
|
|
|
struct sockaddr_qrtr remote = { AF_QIPCRTR,
|
|
|
|
cb->src_node, cb->src_port };
|
|
|
|
struct sockaddr_qrtr local = { AF_QIPCRTR, cb->dst_node, cb->dst_port };
|
|
|
|
struct qrtr_ctrl_pkt *pkt;
|
|
|
|
struct qrtr_node *node;
|
|
|
|
struct sk_buff *skb;
|
|
|
|
int ret;
|
|
|
|
|
|
|
|
node = qrtr_node_lookup(remote.sq_node);
|
|
|
|
if (!node)
|
|
|
|
return -EINVAL;
|
|
|
|
|
|
|
|
skb = qrtr_alloc_ctrl_packet(&pkt);
|
|
|
|
if (!skb)
|
|
|
|
return -ENOMEM;
|
|
|
|
|
|
|
|
pkt->cmd = cpu_to_le32(QRTR_TYPE_RESUME_TX);
|
|
|
|
pkt->client.node = cpu_to_le32(cb->dst_node);
|
|
|
|
pkt->client.port = cpu_to_le32(cb->dst_port);
|
|
|
|
|
|
|
|
ret = qrtr_node_enqueue(node, skb, QRTR_TYPE_RESUME_TX,
|
|
|
|
&local, &remote, 0);
|
|
|
|
|
|
|
|
qrtr_node_release(node);
|
|
|
|
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int qrtr_recvmsg(struct socket *sock, struct msghdr *msg,
|
|
|
|
size_t size, int flags)
|
|
|
|
{
|
|
|
|
DECLARE_SOCKADDR(struct sockaddr_qrtr *, addr, msg->msg_name);
|
|
|
|
struct sock *sk = sock->sk;
|
|
|
|
struct sk_buff *skb;
|
|
|
|
struct qrtr_cb *cb;
|
|
|
|
int copied, rc;
|
|
|
|
|
|
|
|
lock_sock(sk);
|
|
|
|
|
|
|
|
if (sock_flag(sk, SOCK_ZAPPED)) {
|
|
|
|
release_sock(sk);
|
|
|
|
return -EADDRNOTAVAIL;
|
|
|
|
}
|
|
|
|
|
|
|
|
skb = skb_recv_datagram(sk, flags & ~MSG_DONTWAIT,
|
|
|
|
flags & MSG_DONTWAIT, &rc);
|
|
|
|
if (!skb) {
|
|
|
|
release_sock(sk);
|
|
|
|
return rc;
|
|
|
|
}
|
|
|
|
cb = (struct qrtr_cb *)skb->cb;
|
|
|
|
|
|
|
|
copied = skb->len;
|
|
|
|
if (copied > size) {
|
|
|
|
copied = size;
|
|
|
|
msg->msg_flags |= MSG_TRUNC;
|
|
|
|
}
|
|
|
|
|
|
|
|
rc = skb_copy_datagram_msg(skb, 0, msg, copied);
|
|
|
|
if (rc < 0)
|
|
|
|
goto out;
|
|
|
|
rc = copied;
|
|
|
|
|
|
|
|
if (addr) {
|
|
|
|
/* There is an anonymous 2-byte hole after sq_family,
|
|
|
|
* make sure to clear it.
|
|
|
|
*/
|
|
|
|
memset(addr, 0, sizeof(*addr));
|
|
|
|
|
|
|
|
addr->sq_family = AF_QIPCRTR;
|
|
|
|
addr->sq_node = cb->src_node;
|
|
|
|
addr->sq_port = cb->src_port;
|
|
|
|
msg->msg_namelen = sizeof(*addr);
|
|
|
|
}
|
|
|
|
|
|
|
|
out:
|
|
|
|
if (cb->confirm_rx)
|
|
|
|
qrtr_resume_tx(cb);
|
|
|
|
|
|
|
|
skb_free_datagram(sk, skb);
|
|
|
|
release_sock(sk);
|
|
|
|
|
|
|
|
return rc;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int qrtr_connect(struct socket *sock, struct sockaddr *saddr,
|
|
|
|
int len, int flags)
|
|
|
|
{
|
|
|
|
DECLARE_SOCKADDR(struct sockaddr_qrtr *, addr, saddr);
|
|
|
|
struct qrtr_sock *ipc = qrtr_sk(sock->sk);
|
|
|
|
struct sock *sk = sock->sk;
|
|
|
|
int rc;
|
|
|
|
|
|
|
|
if (len < sizeof(*addr) || addr->sq_family != AF_QIPCRTR)
|
|
|
|
return -EINVAL;
|
|
|
|
|
|
|
|
lock_sock(sk);
|
|
|
|
|
|
|
|
sk->sk_state = TCP_CLOSE;
|
|
|
|
sock->state = SS_UNCONNECTED;
|
|
|
|
|
|
|
|
rc = qrtr_autobind(sock);
|
|
|
|
if (rc) {
|
|
|
|
release_sock(sk);
|
|
|
|
return rc;
|
|
|
|
}
|
|
|
|
|
|
|
|
ipc->peer = *addr;
|
|
|
|
sock->state = SS_CONNECTED;
|
|
|
|
sk->sk_state = TCP_ESTABLISHED;
|
|
|
|
|
|
|
|
release_sock(sk);
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int qrtr_getname(struct socket *sock, struct sockaddr *saddr,
|
|
|
|
int *len, int peer)
|
|
|
|
{
|
|
|
|
struct qrtr_sock *ipc = qrtr_sk(sock->sk);
|
|
|
|
struct sockaddr_qrtr qaddr;
|
|
|
|
struct sock *sk = sock->sk;
|
|
|
|
|
|
|
|
lock_sock(sk);
|
|
|
|
if (peer) {
|
|
|
|
if (sk->sk_state != TCP_ESTABLISHED) {
|
|
|
|
release_sock(sk);
|
|
|
|
return -ENOTCONN;
|
|
|
|
}
|
|
|
|
|
|
|
|
qaddr = ipc->peer;
|
|
|
|
} else {
|
|
|
|
qaddr = ipc->us;
|
|
|
|
}
|
|
|
|
release_sock(sk);
|
|
|
|
|
|
|
|
*len = sizeof(qaddr);
|
|
|
|
qaddr.sq_family = AF_QIPCRTR;
|
|
|
|
|
|
|
|
memcpy(saddr, &qaddr, sizeof(qaddr));
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int qrtr_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
|
|
|
|
{
|
|
|
|
void __user *argp = (void __user *)arg;
|
|
|
|
struct qrtr_sock *ipc = qrtr_sk(sock->sk);
|
|
|
|
struct sock *sk = sock->sk;
|
|
|
|
struct sockaddr_qrtr *sq;
|
|
|
|
struct sk_buff *skb;
|
|
|
|
struct ifreq ifr;
|
|
|
|
long len = 0;
|
|
|
|
int rc = 0;
|
|
|
|
|
|
|
|
struct msm_ipc_subsys_request subsys_req;
|
|
|
|
|
|
|
|
lock_sock(sk);
|
|
|
|
|
|
|
|
switch (cmd) {
|
|
|
|
case TIOCOUTQ:
|
|
|
|
len = sk->sk_sndbuf - sk_wmem_alloc_get(sk);
|
|
|
|
if (len < 0)
|
|
|
|
len = 0;
|
|
|
|
rc = put_user(len, (int __user *)argp);
|
|
|
|
break;
|
|
|
|
case TIOCINQ:
|
|
|
|
skb = skb_peek(&sk->sk_receive_queue);
|
|
|
|
if (skb)
|
|
|
|
len = skb->len;
|
|
|
|
rc = put_user(len, (int __user *)argp);
|
|
|
|
break;
|
|
|
|
case SIOCGIFADDR:
|
|
|
|
if (copy_from_user(&ifr, argp, sizeof(ifr))) {
|
|
|
|
rc = -EFAULT;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
sq = (struct sockaddr_qrtr *)&ifr.ifr_addr;
|
|
|
|
*sq = ipc->us;
|
|
|
|
if (copy_to_user(argp, &ifr, sizeof(ifr))) {
|
|
|
|
rc = -EFAULT;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case SIOCGSTAMP:
|
|
|
|
rc = sock_get_timestamp(sk, argp);
|
|
|
|
break;
|
|
|
|
case SIOCADDRT:
|
|
|
|
case SIOCDELRT:
|
|
|
|
case SIOCSIFADDR:
|
|
|
|
case SIOCGIFDSTADDR:
|
|
|
|
case SIOCSIFDSTADDR:
|
|
|
|
case SIOCGIFBRDADDR:
|
|
|
|
case SIOCSIFBRDADDR:
|
|
|
|
case SIOCGIFNETMASK:
|
|
|
|
case SIOCSIFNETMASK:
|
|
|
|
rc = -EINVAL;
|
|
|
|
break;
|
|
|
|
case IPC_SUB_IOCTL_SUBSYS_GET_RESTART:
|
|
|
|
rc = copy_from_user(&subsys_req, (void *)arg, sizeof(subsys_req));
|
|
|
|
if (rc) {
|
|
|
|
rc = -EFAULT;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (subsys_req.request_id == SUBSYS_RES_REQ)
|
|
|
|
subsys_force_stop((const char *)(subsys_req.name), true);
|
|
|
|
else if (subsys_req.request_id == SUBSYS_CR_REQ)
|
|
|
|
subsys_force_stop((const char *)(subsys_req.name), false);
|
|
|
|
else
|
|
|
|
rc = -EINVAL;
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
rc = -ENOIOCTLCMD;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
release_sock(sk);
|
|
|
|
|
|
|
|
return rc;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int qrtr_release(struct socket *sock)
|
|
|
|
{
|
|
|
|
struct sock *sk = sock->sk;
|
|
|
|
struct qrtr_sock *ipc;
|
|
|
|
|
|
|
|
if (!sk)
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
lock_sock(sk);
|
|
|
|
|
|
|
|
ipc = qrtr_sk(sk);
|
|
|
|
sk->sk_shutdown = SHUTDOWN_MASK;
|
|
|
|
if (!sock_flag(sk, SOCK_DEAD))
|
|
|
|
sk->sk_state_change(sk);
|
|
|
|
|
|
|
|
sock_orphan(sk);
|
|
|
|
sock->sk = NULL;
|
|
|
|
|
|
|
|
if (!sock_flag(sk, SOCK_ZAPPED))
|
|
|
|
qrtr_port_remove(ipc);
|
|
|
|
|
|
|
|
skb_queue_purge(&sk->sk_receive_queue);
|
|
|
|
|
|
|
|
release_sock(sk);
|
|
|
|
sock_put(sk);
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
static const struct proto_ops qrtr_proto_ops = {
|
|
|
|
.owner = THIS_MODULE,
|
|
|
|
.family = AF_QIPCRTR,
|
|
|
|
.bind = qrtr_bind,
|
|
|
|
.connect = qrtr_connect,
|
|
|
|
.socketpair = sock_no_socketpair,
|
|
|
|
.accept = sock_no_accept,
|
|
|
|
.listen = sock_no_listen,
|
|
|
|
.sendmsg = qrtr_sendmsg,
|
|
|
|
.recvmsg = qrtr_recvmsg,
|
|
|
|
.getname = qrtr_getname,
|
|
|
|
.ioctl = qrtr_ioctl,
|
|
|
|
.poll = datagram_poll,
|
|
|
|
.shutdown = sock_no_shutdown,
|
|
|
|
.setsockopt = sock_no_setsockopt,
|
|
|
|
.getsockopt = sock_no_getsockopt,
|
|
|
|
.release = qrtr_release,
|
|
|
|
.mmap = sock_no_mmap,
|
|
|
|
.sendpage = sock_no_sendpage,
|
|
|
|
};
|
|
|
|
|
|
|
|
static struct proto qrtr_proto = {
|
|
|
|
.name = "QIPCRTR",
|
|
|
|
.owner = THIS_MODULE,
|
|
|
|
.obj_size = sizeof(struct qrtr_sock),
|
|
|
|
};
|
|
|
|
|
|
|
|
static int qrtr_create(struct net *net, struct socket *sock,
|
|
|
|
int protocol, int kern)
|
|
|
|
{
|
|
|
|
struct qrtr_sock *ipc;
|
|
|
|
struct sock *sk;
|
|
|
|
|
|
|
|
if (sock->type != SOCK_DGRAM)
|
|
|
|
return -EPROTOTYPE;
|
|
|
|
|
|
|
|
sk = sk_alloc(net, AF_QIPCRTR, GFP_KERNEL, &qrtr_proto, kern);
|
|
|
|
if (!sk)
|
|
|
|
return -ENOMEM;
|
|
|
|
|
|
|
|
sock_set_flag(sk, SOCK_ZAPPED);
|
|
|
|
|
|
|
|
sock_init_data(sock, sk);
|
|
|
|
sock->ops = &qrtr_proto_ops;
|
|
|
|
|
|
|
|
ipc = qrtr_sk(sk);
|
|
|
|
ipc->us.sq_family = AF_QIPCRTR;
|
|
|
|
ipc->us.sq_node = qrtr_local_nid;
|
|
|
|
ipc->us.sq_port = 0;
|
|
|
|
ipc->state = QRTR_STATE_INIT;
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
static const struct nla_policy qrtr_policy[IFA_MAX + 1] = {
|
|
|
|
[IFA_LOCAL] = { .type = NLA_U32 },
|
|
|
|
};
|
|
|
|
|
|
|
|
static int qrtr_addr_doit(struct sk_buff *skb, struct nlmsghdr *nlh,
|
|
|
|
struct netlink_ext_ack *extack)
|
|
|
|
{
|
|
|
|
struct nlattr *tb[IFA_MAX + 1];
|
|
|
|
struct ifaddrmsg *ifm;
|
|
|
|
int rc;
|
|
|
|
|
|
|
|
if (!netlink_capable(skb, CAP_NET_ADMIN))
|
|
|
|
return -EPERM;
|
|
|
|
|
|
|
|
ASSERT_RTNL();
|
|
|
|
|
|
|
|
rc = nlmsg_parse(nlh, sizeof(*ifm), tb, IFA_MAX, qrtr_policy, extack);
|
|
|
|
if (rc < 0)
|
|
|
|
return rc;
|
|
|
|
|
|
|
|
ifm = nlmsg_data(nlh);
|
|
|
|
if (!tb[IFA_LOCAL])
|
|
|
|
return -EINVAL;
|
|
|
|
|
|
|
|
qrtr_local_nid = nla_get_u32(tb[IFA_LOCAL]);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
static const struct net_proto_family qrtr_family = {
|
|
|
|
.owner = THIS_MODULE,
|
|
|
|
.family = AF_QIPCRTR,
|
|
|
|
.create = qrtr_create,
|
|
|
|
};
|
|
|
|
|
|
|
|
static int __init qrtr_proto_init(void)
|
|
|
|
{
|
|
|
|
int rc;
|
|
|
|
|
|
|
|
rc = proto_register(&qrtr_proto, 1);
|
|
|
|
if (rc)
|
|
|
|
return rc;
|
|
|
|
|
|
|
|
rc = sock_register(&qrtr_family);
|
|
|
|
if (rc) {
|
|
|
|
proto_unregister(&qrtr_proto);
|
|
|
|
return rc;
|
|
|
|
}
|
|
|
|
|
|
|
|
rtnl_register(PF_QIPCRTR, RTM_NEWADDR, qrtr_addr_doit, NULL, 0);
|
|
|
|
|
|
|
|
qrtr_backup_init();
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
}
|
|
|
|
postcore_initcall(qrtr_proto_init);
|
|
|
|
|
|
|
|
static void __exit qrtr_proto_fini(void)
|
|
|
|
{
|
|
|
|
rtnl_unregister(PF_QIPCRTR, RTM_NEWADDR);
|
|
|
|
sock_unregister(qrtr_family.family);
|
|
|
|
proto_unregister(&qrtr_proto);
|
|
|
|
|
|
|
|
qrtr_backup_deinit();
|
|
|
|
}
|
|
|
|
module_exit(qrtr_proto_fini);
|
|
|
|
|
|
|
|
MODULE_DESCRIPTION("Qualcomm IPC-router driver");
|
|
|
|
MODULE_LICENSE("GPL v2");
|