diff options
| author | Lalit Chandivade <lalit.chandivade@qlogic.com> | 2013-11-22 05:28:18 -0500 |
|---|---|---|
| committer | James Bottomley <JBottomley@Parallels.com> | 2013-12-19 23:56:25 -0500 |
| commit | 6fa7c554386d391d1d0f46bc298e57d2eda76e78 (patch) | |
| tree | 01d32a0e0c5bc5660bc0a48079f42b9c3aec02e1 /drivers/scsi | |
| parent | df86f771578209599acc871a03f02346c8d7885b (diff) | |
[SCSI] scsi_transport_iscsi: Add host statistics support
Add transport_iscsi hooks to get aggregate host statistics.
The statistics include MAC, TCP/IP & iSCSI statistics.
Signed-off-by: Lalit Chandivade <lalit.chandivade@qlogic.com>
Signed-off-by: Vikas Chaudhary <vikas.chaudhary@qlogic.com>
Reviewed-by: Mike Christie <michaelc@cs.wisc.edu>
Signed-off-by: James Bottomley <JBottomley@Parallels.com>
Diffstat (limited to 'drivers/scsi')
| -rw-r--r-- | drivers/scsi/scsi_transport_iscsi.c | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/drivers/scsi/scsi_transport_iscsi.c b/drivers/scsi/scsi_transport_iscsi.c index 9477f84c83a6..4cf918a9fc6f 100644 --- a/drivers/scsi/scsi_transport_iscsi.c +++ b/drivers/scsi/scsi_transport_iscsi.c | |||
| @@ -3416,6 +3416,73 @@ exit_logout_sid: | |||
| 3416 | } | 3416 | } |
| 3417 | 3417 | ||
| 3418 | static int | 3418 | static int |
| 3419 | iscsi_get_host_stats(struct iscsi_transport *transport, struct nlmsghdr *nlh) | ||
| 3420 | { | ||
| 3421 | struct iscsi_uevent *ev = nlmsg_data(nlh); | ||
| 3422 | struct Scsi_Host *shost = NULL; | ||
| 3423 | struct iscsi_internal *priv; | ||
| 3424 | struct sk_buff *skbhost_stats; | ||
| 3425 | struct nlmsghdr *nlhhost_stats; | ||
| 3426 | struct iscsi_uevent *evhost_stats; | ||
| 3427 | int host_stats_size = 0; | ||
| 3428 | int len, err = 0; | ||
| 3429 | char *buf; | ||
| 3430 | |||
| 3431 | if (!transport->get_host_stats) | ||
| 3432 | return -EINVAL; | ||
| 3433 | |||
| 3434 | priv = iscsi_if_transport_lookup(transport); | ||
| 3435 | if (!priv) | ||
| 3436 | return -EINVAL; | ||
| 3437 | |||
| 3438 | host_stats_size = sizeof(struct iscsi_offload_host_stats); | ||
| 3439 | len = nlmsg_total_size(sizeof(*ev) + host_stats_size); | ||
| 3440 | |||
| 3441 | shost = scsi_host_lookup(ev->u.get_host_stats.host_no); | ||
| 3442 | if (!shost) { | ||
| 3443 | pr_err("%s: failed. Cound not find host no %u\n", | ||
| 3444 | __func__, ev->u.get_host_stats.host_no); | ||
| 3445 | return -ENODEV; | ||
| 3446 | } | ||
| 3447 | |||
| 3448 | do { | ||
| 3449 | int actual_size; | ||
| 3450 | |||
| 3451 | skbhost_stats = alloc_skb(len, GFP_KERNEL); | ||
| 3452 | if (!skbhost_stats) { | ||
| 3453 | pr_err("cannot deliver host stats: OOM\n"); | ||
| 3454 | err = -ENOMEM; | ||
| 3455 | goto exit_host_stats; | ||
| 3456 | } | ||
| 3457 | |||
| 3458 | nlhhost_stats = __nlmsg_put(skbhost_stats, 0, 0, 0, | ||
| 3459 | (len - sizeof(*nlhhost_stats)), 0); | ||
| 3460 | evhost_stats = nlmsg_data(nlhhost_stats); | ||
| 3461 | memset(evhost_stats, 0, sizeof(*evhost_stats)); | ||
| 3462 | evhost_stats->transport_handle = iscsi_handle(transport); | ||
| 3463 | evhost_stats->type = nlh->nlmsg_type; | ||
| 3464 | evhost_stats->u.get_host_stats.host_no = | ||
| 3465 | ev->u.get_host_stats.host_no; | ||
| 3466 | buf = (char *)((char *)evhost_stats + sizeof(*evhost_stats)); | ||
| 3467 | memset(buf, 0, host_stats_size); | ||
| 3468 | |||
| 3469 | err = transport->get_host_stats(shost, buf, host_stats_size); | ||
| 3470 | |||
| 3471 | actual_size = nlmsg_total_size(sizeof(*ev) + host_stats_size); | ||
| 3472 | skb_trim(skbhost_stats, NLMSG_ALIGN(actual_size)); | ||
| 3473 | nlhhost_stats->nlmsg_len = actual_size; | ||
| 3474 | |||
| 3475 | err = iscsi_multicast_skb(skbhost_stats, ISCSI_NL_GRP_ISCSID, | ||
| 3476 | GFP_KERNEL); | ||
| 3477 | } while (err < 0 && err != -ECONNREFUSED); | ||
| 3478 | |||
| 3479 | exit_host_stats: | ||
| 3480 | scsi_host_put(shost); | ||
| 3481 | return err; | ||
| 3482 | } | ||
| 3483 | |||
| 3484 | |||
| 3485 | static int | ||
| 3419 | iscsi_if_recv_msg(struct sk_buff *skb, struct nlmsghdr *nlh, uint32_t *group) | 3486 | iscsi_if_recv_msg(struct sk_buff *skb, struct nlmsghdr *nlh, uint32_t *group) |
| 3420 | { | 3487 | { |
| 3421 | int err = 0; | 3488 | int err = 0; |
| @@ -3594,6 +3661,9 @@ iscsi_if_recv_msg(struct sk_buff *skb, struct nlmsghdr *nlh, uint32_t *group) | |||
| 3594 | err = iscsi_set_chap(transport, ev, | 3661 | err = iscsi_set_chap(transport, ev, |
| 3595 | nlmsg_attrlen(nlh, sizeof(*ev))); | 3662 | nlmsg_attrlen(nlh, sizeof(*ev))); |
| 3596 | break; | 3663 | break; |
| 3664 | case ISCSI_UEVENT_GET_HOST_STATS: | ||
| 3665 | err = iscsi_get_host_stats(transport, nlh); | ||
| 3666 | break; | ||
| 3597 | default: | 3667 | default: |
| 3598 | err = -ENOSYS; | 3668 | err = -ENOSYS; |
| 3599 | break; | 3669 | break; |
