mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-30 03:27:44 -04:00
1. Exopsing counters for state changes of channel ring buffers; this is
useful to investigate performance issues. By Kimberly Brown. 2. Switching to the new generic UUID API, by Andy Shevchenko. -----BEGIN PGP SIGNATURE----- iQIzBAABCgAdFiEE4n5dijQDou9mhzu83qZv95d3LNwFAlx5S9AACgkQ3qZv95d3 LNwZ3Q//Z4LbaJf8WQjym1N5/akdhw3q9WL6RDn2o8tqNcaQ5OTpUoiYLjpMdtkr pr7YV3/7K0IJS2AnExQ937e+OJ0FyFeXBIGKbaMgj4Z99k0ZwL90aUobj9/4En4P 9HsKR1nqpYr/cetp9MquO8b8J/kocfU4CJm50RnzxgURgsULmAXY+HsfVMAyPVjJ VLbXxPgcuRPTurUzhi5QvDNYHI3pmKJMK17TmeWxKeamLDBDvkfuFqo/U7c/k+cw H66gY1Nni+PiYGAvS42COtEexpnhGn3xVZKxSpak9ZlP40DotQc1T9TLM45j3T8/ paGv20vI9c4yt9NDnTyEoTTdNBmnzq8+/rGJRv5aIeCeQfD3mL+c48fJrdhduK2l 3253nUfDGRR8KI/rLsLnN80Iey33/YUCy5LuxZy7eRY6xuf9zhzwvP4rKRaWbrqc VbC4kNiwcOYcwqMnkfayDrmtc6M3HEoHAmXvtTzvOI7dntPTf2oDMszTzHzxtAHl A6bEGXxaMTM/3AjvalThZbjEofyJ26HeZVxcDFApdjrJD//3Puo3XRL8iTLP06rN iV6z21NcCjrCP5hmN691Jlg3mhvZsn1SKhPfnnv9IVJ9hc+KheGE2n1bcSYOVpig eaFwn7GQnvYdS9KLZ2vKBhGWNwcJqmoTAk6toC80gdxe4Zeny3A= =hDVS -----END PGP SIGNATURE----- Merge tag 'hyperv-next-signed' of git://git.kernel.org/pub/scm/linux/kernel/git/hyperv/linux into char-misc-next Sasha writes: 1. Exopsing counters for state changes of channel ring buffers; this is useful to investigate performance issues. By Kimberly Brown. 2. Switching to the new generic UUID API, by Andy Shevchenko. * tag 'hyperv-next-signed' of git://git.kernel.org/pub/scm/linux/kernel/git/hyperv/linux: Drivers: hv: vmbus: Expose counters for interrupts and full conditions vmbus: Switch to use new generic UUID API
This commit is contained in:
commit
99f63620b4
7 changed files with 207 additions and 94 deletions
|
|
@ -282,8 +282,8 @@ int vmbus_open(struct vmbus_channel *newchannel,
|
|||
EXPORT_SYMBOL_GPL(vmbus_open);
|
||||
|
||||
/* Used for Hyper-V Socket: a guest client's connect() to the host */
|
||||
int vmbus_send_tl_connect_request(const uuid_le *shv_guest_servie_id,
|
||||
const uuid_le *shv_host_servie_id)
|
||||
int vmbus_send_tl_connect_request(const guid_t *shv_guest_servie_id,
|
||||
const guid_t *shv_host_servie_id)
|
||||
{
|
||||
struct vmbus_channel_tl_connect_request conn_msg;
|
||||
int ret;
|
||||
|
|
|
|||
|
|
@ -141,7 +141,7 @@ static const struct vmbus_device vmbus_devs[] = {
|
|||
};
|
||||
|
||||
static const struct {
|
||||
uuid_le guid;
|
||||
guid_t guid;
|
||||
} vmbus_unsupported_devs[] = {
|
||||
{ HV_AVMA1_GUID },
|
||||
{ HV_AVMA2_GUID },
|
||||
|
|
@ -171,26 +171,26 @@ static void vmbus_rescind_cleanup(struct vmbus_channel *channel)
|
|||
spin_unlock_irqrestore(&vmbus_connection.channelmsg_lock, flags);
|
||||
}
|
||||
|
||||
static bool is_unsupported_vmbus_devs(const uuid_le *guid)
|
||||
static bool is_unsupported_vmbus_devs(const guid_t *guid)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(vmbus_unsupported_devs); i++)
|
||||
if (!uuid_le_cmp(*guid, vmbus_unsupported_devs[i].guid))
|
||||
if (guid_equal(guid, &vmbus_unsupported_devs[i].guid))
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
static u16 hv_get_dev_type(const struct vmbus_channel *channel)
|
||||
{
|
||||
const uuid_le *guid = &channel->offermsg.offer.if_type;
|
||||
const guid_t *guid = &channel->offermsg.offer.if_type;
|
||||
u16 i;
|
||||
|
||||
if (is_hvsock_channel(channel) || is_unsupported_vmbus_devs(guid))
|
||||
return HV_UNKNOWN;
|
||||
|
||||
for (i = HV_IDE; i < HV_UNKNOWN; i++) {
|
||||
if (!uuid_le_cmp(*guid, vmbus_devs[i].guid))
|
||||
if (guid_equal(guid, &vmbus_devs[i].guid))
|
||||
return i;
|
||||
}
|
||||
pr_info("Unknown GUID: %pUl\n", guid);
|
||||
|
|
@ -561,10 +561,10 @@ static void vmbus_process_offer(struct vmbus_channel *newchannel)
|
|||
atomic_dec(&vmbus_connection.offer_in_progress);
|
||||
|
||||
list_for_each_entry(channel, &vmbus_connection.chn_list, listentry) {
|
||||
if (!uuid_le_cmp(channel->offermsg.offer.if_type,
|
||||
newchannel->offermsg.offer.if_type) &&
|
||||
!uuid_le_cmp(channel->offermsg.offer.if_instance,
|
||||
newchannel->offermsg.offer.if_instance)) {
|
||||
if (guid_equal(&channel->offermsg.offer.if_type,
|
||||
&newchannel->offermsg.offer.if_type) &&
|
||||
guid_equal(&channel->offermsg.offer.if_instance,
|
||||
&newchannel->offermsg.offer.if_instance)) {
|
||||
fnew = false;
|
||||
break;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -312,8 +312,8 @@ extern const struct vmbus_channel_message_table_entry
|
|||
|
||||
/* General vmbus interface */
|
||||
|
||||
struct hv_device *vmbus_device_create(const uuid_le *type,
|
||||
const uuid_le *instance,
|
||||
struct hv_device *vmbus_device_create(const guid_t *type,
|
||||
const guid_t *instance,
|
||||
struct vmbus_channel *channel);
|
||||
|
||||
int vmbus_device_register(struct hv_device *child_device_obj);
|
||||
|
|
|
|||
|
|
@ -74,8 +74,10 @@ static void hv_signal_on_write(u32 old_write, struct vmbus_channel *channel)
|
|||
* This is the only case we need to signal when the
|
||||
* ring transitions from being empty to non-empty.
|
||||
*/
|
||||
if (old_write == READ_ONCE(rbi->ring_buffer->read_index))
|
||||
if (old_write == READ_ONCE(rbi->ring_buffer->read_index)) {
|
||||
++channel->intr_out_empty;
|
||||
vmbus_setevent(channel);
|
||||
}
|
||||
}
|
||||
|
||||
/* Get the next write location for the specified ring buffer. */
|
||||
|
|
@ -272,10 +274,19 @@ int hv_ringbuffer_write(struct vmbus_channel *channel,
|
|||
* is empty since the read index == write index.
|
||||
*/
|
||||
if (bytes_avail_towrite <= totalbytes_towrite) {
|
||||
++channel->out_full_total;
|
||||
|
||||
if (!channel->out_full_flag) {
|
||||
++channel->out_full_first;
|
||||
channel->out_full_flag = true;
|
||||
}
|
||||
|
||||
spin_unlock_irqrestore(&outring_info->ring_lock, flags);
|
||||
return -EAGAIN;
|
||||
}
|
||||
|
||||
channel->out_full_flag = false;
|
||||
|
||||
/* Write to the ring buffer */
|
||||
next_write_location = hv_get_next_write_location(outring_info);
|
||||
|
||||
|
|
@ -530,6 +541,7 @@ void hv_pkt_iter_close(struct vmbus_channel *channel)
|
|||
if (curr_write_sz <= pending_sz)
|
||||
return;
|
||||
|
||||
++channel->intr_in_full;
|
||||
vmbus_setevent(channel);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(hv_pkt_iter_close);
|
||||
|
|
|
|||
|
|
@ -654,38 +654,28 @@ static int vmbus_uevent(struct device *device, struct kobj_uevent_env *env)
|
|||
return ret;
|
||||
}
|
||||
|
||||
static const uuid_le null_guid;
|
||||
|
||||
static inline bool is_null_guid(const uuid_le *guid)
|
||||
{
|
||||
if (uuid_le_cmp(*guid, null_guid))
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
static const struct hv_vmbus_device_id *
|
||||
hv_vmbus_dev_match(const struct hv_vmbus_device_id *id, const uuid_le *guid)
|
||||
|
||||
hv_vmbus_dev_match(const struct hv_vmbus_device_id *id, const guid_t *guid)
|
||||
{
|
||||
if (id == NULL)
|
||||
return NULL; /* empty device table */
|
||||
|
||||
for (; !is_null_guid(&id->guid); id++)
|
||||
if (!uuid_le_cmp(id->guid, *guid))
|
||||
for (; !guid_is_null(&id->guid); id++)
|
||||
if (guid_equal(&id->guid, guid))
|
||||
return id;
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static const struct hv_vmbus_device_id *
|
||||
hv_vmbus_dynid_match(struct hv_driver *drv, const uuid_le *guid)
|
||||
hv_vmbus_dynid_match(struct hv_driver *drv, const guid_t *guid)
|
||||
{
|
||||
const struct hv_vmbus_device_id *id = NULL;
|
||||
struct vmbus_dynid *dynid;
|
||||
|
||||
spin_lock(&drv->dynids.lock);
|
||||
list_for_each_entry(dynid, &drv->dynids.list, node) {
|
||||
if (!uuid_le_cmp(dynid->id.guid, *guid)) {
|
||||
if (guid_equal(&dynid->id.guid, guid)) {
|
||||
id = &dynid->id;
|
||||
break;
|
||||
}
|
||||
|
|
@ -695,9 +685,7 @@ hv_vmbus_dynid_match(struct hv_driver *drv, const uuid_le *guid)
|
|||
return id;
|
||||
}
|
||||
|
||||
static const struct hv_vmbus_device_id vmbus_device_null = {
|
||||
.guid = NULL_UUID_LE,
|
||||
};
|
||||
static const struct hv_vmbus_device_id vmbus_device_null;
|
||||
|
||||
/*
|
||||
* Return a matching hv_vmbus_device_id pointer.
|
||||
|
|
@ -706,7 +694,7 @@ static const struct hv_vmbus_device_id vmbus_device_null = {
|
|||
static const struct hv_vmbus_device_id *hv_vmbus_get_id(struct hv_driver *drv,
|
||||
struct hv_device *dev)
|
||||
{
|
||||
const uuid_le *guid = &dev->dev_type;
|
||||
const guid_t *guid = &dev->dev_type;
|
||||
const struct hv_vmbus_device_id *id;
|
||||
|
||||
/* When driver_override is set, only bind to the matching driver */
|
||||
|
|
@ -726,7 +714,7 @@ static const struct hv_vmbus_device_id *hv_vmbus_get_id(struct hv_driver *drv,
|
|||
}
|
||||
|
||||
/* vmbus_add_dynid - add a new device ID to this driver and re-probe devices */
|
||||
static int vmbus_add_dynid(struct hv_driver *drv, uuid_le *guid)
|
||||
static int vmbus_add_dynid(struct hv_driver *drv, guid_t *guid)
|
||||
{
|
||||
struct vmbus_dynid *dynid;
|
||||
|
||||
|
|
@ -764,10 +752,10 @@ static ssize_t new_id_store(struct device_driver *driver, const char *buf,
|
|||
size_t count)
|
||||
{
|
||||
struct hv_driver *drv = drv_to_hv_drv(driver);
|
||||
uuid_le guid;
|
||||
guid_t guid;
|
||||
ssize_t retval;
|
||||
|
||||
retval = uuid_le_to_bin(buf, &guid);
|
||||
retval = guid_parse(buf, &guid);
|
||||
if (retval)
|
||||
return retval;
|
||||
|
||||
|
|
@ -791,10 +779,10 @@ static ssize_t remove_id_store(struct device_driver *driver, const char *buf,
|
|||
{
|
||||
struct hv_driver *drv = drv_to_hv_drv(driver);
|
||||
struct vmbus_dynid *dynid, *n;
|
||||
uuid_le guid;
|
||||
guid_t guid;
|
||||
ssize_t retval;
|
||||
|
||||
retval = uuid_le_to_bin(buf, &guid);
|
||||
retval = guid_parse(buf, &guid);
|
||||
if (retval)
|
||||
return retval;
|
||||
|
||||
|
|
@ -803,7 +791,7 @@ static ssize_t remove_id_store(struct device_driver *driver, const char *buf,
|
|||
list_for_each_entry_safe(dynid, n, &drv->dynids.list, node) {
|
||||
struct hv_vmbus_device_id *id = &dynid->id;
|
||||
|
||||
if (!uuid_le_cmp(id->guid, guid)) {
|
||||
if (guid_equal(&id->guid, &guid)) {
|
||||
list_del(&dynid->node);
|
||||
kfree(dynid);
|
||||
retval = count;
|
||||
|
|
@ -1496,6 +1484,38 @@ static ssize_t channel_events_show(const struct vmbus_channel *channel, char *bu
|
|||
}
|
||||
static VMBUS_CHAN_ATTR(events, S_IRUGO, channel_events_show, NULL);
|
||||
|
||||
static ssize_t channel_intr_in_full_show(const struct vmbus_channel *channel,
|
||||
char *buf)
|
||||
{
|
||||
return sprintf(buf, "%llu\n",
|
||||
(unsigned long long)channel->intr_in_full);
|
||||
}
|
||||
static VMBUS_CHAN_ATTR(intr_in_full, 0444, channel_intr_in_full_show, NULL);
|
||||
|
||||
static ssize_t channel_intr_out_empty_show(const struct vmbus_channel *channel,
|
||||
char *buf)
|
||||
{
|
||||
return sprintf(buf, "%llu\n",
|
||||
(unsigned long long)channel->intr_out_empty);
|
||||
}
|
||||
static VMBUS_CHAN_ATTR(intr_out_empty, 0444, channel_intr_out_empty_show, NULL);
|
||||
|
||||
static ssize_t channel_out_full_first_show(const struct vmbus_channel *channel,
|
||||
char *buf)
|
||||
{
|
||||
return sprintf(buf, "%llu\n",
|
||||
(unsigned long long)channel->out_full_first);
|
||||
}
|
||||
static VMBUS_CHAN_ATTR(out_full_first, 0444, channel_out_full_first_show, NULL);
|
||||
|
||||
static ssize_t channel_out_full_total_show(const struct vmbus_channel *channel,
|
||||
char *buf)
|
||||
{
|
||||
return sprintf(buf, "%llu\n",
|
||||
(unsigned long long)channel->out_full_total);
|
||||
}
|
||||
static VMBUS_CHAN_ATTR(out_full_total, 0444, channel_out_full_total_show, NULL);
|
||||
|
||||
static ssize_t subchannel_monitor_id_show(const struct vmbus_channel *channel,
|
||||
char *buf)
|
||||
{
|
||||
|
|
@ -1521,6 +1541,10 @@ static struct attribute *vmbus_chan_attrs[] = {
|
|||
&chan_attr_latency.attr,
|
||||
&chan_attr_interrupts.attr,
|
||||
&chan_attr_events.attr,
|
||||
&chan_attr_intr_in_full.attr,
|
||||
&chan_attr_intr_out_empty.attr,
|
||||
&chan_attr_out_full_first.attr,
|
||||
&chan_attr_out_full_total.attr,
|
||||
&chan_attr_monitor_id.attr,
|
||||
&chan_attr_subchannel_id.attr,
|
||||
NULL
|
||||
|
|
@ -1556,8 +1580,8 @@ int vmbus_add_channel_kobj(struct hv_device *dev, struct vmbus_channel *channel)
|
|||
* vmbus_device_create - Creates and registers a new child device
|
||||
* on the vmbus.
|
||||
*/
|
||||
struct hv_device *vmbus_device_create(const uuid_le *type,
|
||||
const uuid_le *instance,
|
||||
struct hv_device *vmbus_device_create(const guid_t *type,
|
||||
const guid_t *instance,
|
||||
struct vmbus_channel *channel)
|
||||
{
|
||||
struct hv_device *child_device_obj;
|
||||
|
|
@ -1569,12 +1593,10 @@ struct hv_device *vmbus_device_create(const uuid_le *type,
|
|||
}
|
||||
|
||||
child_device_obj->channel = channel;
|
||||
memcpy(&child_device_obj->dev_type, type, sizeof(uuid_le));
|
||||
memcpy(&child_device_obj->dev_instance, instance,
|
||||
sizeof(uuid_le));
|
||||
guid_copy(&child_device_obj->dev_type, type);
|
||||
guid_copy(&child_device_obj->dev_instance, instance);
|
||||
child_device_obj->vendor_id = 0x1414; /* MSFT vendor ID */
|
||||
|
||||
|
||||
return child_device_obj;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue